3

我有一个 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 个的限制。

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

4

1 回答 1

1

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

与其存储 XML 片段,不如将它们推送到支持 GIS 的数据库中,例如带有PostGIS的 PostgreSQL 。这允许您将形状信息存储为众所周知的二进制 (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 计算生成的几何图形中的点数,以便检测何时需要简化结果。

于 2010-11-06T23:19:41.257 回答