代码之家  ›  专栏  ›  技术社区  ›  nickf

在php中合并kml多边形

  •  3
  • nickf  · 技术社区  · 15 年前

    我有一个问题,谷歌地图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>
    

    问题是,这些区域中的许多是高度复杂的,因此,任何给定的placemark都可能有超过100个多边形,这很快将我推到了每个文档1000个的极限。

    现在,考虑到 主要地 形成一个单一的连续区域,在连续区域的内部有许多线和多边形,这些线和多边形是非常无用的。是否可以循环通过多边形并将其合并为一个(或至少更少)多边形?

    1 回复  |  直到 14 年前
        1
  •  1
  •   Hamish    14 年前

    存储方法使得这个问题很难解决。以编程方式合并相邻多边形将变得缓慢而复杂。

    与其存储XML片段,不如将它们推送到一个支持地理信息系统的数据库中,比如postgresql PostGIS . 这允许您将形状信息存储为众所周知的二进制(wkb)对象,而不是xml片段,并为您提供一整套gis处理和格式化工具。

    一旦你有了这个格式,这个问题就很容易解决了。例如,假设geometry列称为“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来计算结果几何图形中的点数,以便在需要简化结果时进行检测。