php - 在 PHP 中组合 KML 多边形

标签 php google-maps geometry kml

我对 Google Maps API 有疑问,每张 map 只允许 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 个的限制。

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

最佳答案

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

与其存储 XML 片段,不如使用 PostGIS 将它们推送到支持 GIS 的数据库(如 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 map 来说太复杂,您可以添加 ST_Simplify 或 ST_SimplifyPreserveTopology。您还可以使用 ST_NPoints 来计算生成的几何体中的点数,以便您可以检测何时需要简化结果。

关于php - 在 PHP 中组合 KML 多边形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1558177/

相关文章:

javascript - 使用 Excel 道路表在 Google 中突出显示道路

android - 集成 Google Play Games + Google Maps 扩展 BaseGamesActivity 和 FragmentActivity

c - 使用不同颜色的三角形镶嵌球体

language-agnostic - 用矩阵变换3D向量的方法

PHP——目录安装

javascript - 如何将THIS绑定(bind)到php中的外部函数

php - 如何在Linux PHP服务器上获取网站的屏幕截图?

php - 获取最后插入的 varchar id,它是一个主键

ios - 美国以外的行政区、子行政区等的名称是什么?

android - 如何使用多点触控画圆