处理过多数据时如何提高 kml 性能?

How to improve kml performance when dealing with too much data?

我必须编写一个工具来将我们的网络地图导出为 KML,因为许多用户需要它,最初我们使用的服务版本只会向服务器发出图像请求,但我们的用户需要下载实际的矢量。

所以我们最终得到了 20mb+ 的 KML 文件,其中包含超过 30,000 个地标,google earth 根本无法处理它,它在我们的任何计算机上都完全无法使用。

在将其维护为矢量数据(我们提供服务的地图的硬本地副本)的同时,我能做些什么吗?

包含 30,000 个地标的 KML 文件通常不会太大,Google 地球无法处理。例如,此 tool 生成一个 KMZ 文件,其中包含多达 25,000 个用于测试的地标。在 Google 地球中使用多达 100,000 个地标创建的 KML 文件仍然可以工作,性能几乎没有下降。您的 KML 文件之一的示例 and/or 它的一个概念性示例可以帮助确定您遇到的主要问题。无论如何,有许多技术可用于 KML 的设计以扩展到大数字。

Google 如果要素被拆分为多个 KML 文件并且 KML 定义如下,地球可以扩展到大量要素(50,000 或更多)所有子 KML 文件不会同时显示。 KML 提供了一些机制来控制使用时间、区域或高度级别过滤显示哪些要素或子 KML 文件。

大型 KML 文件可以使用以下任一技术进行缩放:

  1. 网络链接
  2. 地区文件夹
  3. 单选风格或显式可见性=0

网络链接

A NetworkLink 通过相对文件引用或绝对文件引用 URL 提供对另一个 KML 文件的引用。您可以在根 KML 文件中拥有任何级别的 NetworkLinks,从平面(单个 KML 文件具有到所有其他 KML 文件的许多网络链接)到深度(每个 KML 文件都有一个网络链接到其他 KML 文件,每个文件都有自己的网络链接)。取决于您需要如何构建 KML 以及数据的大小。

关键是 Google Earth 选择第一个 KML 作为根 KML 文件,因此您必须确保第一个文件(通常命名为 doc.kml)是加载另一个的根 KML 文件通过网络链接的 KML 文件。一个常见的结构是在“kml”子文件夹中包含额外的 KML 文件,以将其与根 KML 文件区分开来。

这是一个包含 4 个文件条目的 KMZ 示例:根 KML 文件 (doc.kml) 包含指向“kml/sub1.kml”的 NetworkLink 和另一个到“kml/sub2.kml”,它又在“kml”中有一个到“sub3.kml”的网络链接子文件夹。

== test.kmz ==

+doc.kml
   NetworkLink > kml/sub1.kml
   NetworkLink > kml/sub2.kml
+kml/sub1.kml
+kml/sub2.kml
   NetworkLink > sub3.kml
+kml/sub3.kml

下面是这样一个 doc.kml 文件的结构:

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
  <Document>
    <NetworkLink>
        <name>NetworkLinked sub-item</name>
        <Link>
          <href> kml/sub1.kml </href>
        </Link>
    </NetworkLink>
    <NetworkLink>
        <name>NetworkLinked sub-item</name>
        <Link>
          <href> kml/sub2.kml </href>
        </Link>
    </NetworkLink>
    ...
  </Document>
</kml>

地区

A Region 会影响地标几何图形或叠加层图像的可见性。 Regions 结合 NetworkLinks 可以访问 KML 文件中的大量数据。一个区域可以选择具有最小和最大海拔高度级别过滤。

有关更多详细信息,请参阅 KML 中的区域教程 https://developers.google.com/kml/documentation/regions

单选文件夹

您可以使用单选文件夹进一步限制在给定时间显示的内容。

这是一个单选文件夹示例,允许用户一次只能选择一个 NetworkLink。当内容相互排斥并且在任何给定时间只能出现一组功能时使用此选项。

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
    <Document>
        <Style id="rf">
            <ListStyle>
                <listItemType>radioFolder</listItemType>
            </ListStyle>
        </Style>

        <Folder>        
            <name>One at a time example</name>
            <open>1</open>
            <description>Link 1 visible by default</description>
            <styleUrl>#rf</styleUrl>

            <NetworkLink>
                <name>NetworkLinked sub-item-1</name>
                <Link>
                    <href> kml/sub1.kml </href>
                </Link>
            </NetworkLink>

            <NetworkLink>
                <name>NetworkLinked sub-item-2</name>
                <visibility>0</visibility>
                <Link>
                    <href> kml/sub2.kml </href>
                </Link>
            </NetworkLink>

        </Folder>
    </Document>
</kml>

更新:

不仅大量的要素会导致性能问题,而且即使是具有例如 350K 点和 7000 个内孔的单个多边形也是有问题的。一个国家边界的高分辨率多边形(包括具有如此多点的海岸线)需要进行简化以减少点数。您可以使用 QGIS 打开 KML 文件,然后对多边形应用简化算法。在 QGIS select Vector menu -> Geometry tools -> Simplify

或者,一个多边形可能被分解成几个更小的多边形,并组合成一个 MultiGeometry。