7

我是一个“自己动手”的人,但我想确保我不会因为试图咬掉的东西超过我能咀嚼的东西而自取其辱。

我正在编写一个基于浏览器的地图应用程序,该应用程序需要选择在最终用户的机器上独立运行(无互联网连接)。也就是说,应用程序是某种服务器,在许多情况下,它会安装在最终用户的机器上,并且浏览器将指向某个 localhost URL 来访问它。

我将在客户端使用 MapLayers,而服务器端将有一堆特定于应用程序的自定义逻辑,例如以某些自定义方式处理地图上的点击事件,在特定时间在地图上创建各种自定义对象,等等。

对于服务器的“业务逻辑”部分,我很高兴将 paste/webob 与 python 一起使用。这是一个简单的基础架构,让我可以轻松地放入所有这些自定义逻辑。

我一直认为客户端将与两个服务器进行通信:这个粘贴/webob 业务逻辑服务器,以及一个仅用于服务 WMS 和 WFS 地图元素的服务器。所以我在看 MapServer 和 GeoServer 来处理地图部分......我不高兴。

我不高兴,因为我不想在客户端机器上安装和担心“野兽”。对于 MapServer,我真的不想安装像 Apache 这样的成熟 Web 服务器,而必须处理 CGI、PHP 和 MapScript。对于 GeoServer,有(可能)安装 Java,并处理 GeoServer 设置和管理的各种复杂性。

这部分只是一个学习曲线问题。如果我能避免它,我对学习 MapServer 或 GeoServer 的复杂性并不特别感兴趣。我安装了 GeoServer,将其指向我的一些数据,并且能够使用 GeoServer 漂亮的 Web 管理员内置的 MapLayers 预览来查看我的数据。但是,当我尝试使用指向 GeoServer 的自己的 MapLayers 网页来提供真实数据时,我的 GeoServer 崩溃了。我可以使服务器崩溃,只是从客户端发送一些可能格式错误的请求,这让我感到非常惊讶。我可以深入研究 GeoServer 日志,试图找出我做错了什么,但是……我真的不想在这上面花很多时间。

因此,我正在考虑使用我已经拥有的粘贴/webob 服务器自己实现部分 WMS 和 WFS 接口。事实上,我可能只需要 WMS,因为我可以通过一个简单的自定义协议来处理矢量对象,我将数据传递给客户端,然后客户端可以直接使用 OpenLayers 创建和操作对象。

我已经查看了 WMS 的规范和示例消息(在 WFS 中略少)。自己实现这个协议似乎并不难,特别是因为在这种情况下我可以完全控制客户端——我不需要能够充当通用 WMS 或 WFS 服务器;我只需要让我自己的 OpenLayers 客户满意。

我需要 WMS 服务器具备的两个主要能力是:

  • 从我提前创建的预渲染图块存储中提供图块(我将使用 OpenStreetMap 数据和 mapnik 作为重渲染引擎预渲染图块;我将使用正常的 Google 地图样式图块命名方案来存储和访问它们OpenLayers 所期望的)

  • 能够为这些图块的修改版本提供服务器,其中我在本地存储的某些数据绘制在图块的顶部。例如,我可能在一个“层”上有 10000 个点,在另一层上有 10000 个多边形,当用户激活这些层时,我将提供相同的基础图块,但是当我提供这些图块时,我将渲染这些附加功能在它们之上,并且可能我会实现一个简单的缓存方案来将这些过度渲染的图块保留一段时间。

所以我的问题是:尽管我知道有现有的工具可以做这些事情(MapServer、GeoServer、TileCache 等),但我实际上觉得仅仅响应一些简单的 WMS 消息对我来说工作量较小,并且在 python 中自己在我的瓷砖上进行额外的过度绘制,确保一切都正确投影,等等。我不需要为这些覆盖层绘制花哨的宽阔街道或任何东西,只需简单的线条、图标,也许还有标签。拥有一个仅限 python 的解决方案听起来确实不错且简单。

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

这里有我没有考虑的陷阱吗?

4

3 回答 3

2

Mapserver 非常易于设置和学习。自己实现任何一种渲染都需要付出更多的努力,而且你可能会发现很多意想不到的陷阱。

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

我认为如果您可以制作一个纯 JavaScript 应用程序,并且免于安装 Web 服务器(和地图服务器),那可能会很有趣。如果您只需要浏览瓷砖马赛克,也许您可​​以只使用 JavaScript 来完成(为每个瓷砖生成一个包含一个单元格的 html 表格)。您可以使用 JavaScript 渲染点或多边形,使用画布并进行一些基本的坐标转换以将地理点转换为像素。我认为 Openlayers 有这个功能。

编辑:我刚刚检查过,使用Openlayers,您可以浏览本地图块,并且可以渲染 kml 和其他一些 vect 数据。所以,我认为你应该试试 Openlayers。

于 2011-03-22T14:48:03.723 回答
2

无需 wms/wfs。您需要的是一个 tile 实现。基本上你应该有某种中央服务,或生成瓷砖的桌面服务。生成这些图块后,您可以简单地将它们转换为“no-real-webserver-architecture”文件系统。您可以创建一个符合 /{x}/{y}/{z}.png 的目录结构并从 javascript 中调用它。

可以在此处找到 openstreetmap 如何执行此操作的示例:http ://wiki.openstreetmap.org/wiki/OpenLayers_Simple_Example

于 2011-04-27T20:06:32.087 回答
0

您可能喜欢 featureserver: http: //featureserver.org/。它有自己的 WFS。我现在正在使用它。

于 2013-12-01T11:29:07.077 回答