如何在没有PostgreSQL或手动更改dbf文件的情况下使用mapnik + shapefiles动态过滤结果?

时间:2013-11-02 13:20:53

标签: openstreetmap shapefile mapnik

我有一个不寻常的挑战,我正在努力。我希望有人遇到这个问题并指出我的解决方案。

概述:

我正在寻找一种方法来使用mapnik + shapefiles,动态过滤结果,而无需PostgreSQL或手动更改dbf文件。

详细信息:

我需要在地图上绘制由邮政编码组成的地区。我目前的解决方案从MySQL数据库中提取多边形,并在运行时将它们绘制在Google Map上。这显然很慢。我更愿意将其转移到mapnik兼容的解决方案,这样我就可以动态渲染切片并让地图响应更快。

现在,在你说之前,只使用Postgres而不是shapefile,让我说这个服务器没有,也不能有Postgres。它很糟糕,但这是一个很难的限制。动态数据源是mapnik不支持的MySQL。

当然,我可以手动离线渲染这些区域(我碰巧使用TileMill)。为此,我必须通过添加一个简单的列来操作OpenOffice中的shapefile的dbf文件,该列标记ZIP是否在某个区域内以及它所属的域。然后在我的CartoCSS中,一个简单的问题就是寻找[INCLUDE =“Y”] {...}来绘制或隐藏多边形,以及一个基于区域所有者id的简单颜色分配。没有问题,除了这是一个令人难以置信的时间和劳动密集的事实。

真正的问题是,客户有近百个地区会不时发生变化。更糟糕的是,当它们发生变化时,涟漪效应会引起连锁反应,从而使邻近地区发生变化。更糟糕的是,他们不希望领土所有者看到彼此的领土,这意味着每个领土都必须被过滤并孤立地绘制。

所以,我正在寻找一种自动混合解决方案来处理shapefile的过滤,所以每次地域变化时我都不必手动重做。

我的头发变灰了。只要解决方案不依赖于PostgreSQL或者手动操作shapefile的dbf数据库,我就会对选项持开放态度。

非常感谢任何帮助和建议。

谢谢, 史蒂夫

TLDR:我需要使用带有动态过滤结果的mapnik + shapefile而不使用PostgreSQL或手动更改dbf文件

1 个答案:

答案 0 :(得分:0)

您可以通过渲染具有唯一颜色的区域,然后在提供渲染图像时操纵渲染图像的调色板来完成此操作。如果在C中完成,在服务器上执行此操作很便宜,或者您可以尝试在javascript中执行此操作(性能未知Possible to change an image color palette using javascript?)。

这里有一个描述:http://blog.webfoot.com/2013/03/12/optimizing-map-tile-generation/

如果您只渲染边界,那么这将无效。

如果您还没有,可以使用编码折线(https://developers.google.com/maps/documentation/utilities/polylinealgorithm)在浏览器中为现有系统加速多边形渲染。这是一个巨大的性能凸点,也减少了电线传输的大小。