ThinkGeo.com    |     Documentation    |     Premium Support

KML Styles imported into MapSuite

The user of my MapSuite Desktop edition application have been asking for the ability to import and export KML files from/to feature layers.  Until the last few days,  I had been using an early build of MapSuite Desktop edition 7.0.0.0.  So in order to get import and export to work I had download and built the sample application “KMLExtension”   This project defined KMLFeatureLayer, KMLFeatureSource, and KMLStyle  using these classes and several other classes already built in to 7.0.0.0,  I am able to get basic import/export of KML to work.  The export side appears to be doing at least some basic output from LineStyle, AreaStyle, PointStyle etc to the KML Style settings.   On import, the KML Styles are ignored.  There is a KMLStyle class in the KMLExtension but it doesn’t appear to be used and is mostly hardcoded.  I have started to write some code to parse the KML and save the style settings to be able to use then when the layers are drawn.  It appears that KML will allow style to be defined at several levels.  Some style appear to apply across the entire file while other style are set in specific objects.  This means that the Features need to store the name of the Style and perform a lookup when the Feature is drawn.  



My question is whether parsing and applying KML Style is available in the built in classes in MapSuite Desktop Edition 8.0.0.0.  Is there some other way that MapSuiteCore provides the ability to process Style information beyond the built in KML classes?  In order to use the code I had built into KMLExtension for 7.0.0.0. I will need to extend the built in KMLFeatureSource in 8.0.0.0.  Is there a recomendation on the best way to override the KMLFeatureSource in MapSuiteCore.dll?





Richard Styer

Hi Richard, 
  
 Comparing with 7.0, we added a lots of new features in map suite 8.0. The KML support is the one of them and it is total difference with KMLExtension and more powerful. It have integrated in MapSuiteCore, more details please refer to the Api wiki.thinkgeo.com/wiki/ThinkGeo.MapSuite.Core => KmlFeatureLayer,KmlFeatureSource,KmlAdornmentLayer etc. 
  
 If the Kml feature is not fit for your case, please let us know more details on your case. 
 Thanks, 
 Troy

Tony,



Thanks for the quick response. 



I have tried to attach file to illustrate the KML Styles.  Below is a small sample of the KML file that I would like to import.

<?xml version=“1.0” encoding=“UTF-8”?>

<kml xmlns=“opengis.net/kml/2.2”>

<Document>

<Style id=“transBluePoly”>

<LineStyle>

<width>1.5</width>

</LineStyle>

<PolyStyle>

<color>7dff0000</color>

</PolyStyle>

</Style> <Placemark>

<styleUrl>#transBluePoly</styleUrl>

<Polygon>

<extrude>1</extrude>

<altitudeMode>clampToGround</altitudeMode>

<outerBoundaryIs>

<LinearRing>

<coordinates> 

-76.6925,39.37722,17

-77.0025,39.25722,17

-76.9325,39.19722,17

-76.9725,39.24722,17

-76.6925,39.37722,17

 </coordinates>

</LinearRing>

</outerBoundaryIs>

</Polygon>

</Placemark>

</Document>

</kml>





I can import the polygon just fine. But my user would like to see the polygon on the MapSuite map with the same color defined in the KML (in this case the “TransPolyBlue” for the PolyStyle).  I had started to modify the KMLFeatureSource with some extensions to parse the KML PolyStyle and LineStyle.  I then added some methods “GetLineStyleKml” GetPolyStyleKml" to get the settings from the KML and define MapSuite LineStyle, AreaStyle and so on. I have tried to attach my modification in the source file.  My implementation is not complete since it doesn’t support the style “id” from the KML.  Since the KMLFeatureSource is now part of MapSuite.core my extensions are not available in the KMLFeatureSource so now I need another method to handle the Styles from the KML.   I was wondering in the KMLFeatureSource MapSuite.Core provides the ability to parse and references the KML linestype, polystyle, textstyle …  but I do not see it in the API.   I thought I might not be looking in the right places.



Should I continue with my implementation or is there a MapSuite class/API that I’m missing?



Richard Styer

KmlFeatureSourceExtension.cs (22.8 KB)

Hi Richard,



In Map Suite 8.0, we took a lot of time to support the Kml feature and I think the KmlFeatureLayer should be robust on displaying a kml file. I don’t think we continue to spend more time on the original way. In order to display a kml file layer, we can just use the below codes to show the layer and don’t need to care how to get the styles and then render the features with the styles, as the KmlFeatureLayer have implements in behind.


KmlFeatureLayer kmllayer = new KmlFeatureLayer(@"…/…/test.kml");
LayerOverlay overlay = new LayerOverlay();
overlay.Layers.Add(kmllayer);
Map1.Overlays.Add(overlay);
Map1.Refresh();

Also, we can get the translated kml style with:

AreaStyle defaultAreaStyles = kmllayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle;
LineStyle defaultLineStyles = kmllayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle;


And get the features with:

Collection<Feature> features = kmllayer.FeatureSource.GetAllFeatures(ReturningColumnsType.AllColumns); 



Please let me know if there is anything I am misunderstanding.

Thanks,

Troy

Troy, 
  
 Thanks for the repsonse. 
  
 This is great.  I did not know that the Map Suite 8.0 KMLFeatureLayer was parsing the AreaStyle and LineSyle from the KML.  I tried this and it works as simple as you have shown.  I assume it also parse the KML LabelStyle to DefaultTextStyle and maybe even the KML IconStyle to the DefaultPointStyle.  I can tell that ThinkGeo has put a lot of time into supporting the KML FeatureLayer. 
  
 Does the KMLFeatureLayer/KMLFeatureSource also support the KML Style (LineStyle, PolyStyle, LabelStyle, IconStyle) for each "Feature".  I have a KMl File with placemarks where each placemark looks like: 
  
 <Placemark> 
    <name>NoAmer</name> 
    <Style> <LineStyle><color>ff0000ff</color></LineStyle> <PolyStyle><fill>0</fill></PolyStyle></Style>
<extendedData....

</Placemark>

Is there a method to access the style for each feature?

There is also the KML "StyleUrl" where multiple style are defined by id at the beginning of the KML file and then each feature can use the <StyleURL>#stylename</StyleURL> to referenc a specific style. Is this supported?

Thanks for your help.

Richard





Hi Richard,  
  
 We did support this, to get the style of each feature, you can call "GetAllMapShape" to get all the "MapShape" in the specified boundingbox, and then you can find its style of a feature by using the code as following: 
  
 foreach(var mapShape in mapShapes) 
 { 
      var style = mapShape.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle/DefaultLineStyle/DefaultPointStyle; 
 } 
  
 Can you show me your requirements here? Maybe I can show you how to do it and how the Map Suite support it, and what APIs can used. 
  
 Thanks, 
 Johnny

Johnny, 
  
 Thanks for the sample. 
  
 The requirement are still fairly simple. The user had a google earth map with various graphics like several cirles of various colors, several polygons of different colors, and set of placemarks of red, green, yellow and blue markers.  When they export the Google Earth to KML and the KML is imported into MapSuite they would like all the cirlces, polygons, placemarks, etc. to be render is the same colors as close as it is possible.  
  
 With the sample you have given me above, I will be able to experiment with the mapShapes and hopefully be able to get this going.   It may be a few days but I am going to try working with a few samples to see how far I can get. 
  
 Thanks for your responses. You have been very helpful. 
  
 Richard

Hi Richard,



I think it is very common to try to keep the original view from Google Earth to Map suite and that’s our finial goal for the Kml support. Currently, I think map suite supports well on most of case like restore all kinds of styles defined in kml file and all kinds of markers, shapes etc. But since this is a new feature, I can image there are many potential issues or new functions we are missing during test. So, please feel free to let us know if you find anything.



I want to do some notes here for map suite kml. In map suite, currently, we define four layers for KML.


        
  • KmlLayer: Include all the elements in the kml file like place markers, geometry shapes, raster image, adornment element etc…

  •     
  • KmlFeatureLayer : Includes only geometry shapes, of course, includes its styles.

  •     
  • KmlRasterLayer: Includes only the Raster images.

  •     
  • KmlAdornmentLayer : Includes only adornment elements.


One more thing I want to mention is for the only images addressed in kml file, considering the request from a online site would be show, we replace those images with our defined images or symbols. But I think we will figure out a better way on this.



I attached some codes and kml file, and hope it helps for you. Btw, we fixed a bug on GetAllMapShapes method, please get the latest version to apply the fix.

Thanks,

Troy

kml.zip (8.56 KB)