在PHP中结合KML多边形

时间:2009-10-13 04:25:45

标签: php google-maps geometry kml

我的Google Maps API存在问题,每个地图只允许1000个功能。

在数据库中,我保留了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个。

现在,鉴于组合区域主要是形成一个连续区域,连续区域内部有很多线条和多边形是非常无用的。是否可以遍历多边形并将它们合并为一个(或至少更少)多边形?

1 个答案:

答案 0 :(得分: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计算结果几何中的点数,以便您可以检测何时需要简化结果。