在PHP中合并KML多边形

3
我在使用Google Maps API时遇到了问题,每个地图只允许1000个要素。
在数据库中,我保存了“区域”的记录。每个区域都有与之相关联的KML多边形信息,存储为XML字符串。每个区域由一个或多个多边形组成。
根据用户输入,其中一些区域被合并成一个。我通过将连接的多边形信息包装在标记中来获取它们的组合几何形状。
<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>

问题在于许多这些区域非常复杂,因此,任何给定的Placemark可能会有超过100个多边形,这很快就会将文档限制在1000个之内。
现在,考虑到组合区域大多形成一个单一的连续区域,连续区域内部有很多无用的线和多边形。是否可以遍历多边形并将它们合并成一个(或至少更少)多边形?

好的,它被称为“编程的小事情”。因此,为了帮助您,我们需要了解更多关于需要合并的区域信息以及何时需要将它们分开的信息。还有,你什么时候确实需要所有细节呢? - Don
我可以轻松地获取需要合并成一个多边形(或更多,取决于区域是否连续)的多边形列表,并且在合并后再也不需要所有细节。 - nickf
1个回答

1

存储方法使得这个问题非常难以解决。编程合并相邻的多边形将会变得缓慢和复杂。

与其存储XML片段,不如将它们推入像PostGIS这样的GIS启用数据库中。这允许您将形状信息存储为众所周知的二进制(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 Maps来说太复杂了,您可以添加ST_Simplify或ST_SimplifyPreserveTopology。您还可以使用ST_NPoints来计算结果几何体中的点数,以便在需要简化结果时进行检测。


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