2011-03-17 63 views
6

我是一个“自己动手”的家伙,但我想确保我不会因为尝试咬下更多的东西而自责。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。

这里有没有缺陷我不考虑?

回答

1

Mapserver非常易于安装和学习。自己实现任何类型的渲染将需要更多的努力,并且您可能会发现大量意外的陷阱。

mapserver cgi应该足以满足您的需求。如果你需要一些非常特别的调整,那么mapscript会很有用。

我认为如果您可以制作一个纯粹的JavaScript应用程序,并且避免安装Web服务器(和地图服务器),这可能会很有趣。如果你只是需要浏览一个拼图马赛克,可能你可以用JavaScript来做到这一点(为每个拼图生成一个单元格的html表格)。您可以使用JavaScript使用画布渲染点或多边形,并执行一些基本坐标转换以将地理点转换为像素。我认为,Openlayers具有这种功能。

编辑:我刚刚检查,并与Openlayers您可以浏览本地瓷砖,并且您可以呈现kml和一些其他vect数据。所以,我认为你应该给Openlayers一个尝试。

+0

感谢您的支持。现在我确实得到了这个仅用python的解决方案。我最终使用CherryPy作为服务器,因为粘贴似乎遇到了太多的瓦片请求。是的,我可能会在未来尝试Mapserver,但现在我很乐意从python中为自己的瓷砖提供服务,并且目前我需要在这些瓷砖上进行的透支工作量非常小,因此我将手动完成。 – 2011-03-24 13:36:02

+0

感谢您使用纯OpenLayers解决方案的建议,但是我有太多的透支数据来实现这一点,而且我也无法保证本地计算机是服务于这些平铺的计算机。 – 2011-03-24 13:37:01

+0

如果你想使用CGI选项,你可以使用paste.cgiapp来打包。 – 2011-08-03 21:58:59

1

不需要有wms/wfs。你需要的是一个平铺实现。基本上你应该有一些中央服务或桌面服务来生成磁贴。一旦生成这些图块,您可以简单地将它们转换为您的“无实服务器架构”文件系统。您可以创建一个符合/{x}/{y}/{z}.png的目录结构,并从javascript调用它。

的OpenStreetMap的如何做这方面的例子可以在这里找到:http://wiki.openstreetmap.org/wiki/OpenLayers_Simple_Example

+1

是的,你是对的。我能够简单地回应来自OpenLayers的tile/z/y/x消息,而无需响应wms/wfs元数据请求的种类。我使用了OpenLayers.Layer.XYZ图层类型。 – 2011-04-28 04:13:15