【问题标题】:how to toggle between KML files in Google Earth or toggle between sets of points如何在 Google 地球中的 KML 文件之间切换或在点集之间切换
【发布时间】:2012-10-01 17:02:38
【问题描述】:

所以基本上我有一个我加载的 KML 文件,并且我有 2 组不同的点,我在那里展示。但是,我希望能够一次呈现一个集合,我认为最简单的方法是将集合拆分为 2 个不同的 KML 文件,然后根据集合加载适当的文件,或者如果有其他方式这样做,它也可以为我工作。 非常感谢。

【问题讨论】:

    标签: html kml google-earth google-earth-plugin


    【解决方案1】:

    虽然 kaliatech 的答案是正确且有用的,但与 this approach 相比,它也有点矫枉过正且难以实施。这是一个 Google 示例,通过复选框切换各种 KML 文件的加载。

    您需要做的就是将 kmls 的文件名更改为红色/黄色/绿色,或者将代码更改为更适合您使用的名称 - 取决于您的舒适程度以及您想要的最终结果。

    【讨论】:

    • 您说的是左上角的框,我可以在其中单击不同的文件来显示,还是该框内的另一个示例?谢谢
    • 由于 SO 如何转义括号,此答案中的链接最初无法正常工作。现在已修复,请再次单击。如果它仍然不起作用,我认为@lifeIsGood 建议您查看“获取 KML(交互式,复选框)”示例。但是,我看不出这有多容易(它添加/删除 kml 而不是设置文件夹的可见性),但也许它会对您有所帮助。
    • 明白了,谢谢。我也想尝试一下这种方法,因为正如你所指出的,我真的没有任何 java 脚本经验,所以也许这个例子对我来说更容易理解。
    • 我的一个问题是,当我将代码从代码游乐场复制并粘贴到我的 Notepad++ 中并运行它时,我希望它能够像在该站点上一样运行,但是复选框没有显示,只有地图可以,我是否使用了错误的标题或关闭器?因为它们没有显示在谷歌代码游乐场
    • 也许页脚除了调用
      之外还应该有别的东西
    【解决方案2】:

    如果您熟悉 JavaScript 并且可以使用 Google Earth API,则有多种方法可以做到这一点。

    如果文件夹具有已知 ID,则这是在 KML 文件中隐藏/显示文件夹的示例:

    var showFolder = true;
    google.earth.fetchKml(gePlugin, kmlUrl, function(rootKmlFeature) {
          if (rootKmlFeature) {
    
            var myFolderEl = rootKmlFeature.getElementById('#myFolderId');
            if (showFolder) {
                myFolderEl.setVisibility(true);
            }
            else {
                myFolderEl.setVisibility(false);
            }
          }
    });
    

    根 KmlFeature 始终是一个 KmlContainer,它提供了查找子元素的方法。请注意,可能很难知道您是否需要使用“getElementById”或“getElementByUrl”。谷歌文档不是特别清楚:

    一旦您引用了文件夹(或相关的 KmlFeature),您就可以动态设置可见性(和许多其他属性)以响应 UI 事件或其他任何内容。


    编辑(在您发表评论后)

    fetchKml 回调(在 HTML 中)为您提供加载的 kmlObject。根据您希望触发显示/隐藏交互的方式,您可能希望将该 kmlObject 存储在更高(可能是全局)范围内。然后,当用户按下按钮或其他任何操作时,您可以执行以下操作:

    function displayPlacemark1(visible) {
    
      var baseUrl = 'https://sites.google.com/' + 'site/shahinkmlexamples/experiment/bombs12.kml';
    
      var placemark = kmlObject.getElementByUrl('#placemark1');
      placemark.setVisibility(visible);
    }
    

    相应地,在您的 KML 文件中,您希望将 id 属性添加到地标。即

    ...
    <Placemark id="placemark1">
    ...
    

    【讨论】:

    • 感谢您的提示,我正在尝试文件夹方法,但我不完全理解如何去做,我添加了我的代码,您发布的代码段是放在 kml 文件中还是html文件,我在html文件里有,但是好像出错了。
    • JS 代码的放置取决于您希望如何/何时触发可见性。它可以进入您的 fetchKml 回调函数,或者您可以存储对加载的 kmlObject 的引用,然后在稍后触发可见性。相应地,您还需要为 KML 文件中的每个地标添加一个 id 属性。我在答案中添加了一些额外的信息/示例。
    • 我刚刚根据您上次的编辑了解到,您可能不懂 JavaScript。您根据编辑粘贴的代码属于 initCB 函数的 fetchKml 回调。您粘贴的位置没有意义。
    【解决方案3】:

    上述解决方案描述了使用 JavaScript 的 Google Earth API 方法。

    纯 KML 解决方案是通过 ListStyle 将单选按钮添加到 KML 中的文件夹,然后将每组点放在子文件夹或 NetworkLink 链接中。您可以通过在最初不希望显示的其他子文件夹上添加 0 元素来使其中一组默认可见。另一个技巧是在名称或描述中使用说明来选择单选按钮以查看其他集合的第一个功能是空的。你可以在Google Maps Overlay in Google Earth找到这个。

    radioFolder 当为 Container 指定时,一次只能看到 Container 的一项。

    以下是使用具有两组点的 radioFolder 的 KML 示例:

    <?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>Radio A visible by default</name>
          <description>Select which folder to see</description>
          <styleUrl>#rf</styleUrl>
          <Folder>
          <name>Folder A</name>
          <Placemark>
            <name>Radio A</name>
            <Point>
              <coordinates>-121.9921875, 37.44140625</coordinates>
            </Point>
          </Placemark>
          </Folder>
    
          <Folder>
          <name>Folder B</name>
          <visibility>0</visibility>
          <Placemark>
            <name>Radio B</name>
            <visibility>0</visibility>
            <Point>
              <coordinates>-121.9921875, 37.265625</coordinates>
            </Point>
          </Placemark>
          </Folder>
    
        </Folder>    
      </Document>
    </kml>
    

    参考: https://developers.google.com/kml/documentation/kmlreference#listItemType

    【讨论】:

      猜你喜欢
      • 2012-06-04
      • 2021-10-03
      • 1970-01-01
      • 2012-03-13
      • 1970-01-01
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多