我正在尝试使用kml来实现区域的层次结构 KML 2.1 Tutorial
我希望有一个表示区域的特征(多边形或图标),当区域变为活动状态时,我想显示一个表示每个区域的直接子项但不再显示代表父区域的图标的特征。 / p>
一个例子是,如果我有一个代表加拿大的地区和该地区中间的地标。当加拿大地区变得活跃时,我希望加拿大地标消失,并希望在加拿大各省(BC,Alberta等地区和地标)上显示地标。然后当BC区域变为活动状态时,我想用bc中的城市地标替换bc地标。
非常感谢任何帮助。 谢谢。
答案 0 :(得分: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(显示各省的地标)我将分别为每个省份建立一个区域。
诀窍是找出边界 - 我使用带有四个点的方形多边形,然后查看其代码以提取等等
实际上,这是一个很棒的页面,向您展示如何创建区域 - 确保您下载名为“屏幕覆盖尺寸指南”的kml - 它使事情变得更容易
http://earth.google.ca/intl/en_ca/outreach/tutorial_region.html
答案 1 :(得分: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,因此您不需要对服务器进行如此多的调用,也不必调用服务器来加载已经存在的子级加载但我还没弄明白怎么做。
这需要进行相当优化。如果有人能帮助找到更直接的方法,请告诉我。感谢