WMS/WFS服务器:我自己写是疯了吗?

8
我是一个“自己动手”的人,但我希望确保我不会尝试过多而让自己陷入困境。
我正在编写一个基于浏览器的地图应用程序,需要在最终用户的机器上独立运行(无需互联网连接)。也就是说,该应用程序是某种服务器,在许多情况下会安装在最终用户的机器上,并且浏览器将指向某个本地主机URL以进行访问。
我将在客户端使用MapLayers,而服务器端将具有许多特定于应用程序的自定义逻辑,例如以某些自定义方式处理地图上的单击事件,在某些时候创建各种自定义对象等等。
对于服务器的“业务逻辑”部分,我很高兴使用Python的paste/webob。这是一种简单的基础设施,可以轻松地让我放置所有这些自定义逻辑。
我曾经认为客户端将与两个服务器通信:这个paste/webob业务逻辑服务器和一个仅用于提供WMS和WFS地图元素的服务器。因此,我正在查看MapServer和GeoServer来处理地图部分,但我并不满意。
我不满意的原因是,我不想在客户机器上安装和担心一个“野兽”。对于MapServer,我不想安装像Apache这样的完整的Web服务器,并且必须处理CGI和PHP以及MapScript。对于GeoServer,有(潜在的)安装Java和处理GeoServer设置和管理的各种复杂性。
部分原因是学习曲线问题。如果可以避免,我并不特别感兴趣学习MapServer或GeoServer的复杂性。我安装了GeoServer,将其指向我的一些数据,并能够使用内置在GeoServer中的MapLayers预览来查看我的数据。但是当我尝试使用指向GeoServer的自己的MapLayers网页为实际服务提供数据时,我使GeoServer崩溃了。我能够通过挖掘GeoServer日志来尝试找出我的错误,但是...我不想花费太多时间在此上。
因此,我正在考虑仅使用我已经拥有的paste/webob服务器自己实现WMS和WFS接口的某些部分。事实上,我可能只需要WMS,因为我可能会通过我制作的简单自定义协议处理矢量对象,该协议将数据传递给客户端,客户端可以直接使用OpenLayers创建和操作对象。
我查看了WMS(和较少的WFS)的规范和示例消息。似乎很容易自己实现此协议,特别是因为在这种情况下我完全控制客户端--不像需要能够充当通用WMS或WFS服务器;我只需使自己的OpenLayers客户端满意即可。
我需要WMS服务器具有的两个主要功能是:
  • 使用我提前创建的预渲染瓦片存储来提供瓦片服务(我将使用OpenStreetMap数据和mapnik作为渲染引擎进行预渲染,并且我将使用OpenLayers期望的普通Google Maps样式瓦片命名方案进行存储和访问)

  • 能够提供修改过的瓦片版本,其中某些本地存储的数据会绘制在瓦片上。例如,我可能有一层包含10000个点,另一层包含10000个多边形,当用户激活这些层时,我将提供相同的基础瓦片,但在提供这些瓦片时,我将在其上绘制这些附加功能,并且可能会实现一个简单的缓存方案,以保留这些超渲染瓦片一段时间。

所以我的问题是:尽管我知道存在可以做到这些事情的现有工具(MapServer、GeoServer、TileCache等),但我实际上觉得对于我来说,只需响应一些简单的WMS消息,并在Python中自己处理这些附加绘制,确保所有东西都被正确投影等,比使用这些工具更省事。对于这些覆盖层,我不需要绘制花哨的宽街道或其他什么,只需要简单的线条、图标和标签。使用纯Python解决方案听起来确实很不错。

我想,如果我将来需要扩展支持更多的WMS/WFS协议,或者进行更高级的覆盖绘制,我可以在那时插入MapServer/GeoServer。

这里有没有我没有考虑到的缺陷?

3个回答

2

Mapserver非常容易设置和学习。如果你想要自己实现任何类型的渲染,那么需要更多的努力,并且可能会遇到很多意想不到的陷阱。

对于您的需求,mapserver cgi应该已经足够了。如果您需要一些非常特定的调整,则mapscript可能会有用。

我认为,如果您可以制作一个纯JavaScript应用程序,那将非常有趣,并且可以省去安装Web服务器(和地图服务器)的麻烦。如果您只需要浏览瓷砖拼贴,也许您可以仅使用JavaScript(生成一个带有每个瓷砖单元格的HTML表格)。您可以使用canvas并进行一些基本的坐标转换来将地理点转换为像素,在JavaScript中渲染点或多边形。我认为Openlayers具有此功能。

编辑:我刚刚检查了一下,使用Openlayers,您可以浏览本地瓷砖,并且可以呈现kml和其他一些矢量数据。因此,我认为您应该尝试使用Openlayers。


谢谢。目前我已经成功使用纯Python解决方案。我最终选择了CherryPy作为服务器,因为Paste似乎无法处理同时发出的太多瓦片请求。是的,将来我可能会尝试Mapserver,但目前我很高兴能够从Python中自己提供瓦片,并且我需要在这些瓦片上进行的超绘制工作目前相当少,所以我打算手动完成它。 - M Katz
感谢您建议使用纯OpenLayers解决方案,但是我有太多的过度绘制数据使其不切实际,并且我不能保证本地机器始终提供瓦片。 - M Katz
如果您想使用CGI选项,可以使用paste.cgiapp进行包装。 - Ian Bicking

2
不需要使用wms/wfs,你需要的是瓦片实现。基本上你应该有一些中央服务或桌面服务来生成这些瓦片。一旦这些瓦片被生成,你可以简单地将它们转换到你的“无真实Web服务器架构”的文件系统中。你可以创建一个符合/{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图层类型。 - M Katz

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接