构建大型 KML 文件

Posted

技术标签:

【中文标题】构建大型 KML 文件【英文标题】:Building large KML file 【发布时间】:2011-09-15 17:43:48 【问题描述】:

我生成的 KML 文件可能包含 50,000 个或更多地标,并根据特定于域的分组排列在文件夹中。 KML 文件使用打包到 KMZ 文件中的自定义图像。

我希望将单个 KML 文件分解为多个文件,并根据分组进行分区,因此与其拥有 1 个带有文件夹的大文档,不如拥有一个带有链接到较小文件夹的根/索引 KML 文件KML 文件。

这可能吗?我认为一个 KMZ 文件在 zip 中只能包含 1 个 KML 文件,无论它位于何处或名称如何。此外,我不确定 KML 文件如何链接到另一个 KML 文件。将它作为 <NetworkLink> 到本地文件的唯一方法是什么? <NetworkLink> 可以链接到同一个 KMZ 中的本地文件吗?

【问题讨论】:

【参考方案1】:

根据设计,您可以在一个 KMZ 文件中包含多个 KML 文件。通过这种方式,您可以将多个 KML 文件捆绑在一个 KMZ 文件中,以便下载、通过电子邮件发送或离线访问。

Google 地球可以扩展到单个 KMZ 文件中的大量要素(50,000 个或更多),前提是这些要素被拆分为多个 KML 文件,并且 KML 的定义使得所有子-KML 文件不会立即显示。 KML 提供了使用时间、区域或海拔级别过滤来控制显示哪些要素或子 KML 文件的机制。

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

    NetworkLinks Regions 文件夹单选样式或显式可见性=0 每个要素的点数和几何简化

网络链接

您可以在根 KML 文件中拥有任何级别的网络链接,从平面(具有网络链接的单个 KML 文件到 KMZ 中的所有其他 KML 文件)到深度(每个 KML 文件都有一个 NetworkLink 到其他 KML 文件,每个文件都有自己的自己的 NetworkLink)。取决于您需要如何构建 KML 以及数据有多大。

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

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

== 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,则最佳做法是向 NetworkLink 添加一个 &lt;TimeSpan&gt; 元素,包括该功能集合的完整时间范围,否则 Google 地球将自动在启动时加载整个文件。

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

地区

Region 影响地标的几何图形或叠加层图像的可见性。区域与 NetworkLink 相结合,可以访问 KML 文件中的大量数据。区域可以选择具有用于高度级别过滤的最小和最大高度。

更多详细信息,这里有一个关于 KML 区域的教程https://developers.google.com/kml/documentation/regions

电台文件夹

您可以使用radio folders 进一步限制在给定时间显示的内容。

这是一个单选文件夹示例,允许用户一次只选择一个 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 文件的大小和要素数量并不是唯一需要考虑的问题。具有 350K 点和 7000 个内孔的单个高分辨率多边形的 KML 文件可能会导致 Google 地球性能问题。这种几何形状需要简化并减少点的数量。您可以使用 QGIS 打开 KML 文件,然后对多边形应用简化算法。在 QGIS 中,选择 Vector menu -> Geometry tools -> Simplify 然后保存结果。

【讨论】:

【参考方案2】:

是的,您可以使用网络链接来完成此操作,据我所知,这是完成您所要求的唯一方法。是的,您可以在网络链接中引用本地文件

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

一个网络链接包含一个带有(超文本 参考)加载一个文件。可以是本地文件 规范或绝对 URL。尽管有这个名字,一个 不一定从网络加载文件。中的 链接指定以下任何一项的位置:

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

不,您不能引用 kmz 中的另一个文件。一个 kmz 只能包含 1 个 kml 文件(但它可以包含其他类型的文件)您可以找到 kmz 文件的布局以及其中可能包含的内容here 特别注意以下部分:

2.将默认的 KML 文件(doc.kml,或您想提供的任何名称 它)在此文件夹的顶层。仅包含一个 .kml 文件。 (当 Google 地球打开一个 KMZ 文件时,它会扫描该文件,寻找 此列表中的第一个 .kml 文件。它忽略所有后续的 .kml 档案中的文件(如果有)。如果存档包含多个 .kml 文件,你不能确定哪个会先找到,所以你需要 只包括一个。)

最后一点是,如果您需要将这 50.000 个地标作为离线文件,您的问题并不能说明任何问题。如果您可以动态地为它们提供服务,您可以使用基于区域的链接,GE 会告诉您客户端的查看区域,这样您就可以返回一小部分航路点(仅限用户视图内的航路点)更多信息 @987654323 @ 是要点击的链接。

【讨论】:

谢谢艾迪。目的是让一切都脱机 上面“一个kmz只能包含1个kml文件”的说法不正确。问题是这在任何地方都没有明确记录。

以上是关于构建大型 KML 文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP 将大型 KML 文件拆分为较小的文件

.NET - 如何为大型 CSS 文件构建主题

将 23mb kml 文件拆分为 3 个偶数部分

大文本文件查看器如何工作?如何构建大型文本阅读器

如何为使用 makefile 构建的整个项目生成一个大型依赖映射?

C++ 通过使用库提高大型项目的构建速度