我的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个。
现在,鉴于组合区域主要是形成一个连续区域,连续区域内部有很多线条和多边形是非常无用的。是否可以遍历多边形并将它们合并为一个(或至少更少)多边形?
答案 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计算结果几何中的点数,以便您可以检测何时需要简化结果。