我是一个“自己动手”的家伙,但我想确保我不会因为尝试咬下更多的东西而自责。WMS/WFS服务器:我疯狂地写我自己的?
我正在编写一个基于浏览器的映射应用程序,它需要在最终用户的机器上运行独立(无互联网连接)选项。也就是说,应用程序是某种服务器,在许多情况下,它将安装在最终用户的计算机上,浏览器将指向某个本地主机URL来访问它。
我将在客户端使用MapLayers,服务器端将有一堆特定于应用程序的自定义逻辑,例如以某些自定义方式处理地图上的点击事件,在地图上创建各种自定义对象在某些时候,等等。
对于服务器的“业务逻辑”部分,我很高兴在python中使用paste/webob。这是一个简单的基础结构,可以让我轻松地完成所有这些自定义逻辑。
我一直在想客户端会与两台服务器通信:这个粘贴/ webob业务逻辑服务器,以及一个服务于WMS和WFS地图元素的服务器。所以我在寻找MapServer和GeoServer来处理地图部分,并且...我不高兴。
我不高兴,因为我不想安装和担心客户机上的“野兽”。对于MapServer而言,我并不想安装像Apache这样的完整Web服务器,而必须处理CGI,PHP和MapScript。对于GeoServer,可能会安装Java,并处理GeoServer设置和管理的各种复杂性。
这只是一个学习曲线问题。如果我能避免它,我对学习MapServer或GeoServer的复杂性不感兴趣。我安装了GeoServer,将其指向我的一些数据,并且能够使用内置于GeoServer的漂亮网络管理员中的MapLayers预览来查看我的数据。但是当我试图使用指向GeoServer的我自己的MapLayers网页实际提供数据时,我崩溃了GeoServer。我可以使服务器崩溃,只是发送一些推测来自客户端的畸形请求,这让我感到非常惊讶。我可能会挖掘到GeoServer日志,试图找出我做错了什么,但是...我真的不想花很多时间在那。
所以,我正在考虑使用我已有的粘贴/ webob服务器自己实现WMS和WFS接口的一部分。事实上,我可能只需要WMS,因为我可以通过一个简单的自定义协议处理矢量对象,我可以将数据传递给客户端,然后可以使用OpenLayer直接创建和操作对象。
我已经看过WMS的规格和示例消息(在WFS上少一点)。我自己实现这个协议似乎并不那么困难,尤其是因为在这种情况下我完全控制了客户端 - 这不像我需要能够充当通用的WMS或WFS服务器;我只需要让我自己的OpenLayers客户端开心。
我需要的WMS服务器有两个主要的能力是:
从我创建的时间提前预渲染切片的商店即成砖(我会使用预渲染OpenStreetMap的瓷砖数据和mapnik作为重排引擎;并且我将使用OpenLayers期望的普通谷歌地图样式平铺命名方案来存储和访问它们)
有能力服务器修改版本的这些瓷砖,我存储某些数据本地绘制在瓷砖顶部。例如,我可能在一个“图层”上有10000个点,在另一个图层上有10000个多边形,并且当用户激活这些图层时,我将服务于相同的基本图块,但是当我服务这些图块时,这些额外的功能,并可能我会实施一个简单的缓存方案,以保持这些过度渲染的瓷砖一段时间。
所以我的问题是:尽管我知道现在有一些工具,做这些事情(地图服务器,GeoServer的,TileCache,和其他人),实际上,我感觉就像是较少的工作对我来说,只是回应到一些简单的WMS消息,并在python中对我自己的瓷砖进行额外的过度绘制,以确保所有内容都能正确投影等。我不需要为这些覆盖层绘制花哨的宽街道或任何东西,只需简单的线条,图标和可能的标签。它确实听起来很不错,而且只有一个python-only解决方案。
我想,如果我需要扩展到支持更多的WMS/WFS协议,或者做更有趣的透支,那么我可以在那时插入MapServer/GeoServer。
这里有没有缺陷我不考虑?
感谢您的支持。现在我确实得到了这个仅用python的解决方案。我最终使用CherryPy作为服务器,因为粘贴似乎遇到了太多的瓦片请求。是的,我可能会在未来尝试Mapserver,但现在我很乐意从python中为自己的瓷砖提供服务,并且目前我需要在这些瓷砖上进行的透支工作量非常小,因此我将手动完成。 – 2011-03-24 13:36:02
感谢您使用纯OpenLayers解决方案的建议,但是我有太多的透支数据来实现这一点,而且我也无法保证本地计算机是服务于这些平铺的计算机。 – 2011-03-24 13:37:01
如果你想使用CGI选项,你可以使用paste.cgiapp来打包。 – 2011-08-03 21:58:59