构建大型KML文件

4
我生成KML文件,其中可能有50,000个或更多的地标,根据特定领域的分组安排在文件夹中。 KML文件使用自定义图像,这些图像被打包到KMZ文件中。
我想将单个KML文件拆分为多个文件,根据分组进行分区,因此,而不是具有文件夹的1个大文档,我将具有链接到较小KML文件的文件夹的根/索引KML文件。
但是,这是否可能呢? 我认为KMZ文件只能包含一个KML文件,无论它位于何处或其名称如何。 此外,我不确定KML文件如何链接到另一个KML文件。 唯一的方法是将其作为<NetworkLink>链接到本地文件吗? <NetworkLink>可以用于链接到同一KMZ中的本地文件吗?
2个回答

11

设计上,您可以在单个KMZ文件中拥有多个KML文件。这样,您可以将许多KML文件捆绑在一个单独的KMZ文件中,以进行下载、通过电子邮件发送或离线访问。

如果将功能分为多个KML文件并定义所有子KML文件不同时显示,则Google Earth可以扩展到大量功能(50,000或更大)在单个KMZ文件中。 KML提供了控制哪些功能或子KML文件使用时间、区域或高度级别过滤的机制。

可以使用以下任何技术扩展大型KML文件:

  1. NetworkLinks
  2. Regions
  3. 文件夹的Radio样式或显式visibility=0
  4. 每个要素的点数和几何简化

NetworkLinks

您可以在根KML文件中从平面(具有链接到KMZ内所有其他KML文件的Networklinks的单个KML文件)到深层(每个KML文件都有链接到其他KML文件的NetworkLink)的任何级别的NetworkLinks。这取决于您需要如何构建KML以及数据的大小。

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

这是一个带有4个文件条目的KMZ示例:根KML文件(doc.kml)包含对“kml/sub1.kml”和“kml/sub2.kml”的NetworkLink,后者又链接到“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>

如果您在父KML文件中包含多个具有时间相关特性的NetworkLink,则最佳实践是向包含该特性集合的NetworkLinks添加<TimeSpan>元素,以包括该时间段的完整范围,否则Google Earth将在启动时自动加载整个文件。

<NetworkLink>
  <TimeSpan>
    <begin>2007-01-14T01:00:00Z</begin>
    <end>2007-01-14T02:00:00Z</end>
  </TimeSpan>
  <Link>
    <href>...</href>
  </Link>
</NetworkLink>

区域

区域会影响Placemark的几何图形或覆盖层的图像的可见性。区域结合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>

每个要素的点数和几何简化

考虑问题时,KML文件的大小和要素数量并不是唯一需要考虑的。一个包含35万个点和7000个内部空洞的高分辨率多边形可能会导致Google Earth性能问题。这种几何图形需要进行简化,并且需要减少点数。您可以使用QGIS打开一个KML文件,然后在该多边形上应用简化算法。在QGIS中,选择矢量菜单-> 几何工具 -> 简化,然后保存结果。


1

是的,您可以使用网络链接来实现这一点,据我所知,这是您提出要求的唯一方法。而且,您可以在网络链接中引用本地文件。

请参见:http://code.google.com/intl/nl-NL/apis/kml/documentation/kml_tut.html(搜索“网络链接”),其中写道:

网络链接包含一个带有超文本引用(href)的<Link>元素,该元素加载文件。<href>可以是本地文件规范或绝对URL。尽管名称为<NetworkLink>,但不一定从网络加载文件。链接中的<href>指定以下任何内容的位置:

• 图标样式、地面叠加和屏幕叠加中使用的图像文件
• <Model>元素中使用的模型文件
• 由网络链接加载的KML或KMZ文件

不,你不能在kmz文件中引用另一个文件。一个kmz文件只能包含一个kml文件(虽然它可以包含其他类型的文件)。你可以在这里找到kmz文件的布局和其中可能放置的内容。特别注意以下部分:

2.将默认的KML文件(doc.kml或任何你想要命名的文件)放在此文件夹的顶层。只包括一个.kml文件。(当Google Earth打开KMZ文件时,它会扫描该文件,查找此列表中的第一个.kml文件。如果存档中包含多个.kml文件,则无法确定哪一个将被首先找到,因此您需要仅包括一个。)

最后一点需要注意的是,您的问题并没有说明您是否需要这50,000个地标作为离线文件。如果您可以动态地提供它们,您可以使用基于区域的链接,其中GE将告诉您客户端的查看区域,因此您可以返回一个小的子集航路点(仅在用户视图内的航路点)。有关更多信息,请单击this链接。

谢谢Eddy。意图是让所有东西离线。 - Stealth Rabbi
1
上面的声明“kmz 只能包含一个 kml 文件”是不正确的。问题在于这并没有被清楚地记录在任何地方。 - CodeMonkey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接