我正在尝试做同样的事情并想出了一个可行的解决方案,但是它需要对服务器进行多次调用。
在从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,这样您就不需要对服务器进行如此多的调用,也不必调用服务器来加载您已经加载的子节点,但我还没有想出如何做到这一点。
这需要进行相当多的优化。请让我知道是否有人可以帮助找到更直接的方法。谢谢