2012-02-17 75 views
0

我试图使用KML实现区域的层次结构中 KML 2.1 Tutorial显示标层次结构在谷歌地球

形容,我想有一个功能(多边形或图标)表示区域与当区域变为活动状态我想显示代表每个区域直接子项的功能,但不再显示代表父区域的图标。

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

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

+0

找到[这个](http://stackoverflow.com/questions/689336/group-features-in-google-earth-to-hide-detail-when-zoomed-out),但仍然在一个样本如何让这个工作 – Anark 2012-02-17 15:41:59

回答

0

你是在正确的轨道上,地区是你想要的。看看这个页面了解更多信息关于如何使用它们

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)的值,这意味着您所设置的边框,必须承担起128×128像素在观看者屏幕被激活之前(见)。

这是您在放大视图时用来关闭视图的方法。或者,在-1时关闭视图,因此无论用户放大多大,IN都不会关闭。

对于你的问题,你将有一个地区在加拿大中间包含地标。该区域的微小像素为-1,与另一个区域的小像素对应的极大像素(显示各省的地标),我将分别为每个省制作一个区域。

诀窍正在制定的界限 - 我用一个方形面积4分,然后看看它的代码提取等

其实,这里是一个伟大的页面向您展示如何创建区域 - 确保你下载一个名为“屏幕叠加尺寸指南”的KML - 它使事情更容易

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

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文件。

隐藏的孩子们从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> 

用于显示会从http://example.com/1.kml加载孩子的KML和包含NetworkLinkControl中展现孩子们的KML的儿童

<?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,所以你没必要有那么多的电话服务器和你没不必调用服务器来加载你已经加载的孩子,但我还没有想出如何做到这一点呢。

这需要进行相当多的优化。请让我知道是否有人可以找到更直接的方式来做到这一点。谢谢