1

我正在尝试使用 kml 来实现 KML 2.1 教程中描述的区域层次结构

我想要一个代表一个区域的特征(多边形或图标),当该区域变为活动状态时,我想显示一个代表每个区域直属子区域的特征,但不再显示代表父区域的图标。

一个例子是,如果我有一个代表加拿大的地区,并且在该地区的中间有一个地标。当加拿大地区变得活跃时,我希望加拿大地标消失,并希望在加拿大各省(BC、阿尔伯塔等地区和地标)上显示地标。然后,当 BC 地区变得活跃时,我想用 bc 城市的地标替换 bc 地标。

任何帮助将不胜感激。谢谢你。

4

2 回答 2

1

您走在正确的轨道上,区域就是您想要的。查看此页面以获取有关如何使用它们的更多信息

http://code.google.com/apis/kml/documentation/regions.html

特别是,您需要了解细节级别 (LOD)。LOD 确定激活和停用区域的视图边界。最后,您需要以这种格式创建区域。

<Region> 
  <LatLonAltBox> 
    <north>50</north> 
    <south>45</south> 
    <east>28</east> 
    <west>22</west> 
  </LatLonAltBox> 
  <Lod>
    <minLodPixels>128</minLodPixels> 
    <maxLodPixels>1024</maxLodPixels> 
  </Lod>
</Region> 

您可以设置 -1 以便始终显示该区域,无论有人缩小多远,或者如果您使用上面的值 (128),这意味着您设置的边界框必须占用观众屏幕的 128x128 像素才能获得激活(看到)。

这是你用来在他们放大时关闭视图的东西。或者离开 -1,这样无论有人放大多远,它都不会关闭。

对于您的问题,您将在加拿大中部拥有一个包含地标的区域。该区域的 minlodpixels 为 -1,maxlodpixels 对应于另一个区域的 minlodpixels(显示各省的地标),我将为每个省分别创建一个区域。

诀窍是计算边界 - 我使用一个有四个点的方形多边形,然后查看它的代码以提取等

实际上,这里有一个很棒的页面向您展示如何创建区域 - 确保您下载了名为“Screen Overlay Size Guide”的 kml - 它让事情变得更容易

http://earth.google.ca/intl/en_ca/outreach/tutorial_region.html

于 2012-02-19T21:13:15.267 回答
0

我正在尝试做同样的事情并想出了一个可行的解决方案,但是它需要对服务器进行多次调用。

在从http://example.com/zones.kml加载的基础 kml 中,您将拥有

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
<Document id="base">
  <Folder id="1_folder">
    //Region responsible for hiding the current (Canada) Placemark when zoomed in and made inactive ALSO responsible for hiding children(BC, Alberta...) Placemarks when active
    <Region>
      <LatLonAltBox>
          <north>74.79903411865234</north>
          <south>41.508766174316406</south>
          <east>-52.03630065917969</east>
          <west>-139.96746826171875</west>
        </LatLonAltBox>
      <Lod>
        <maxLodPixels>
          1024
        </maxLodPixels>
      </Lod>
    </Region>

    //NetworkLink that hides children Placemarks when zooming out
    <NetworkLink>
      <refreshVisibility>1</refreshVisibility>
      <Link>
        <href>http://example.com/1/hide_children.kml</href>            
        <viewRefreshMode>onRegion</viewRefreshMode>
      </Link>
    </NetworkLink>

    //The Canada Placemark
    <Placemark id="1">
      <name>Canada</name>
      <Point>
        <coordinates>-96.00188446044922,58.153900146484375</coordinates>
      </Point>
    </Placemark>

    //Networklink for Loading Children While Zooming in
    <NetworkLink>
      <refreshVisibility>1</refreshVisibility>
      // Same Region as above but with minLodPixels instead of maxLodPixels
      <Region>
        <LatLonAltBox>
          <north>74.79903411865234</north>
          <south>41.508766174316406</south>
          <east>-52.03630065917969</east>
          <west>-139.96746826171875</west>
        </LatLonAltBox>
        <Lod>
         <minLodPixels>1024</minLodPixels>
        </Lod>
      </Region>
      <Link>
        <href>http://example.com/zones/1.kml</href>                
        <viewRefreshMode>onRegion</viewRefreshMode>
      </Link>
    </NetworkLink>
  </Folder>
</Document>
</kml>

这需要另外加载两个 kml 文件以隐藏或显示特定地标的子项。

用于隐藏子项的 kml 将从http://example.com/1/hide_children.kml加载,并包含用于隐藏子项的 networklinkcontrol

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
  <NetworkLinkControl>
    <Update>
      <targetHref>http://example.com/zones.kml</targetHref>
      <Change>
        <Folder targetId="1_children"><visibility>0</visibility></Folder>
      </Change>
    </Update>
  </NetworkLinkControl>
</kml>

用于显示孩子的 kml 将从http://example.com/1.kml加载,并包含用于向孩子显示孩子的 networklinkcontrol

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
  <NetworkLinkControl>
    <Update>
      <targetHref>http://example.com/zones.kml</targetHref>
      <Create>
        <Folder targetId="1_folder">
          <Folder id='1_children'>
            //This folder is the same as the original zone
            <Folder id="2_folder">
              //Empty region if the zone has no children
              <Region></Region>

              //No need for networklink to hide children if zone has no children

              //Placemark
              <Placemark id="2">
              <name>BC</name>
              <Point>
                <coordinates>-122.95623779296875, 50.06098937988281</coordinates>
              </Point></Placemark>
            </Folder>

            //Same for other Provinces
            //<Folder id="3_folder"></Folder>
            //<Folder id="4_folder"></Folder>

          </Folder>
        </Folder>
      </Create>
    </Update>
  </NetworkLinkControl>
</kml>

最好能定义 2 个不同的区域,一个用于 minLod,一个用于 maxLod,这样您就不需要对服务器进行如此多的调用,也不必调用服务器来加载您已经加载的子节点,但我还没有想出如何做到这一点。

这需要进行相当多的优化。请让我知道是否有人可以帮助找到更直接的方法。谢谢

于 2012-04-27T16:07:49.830 回答