2009-10-13 82 views
3

我对Google Maps API存在问题,每个地图只允许使用1000个功能。在PHP中合并KML多边形

在数据库中,我保留着areas的记录。每个区域都与一个KML多边形信息堆相关联,存储为一个XML字符串。每个区域由一个或多个多边形组成。

给定一些用户输入,这些区域中的一部分合并为一个<Placemark>。通过将连接的多边形信息包装在<MultiGeometry>标记中,我获得了它们的组合几何。

<Placemark> 
    <name>My combined area</name> 
    <MultiGeometry> 
     <Polygon> (area 1 info) </Polygon> 
     <Polygon> (area 2 info) </Polygon> 
     <Polygon> (area 2 info) </Polygon> 
     <Polygon> (area 3 info) </Polygon> 
    </MultiGeometry> 
</Placemark> 

的问题是,许多领域都是非常复杂的,因此,任何给定标可以有超过100个多边形,它们很快推我的1000限制每个文档的。

现在,假设组合区域主要是形成一个单一的连续区域,连续区域内部有很多线条和多边形,这些线条和多边形相当无用。是否有可能遍历多边形并将它们合并为一个(或至少更少)多边形?

+0

嗯,是的,它被称为编程的小事。因此,为了帮助我们需要了解更多需要结合的地区信息,以及何时需要保持区分。你什么时候需要所有的细节? – Don 2009-11-09 04:51:51

+0

我可以很容易地得到需要合并成一个(或更多取决于区域是否连续)的多边形列表,并且在合并后我再也不需要再次详细了解所有细节。 – nickf 2009-11-09 05:37:17

回答

1

存储方法使得这是一个非常难以解决的问题。以编程方式合并连续的多边形会变得缓慢而复杂。

与其存储XML片段不同的是,将它们推送到支持GIS的数据库(如PostgreSQL)中,并使用PostGIS。这使您可以将形状信息存储为众所周知的二进制(WKB)对象而不是XML片段,并为您提供了一整套GIS处理和格式化工具。

一旦你有了这种格式,这个问题就变得很容易解决。例如。假设几何列被称为“the_geom”,那么你可以使用像查询以下内容:

SELECT ST_ASKML(ST_Union(the_geom)) AS area_union_askml 
FROM areas 
WHERE (some_filter_expression) 
GROUP BY (optional_group_by_expression) 

这仅仅使用了聚合函数ST_UNION到匹配的几何形状在一个单一的对象合并,并将结果列输出作为KML片段。

如果您需要简化形状,因为KML对Google地图来说过于复杂,您可以添加ST_Simplify或ST_SimplifyPreserveTopology。您还可以使用ST_NPoints来计算生成的几何体中的点数,以便您可以检测何时需要简化结果。