using Regions, network links, time span in kml, but GE loads up entire file on startup - kml

I have global data for fires around the world covering three days. Projecting the entire data into one kml ends up in huge kml. I tried to break up the data in to smaller regions and also smaller time intervals.
So I have hundreds of regions covering the whole globe and data for each of these regions is divided into 6 kmls (time span of 12 hours in each) to cover 3 days.
Th problem is that even after dividing the global data into smaller chunks, once I load the master file, GE wants to load the entire data and becomes too slow. Could there be a better way of doing this or maybe highlight what I might be doing wrong?
the overview of my kml files is as follows:
the master kml :
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
<Region>
<LatLonAltBox>
<north>90</north>
<south>-90</south>
<east>360</east>
<west>0</west>
</LatLonAltBox>
<Lod>
<minLodPixels>128</minLodPixels>
<maxLodPixels>1024 </maxLodPixels>
</Lod>
</Region>
<NetworkLink>
<name> Region NHAf</name>
<TimeSpan>
<begin>2011-06-01T00:30:00Z</begin>
<end>2011-06-04T00:30:00Z</end>
</TimeSpan>
<Region>
<LatLonAltBox>
<north>30</north>
<south>0</south>
<east>60</east>
<west>-30</west>
</LatLonAltBox>
<Lod>
<minLodPixels>128</minLodPixels>
<maxLodPixels>1024 </maxLodPixels>
</Lod>
</Region>
<Link>
<href>NHAf_base.kml</href>
<viewRefreshMode>onRegion</viewRefreshMode>
</Link>
</NetworkLink>
...
//more network links for other regions
</Document></kml>
This network links for different regions are further linked to sub-regions and the whole time span is also divided into smaller kmls :
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
<Region>
<LatLonAltBox>
<north>30</north>
<south>0</south>
<east>60</east>
<west>-30</west>
</LatLonAltBox>
<Lod>
<minLodPixels>128</minLodPixels>
<maxLodPixels>1024 </maxLodPixels>
</Lod>
</Region>
<Folder>
<name>NHAf 1 0050</name>
<NetworkLink>
<name> Region 1 resolution 0050</name>
<TimeSpan>
<begin>2011-06-01T00:30:00Z</begin>
<end>2011-06-01T12:30:59Z</end>
</TimeSpan>
<Region>
<LatLonAltBox>
<north>30</north>
<south>10</south>
<east>-10</east>
<west>-30</west>
</LatLonAltBox>
<Lod>
<minLodPixels>128</minLodPixels>
<maxLodPixels>1024 </maxLodPixels>
</Lod>
</Region>
<Link>
<href>NHAf_1_hr01_frpfire_20110601_1130_0050_1.kml</href>
<viewRefreshMode>onRegion</viewRefreshMode>
</Link>
</NetworkLink></Folder>
<Folder>
<name>NHAf 1 0050</name>
<NetworkLink>
<name> Region 1 resolution 0050</name>
<TimeSpan>
<begin>2011-06-01T13:30:00Z</begin>
<end>2011-06-01T23:30:59Z</end>
</TimeSpan>
<Region>
<LatLonAltBox>
<north>30</north>
<south>10</south>
<east>-10</east>
<west>-30</west>
</LatLonAltBox>
<Lod>
<minLodPixels>128</minLodPixels>
<maxLodPixels>1024 </maxLodPixels>
</Lod>
</Region>
<Link>
<href>NHAf_1_hr01_frpfire_20110601_2330_0050_1.kml</href>
<viewRefreshMode>onRegion</viewRefreshMode>
</Link>
</NetworkLink></Folder>
...
//more network links till end of time step
//more network links with different sub-regions
</Documents>
</kml>

If you have multiple time periods split into multiple KML files then you can preselect the default time loaded at startup with the KML extension <gx:TimeSpan> in the root Document element of the KML file. This initializes the time slider for this time interval. For it to work, you must add a Camera or a LookAt element with a <gx:TimeSpan>.
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2"
xmlns:gx="http://www.google.com/kml/ext/2.2">
<Document>
<LookAt>
<gx:TimeSpan>
<begin>2011-06-01T13:30:00Z</begin>
<end>2011-06-01T23:30:59Z</end>
</gx:TimeSpan>
<longitude>...</longitude>
<latitude>...</latitude>
<altitude>...</altitude>
<heading>...</heading>
<tilt>...</tilt>
<range>...</range>
</LookAt>
...
You can add the TimeSpan to your KML in Google Earth with these steps:
Orient the view you want to startup with
Right-mouse click the root KML element and select Properties
Click View tab
Click 'Snapshot current view'
Select/edit the start and end time you want start with
Click OK
Reference: https://developers.google.com/kml/documentation/kmlreference#gxtimespan

Related

Placemarks lookat range ignored

I'm using this KML file (lets call it load.kml)
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
<Document>
<NetworkLink>
<refreshVisibility>1</refreshVisibility>
<flyToView>1</flyToView>
<Link> <href>C:\\Users\\bridenstinek\\workspace\\AlertServlet\\resources\\outboundKML\\test.kml</href>
<refreshMode>onInterval</refreshMode>
<refreshInterval>20</refreshInterval>
</Link>
</NetworkLink>
</Document>
</kml>
To point Google Earth to a kml file (lets call it test.kml). When I load test.kml regularly (without using load.kml) the range I set works correctly (the zoom level is how I set it).
But when test.kml gets loaded using load.kml the range is incorrect. The placemark zooms in really far and ignores the range I set in the test.kml file.
Is there something overriding the range inside load.kml?
Example of test.kml:
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:location="http://example.com">
<Document>
<name>Example</name>
<Style id="alertKMLStyle">
<BalloonStyle>
<text><![CDATA[<center>
<b><font color="#CC0000" size="+8">$[name]</font></b>
<br/></center><br/>
<font size="+2">$[description]</font>
<br/><br/>
]]></text>
</BalloonStyle>
</Style>
<Placemark>
<name>Example Name</name>
<description>Example Description</description>
<LookAt>
<location:coordinates>800</location:coordinates>
<longitude>2.294</longitude>
<latitude>48.858</latitude>
<altitude>0.5</altitude>
<heading>12.23742976490019</heading>
<tilt>0</tilt>
<range>115718.4889366544</range>
<gx:altitudeMode>relativeToSeaFloor</gx:altitudeMode>
</LookAt>
<styleUrl>#alertKMLStyle</styleUrl>
<gx:balloonVisibility>1</gx:balloonVisibility>
<Point>
<gx:drawOrder>1</gx:drawOrder>
<coordinates>2.294,48.858,0</coordinates>
</Point>
</Placemark>
</Document>
</kml>
There are a few undocumented differences when you load KML directly as opposed to via a NetworkLink.
When you load the KML via the NetworLink it looks for a LookAt or Camera in the outermost element which is the Document in test.kml file.
You can either 1) copy/move the <LookAt> from the Placemark to the parent Document element in test.kml or 2) copy the <LookAt> and insert into the NetworkLink in load.kml and make flyToView=0.
If the target KML has timestamps then the behavior via Networklinks is different then loading it directly. See related issue.

kml gx track dynamic update from real time data

I want to get coordinates every second and update the track on google earth in the kml file
I know i need a network link with an update that is added coordinates with the time and refresh it every second but i couldn't find any complete examples that show this and the update part is confusing me. I was wondering if someone could write out a simple example?
If you want to generate KML and update on a regular interval then you create a root KML such as this:
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<NetworkLink>
<name>NetworkLink example</name>
<Link>
<href>http://...</href>
<refreshMode>onInterval</refreshMode>
<refreshInterval>5</refreshInterval>
</Link>
</NetworkLink>
</kml>
If your area of interest is a "small" or locallized then you may want to add a Region to the NetworkLink and viewRefreshMode element with onRegion value to only refresh when the region is active (e.g., within the current view).
<NetworkLink>
<name>NetworkLink example with Region</name>
<Region>
</Region>
...
<Link>
<href>http://...</href>
<refreshMode>onInterval</refreshMode>
<refreshInterval>5</refreshInterval>
<viewRefreshMode>onRegion</viewRefreshMode>
</Link>
</NetworkLink>
For NetworkLinkControl a tutorial can be found here with a working example.
https://developers.google.com/kml/documentation/updates

delaying balloon component in a KML code

I have just started to learn how to manipulate the KML files. here is a problem that I do not know how to overcome.... I created a polygon and added a description to be shown as a balloon, but it appears as soon as Google Earth starts working before the polygon can be seen. what I want is to show the balloon from a specific distance where the polygon appears(for example in the range distance of LookAt element).
anybody knows how to manage that?
my code follows:
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2" mlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">
<LookAt>
<longitude>17.99514610290434</longitude>
<latitude>59.36293893395309</latitude>
<altitude>0</altitude>
<range>597.51212259908</range>
<tilt>52.34415598649959</tilt>
<heading>105.3974737169693</heading>
</LookAt>
<Placemark>
<name>Stadium</name>
<description>
<![CDATA[
this is <b><i>RĂ¥sunda soccer stadium</i></b>
]]>
</description>
<gx:balloonVisibility>1</gx:balloonVisibility>
<styleUrl>#msn_ylw-pushpin</styleUrl>
<Polygon>
<extrude>1</extrude>
<tessellate>1</tessellate>
<altitudeMode>absolute</altitudeMode>
<outerBoundaryIs>
<LinearRing>
<coordinates>
17.99514610290434,59.36293893395309,100 17.99651951950199,59.36209399425741,100 17.99752330705672,59.36252751885282,100 17.99613146514916,59.36335387902954,100 17.99514610290434,59.36293893395309,100
</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</Placemark>
</Document>
</kml>
Normally you can skip rendering the polygon until you get "close" enough to it as defined by a Region element which is determined by calculating when a given area maps to a min or max # of pixels.
Also, the <gx:balloonVisibility> tag forces the description balloon to appear when the KML is loaded regardless of whether Region is active. Adding a Region direct in the KML still shows the popup balloon.
To do what you want to do, you must wrap the KML file with a second KML file with a NetworkLink with a Region that loads the seconds KML only when the region is active (aka close enough) at which time the description is displayed along with the polygon.
<?xml version="1.0" encoding="utf-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
<LookAt>
<longitude>17.99514610290434</longitude>
<latitude>59.36293893395309</latitude>
<altitude>0</altitude>
<heading>105.3974737169693</heading>
<tilt>52.34415598649959</tilt>
<range>597.51212259908</range>
</LookAt>
<NetworkLink>
<Region>
<LatLonAltBox>
<north>59.363792</north>
<south>59.361556</south>
<east>17.998029</east>
<west>17.994443</west>
</LatLonAltBox>
<Lod>
<minLodPixels>128</minLodPixels>
<maxLodPixels>-1</maxLodPixels>
</Lod>
</Region>
<Link>
<href>target.kml</href>
</Link>
</NetworkLink>
</Document>
</kml>
And target.kml file contains the original KML you gave:
<?xml version="1.0" encoding="ISO-8859-1"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Placemark>
<name>Stadium</name>
...
</Placemark>
</kml>
You can change the distance the feature + balloon appears by adjusting the minLodPixels value and/or the size of the region. At present the feature will display when the region defined by area surrounding the polygon is at least 128 pixels on the screen. Change to 32 or 64 and/or make the region area larger to make it appear quicker.
Note Google Earth client doesn't give you a tool to edit or even see the Region bounding boxes on the map so debugging this is tricky. You can paste your KML into this tool to generate KML making the Region bounding area visible. This helps to debug Regions more easily.

Display a hierarchy of placemarks in google earth

I am trying to use kml to implement a heirarchy of regions as describe in
KML 2.1 Tutorial
I would like to have a feature(polygon or icon) representing a region and when the region becomes active I would like to display a feature representing each of the regions immediate children but no longer display the icon representing the parent region.
An example would be if I had a region representing Canada and a placemark in the middle of the region. When the Canada region becomes active I want the canada placemark to disappear and want to display placemarks over the provinces of Canada(a region and placemark for BC, Alberta ect.). Then when the BC region became active I would like to replace the bc placemark with placemarks for cities in bc.
Any help would be greatly appreciated.
Thank you.
You are on the right track, Regions are what you want. Check out this page for more info on how to use them
http://code.google.com/apis/kml/documentation/regions.html
In particular, you need to understand the Level of Detail (LOD). The LOD determines the view boundaries that activates and deactivates the region. In the end you need to create Regions in this format.
<Region>
<LatLonAltBox>
<north>50</north>
<south>45</south>
<east>28</east>
<west>22</west>
</LatLonAltBox>
<Lod>
<minLodPixels>128</minLodPixels>
<maxLodPixels>1024</maxLodPixels>
</Lod>
</Region>
You can set -1 so the region is ALWAYS shown, no matter how far someone zooms OUT or if you use the value above (128) that means that the bounding box you set, must take up 128x128 pixels of the viewers screen before it gets activated (seen).
The is what you use to turn the view off as they zoom in. Or leave at -1 so it never turns off no matter how far someone zooms IN.
For your question, you would have a region that contains a placemark in the middle of Canada. That region would have a minlodpixels of -1 and a maxlodpixels that corresponds with the minlodpixels of another region (which shows the placemarks in the provinces) I would make a region for each province seperately.
The trick is working out the boundaries of the - I use a square polygon with four points and then look at its code to extract the etc
Actually, here is a great page to show you how to create regions - make sure you download the kml called 'Screen Overlay Size Guide' - it makes things a LOT easier
http://earth.google.ca/intl/en_ca/outreach/tutorial_region.html
I am trying to do the same thing and came up with a solution that works however it requires many calls to the server.
In your base kml loaded from http://example.com/zones.kml you would have
<?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>
This requires two more kml files that are loaded to hide or show the children of a particular placemark.
The kml for hiding the children would be loaded from http://example.com/1/hide_children.kml and contains the networklinkcontrol to hide the children
<?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>
The kml for showing the children would be loaded from http://example.com/1.kml and contains the networklinkcontrol to show the children the children
<?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>
It would be best if you could define 2 different regions one for minLod and one for maxLod so you didn't need to have so many calls to servers and you didn't have to call the server to load children you have already loaded but I have not figured out how to do this yet.
This need to be optimized quite a bit. Please let me know if anyone can help find a more direct way of doing this. Thanks

KML Network Link - Fly To

I am developing an application that launches Google Earth with a KML file that links to other local files via <NetworkLink>, which does Time Interval refreshing. I'm trying to define a KML file that will center the map (fly to) a specific location.
Network Link has a tag which flies to the first placemark or FlyTo within the file. However, this would execute the fly to whenever the file is refreshed, which in my case, is when the Time Interval expires. Is there some way that I can have the fly-to command execute only when the linked network file changes, rather than every time? Is there any way to have the Fly To process only once until the linked file is changed somehow? My NetworkLink file is defined as follows:
<NetworkLink>
<name>My Fly To Request</name>
<Link>
<href>MyFlyTo.kmz</href>
<refreshMode>onInterval</refreshMode>
<refreshInterval>2</refreshInterval>
</Link>
</NetworkLink>
The application will frequently update the the specific placemark to be centered on when the user requests. It is not a static placemark that needs to be centered on, but one that will change frequently.
I believe you could achieve this by using a combination of ID attributes and the NetworkLinkControl and Update element in Kml.
The MyFlyToRequest.kml file contains the NetworkLink that loads the data file, which contains your data, it has the flyToView element set to true. Notice too the network link also has an id of request
MyFlyToRequest.kml
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<NetworkLink id="request">
<name>My Fly To Request</name>
<Link>
<href>http://www.yourserver.com/MyFlyTo.kmz</href>
<refreshMode>onInterval</refreshMode>
<refreshInterval>2</refreshInterval>
</Link>
<flyToView>1</flyToView>
</NetworkLink>
</kml>
The second file, MyFlyTo.kmz, is the one loaded. It has your current data as is..,However, it would also have an additional NetworkLink that loads a new third file.
MyFlyTo.kmz - Edited
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document id="data">
<visibility>1</visibility>
<NetworkLink>
<name>Update MyFlyToRequest</name>
<Link>
<href>http://www.yourserver.com/TurnOffFlyTo.kml</href>
</Link>
</NetworkLink>
<Placemark>
<name>This is flown to once (hopefully)</name>
<Point>
<coordinates>52,0,0</coordinates>
</Point>
</Placemark>
</Document>
</kml>
The new third file TurnOffFlyTo.kml is part of the key to the set up, it contains a NetworkLinkControl that targets the request NetworkLink in the first MyFlyToRequest.kml file. It simply sets flyToView element to 0.
TurnOffFlyTo.kml
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<NetworkLinkControl>
<Update>
<targetHref>http://www.yourserver.com/MyFlyToRequest.kml#request</targetHref>
<Change>
<NetworkLink id="request">
<!-- turn off the flyto behaviour -->
<flyToView>0</flyToView>
</NetworkLink>
</Change>
</Update>
</NetworkLinkControl>
</kml>
The final file TurnOnFlyTo.kml simply retoggles the flyto behaviour again.
TurnOnFlyTo.kml
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<NetworkLinkControl>
<Update>
<targetHref>http://www.yourserver.com/MyFlyToRequest.kml#request</targetHref>
<Change>
<NetworkLink id="request">
<!-- turn off the flyto behaviour -->
<flyToView>1</flyToView>
</NetworkLink>
</Change>
</Update>
</NetworkLinkControl>
</kml>
The logic is as follows.
MyFlyToRequest.kml loads MyFlyTo.kml
flyto is enabled so the view moves the first first placemark, etc, in MyFlyTo.kml
The link in MyFlyTo.kml loads TurnOffFlyTo.kml.
The Update in TurnOffFlyTo.kml three disables flyto in MyFlyToRequest.kml.
File one, refreshes, loads file two...
If you need to re-enable the flyto, you would simply load File four. If the data in MyFlyTo.kmz is being generated by you it would be a simple case of loading TurnOnFlyTo.kml right where TurnOffFlyTo.kml was called.
All that said, this is not tested and as such might not work as is, although in principal I don't see why it wouldn't.
If it sounds like something you might try here are a few resources that should help.
NetworkLinkControl Reference
http://code.google.com/apis/kml/documentation/kmlreference.html#networklinkcontrol
Using Updates
http://code.google.com/apis/kml/documentation/updates.html

Resources