Export selected Features to KML/KMZ

3615
2
06-02-2013 10:21 PM
Udaya_BhaskerCheerala
New Contributor
Hi All,

I would like to export selected features or selected Area on the map to KML/KMZ format. Is it possible using Flex API? if yes please let me know how.

Thanks,
-U
Tags (2)
0 Kudos
2 Replies
AnthonyGiles
Frequent Contributor
Uday,

It is possible but you would have to write your own function to do it. The main problem you will end up having is getting the KML to have the same symbology as your features. I have written an exporter for a draw widget that exports all drawn graphics to KML. Below is the code that may give you some pointers:

private function saveKML():void 
{
 //create string to hold KML
 var KML:String = new String;
 KML = "";
 KML = '<?xml version="1.0" encoding="UTF-8"?>\n<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">\n<Document>\n<Folder>\n';
 
 for (var i:int = 0; i < graphicsLayer.numGraphics; i++)
 {
  var gra:Graphic = graphicsLayer.getChildAt(i) as Graphic;
  var symTypeName:String = "";
  var symType:String = "";
  var symLType:String = "";
  var symFontE:String = "";
  var symFontP:String = "middle";
  var symSize:Number = 1;
  var symColor:Number = 0x000000;
  var symColor2:Number = 0x000000;
  var symColor3:Number = 0x000000;
  var symWidth:Number = 1;
  var symText:String = "";
  var symAlpha1:Number = 1;
  var symAlpha2:Number = 1;
  var geomType:String = "";
  var geomSR:Number;
  var gname:String = "";
  var symAngle:Number = 0;
  var symcolour:String = "";
  var polysymcolour:String = "";
  var symAlpha:String = "FF";
  var symAlphaOutline:String = "FF"; 
  
  switch(gra.geometry.type)
  {
   case Geometry.MAPPOINT:
   {
    var pnt:MapPoint = gra.geometry as MapPoint;
    KML = KML + "<Placemark>\n<Style>\n<IconStyle>\n<scale>1.000000</scale>\n<Icon>\n<href>" + kmlPointSymbol + "</href>\n</Icon>\n</IconStyle>\n</Style>\n<name>" + gra.attributes.title + "</name>\n<description>" + gra.attributes.content + "</description>\n<Point>\n<coordinates>\n" + pnt.x.toString() + "," + pnt.y.toString() + "\n</coordinates>\n</Point>\n</Placemark>\n";
    break;
   }
   case Geometry.POLYLINE:
   {
    var polyline:Polyline = gra.geometry as Polyline;
    var lineSym:SimpleLineSymbol = gra.symbol as SimpleLineSymbol;
    symcolour = lineSym.color.toString(16);
    while (symcolour.length < 6)
    {
     symcolour = 0 + symcolour;
    }
    symWidth = lineSym.width;
    symAlpha = (lineSym.alpha * 255).toString(16);
    
    for (var i1:int = 0; i1 < polyline.paths.length; i1++)
    {
     KML = KML + "<Placemark>\n<name>" + gra.attributes.title + "</name>\n<description>" + gra.attributes.content + "</description>\n<Style>\n<LineStyle>\n<color>" + symAlpha + symcolour.substr(4,2) + symcolour.substr(2,2) + symcolour.substr(0,2)  + "</color>\n<width>" + symWidth + "</width>\n</LineStyle>\n</Style>\n<LineString>\n<coordinates>\n";
     for (var j:int = 0; j < polyline.paths[i1].length; j++)
     {
      var mp:MapPoint = polyline.getPoint(i1,j) as MapPoint;
      KML = KML + mp.x.toString() + "," + mp.y.toString() + ",0 ";
      
     }
     KML = KML + "\n</coordinates>\n</LineString>\n</Placemark>\n";
    }
    break;
   }
   case Geometry.POLYGON:
   {
    var poly:Polygon= gra.geometry as Polygon;
    var polySym:SimpleFillSymbol = gra.symbol as SimpleFillSymbol;
    
    polysymcolour = polySym.color.toString(16);
    
    while (polysymcolour.length < 6)
    {
     polysymcolour = 0 + polysymcolour;
    }
    
    symcolour = polySym.outline.color.toString(16);
    
    while (symcolour.length < 6)
    {
     symcolour = 0 + symcolour;
    }
    
    symWidth = polySym.outline.width;
    
    if(polySym.style != "solid")
    {
     symAlpha = (polySym.alpha * 128).toString(16);
    }
    else
    {
     symAlpha = (polySym.alpha * 255).toString(16);
    }
    
    symAlphaOutline = (polySym.outline.alpha * 255).toString(16);
    
    for (var i2:int = 0; i2 < poly.rings.length; i2++)
    {
     KML = KML + "<Placemark>\n<name>" + gra.attributes.title + "</name>\n<description>" + gra.attributes.content + "</description>\n<Style>\n<PolyStyle>\n<color>" + symAlpha + polysymcolour.substr(4,2) + polysymcolour.substr(2,2) + polysymcolour.substr(0,2) + "</color>\n</PolyStyle>\n<LineStyle>\n<color>" + symAlphaOutline + symcolour.substr(4,2) + symcolour.substr(2,2) + symcolour.substr(0,2)  + "</color>\n<width>" + symWidth + "</width>\n</LineStyle>\n</Style>\n<Polygon>\n<outerBoundaryIs>\n<LinearRing>\n<coordinates>\n";
     for (var j1:int = 0; j1 < poly.rings[i2].length; j1++)
     {
      var mp2:MapPoint = poly.getPoint(i2,j1) as MapPoint;
      KML = KML + mp2.x.toString() + "," + mp2.y.toString() + " ";
     }
     KML = KML + "\n</coordinates>\n</LinearRing>\n</outerBoundaryIs>\n</Polygon>\n</Placemark>\n";
    }
    break;
   }
    //case Geometry.EXTENT:
    //{
    //var rect:Extent= gra.geometry as Extent;
    //KML = KML + "<Placemark><name>" + gra.attributes.title + "</name><Polygon><outerBoundaryIs><LinearRing><coordinates>" + rect.xmin + "," + rect.ymin + " " + rect.xmax + "," + rect.ymin + " " + rect.xmax + "," + rect.ymax + " " + rect.xmin + "," + rect.ymax + "</coordinates></LinearRing></outerBoundaryIs></Polygon></Placemark>";
    //break;
    //}
  }
  
 }
 KML = KML + "</Folder>\n</Document>\n</kml>";
 if(!fr) fr = new FileReference();
 fr.save(KML,"SavedGraphics.kml"); 
}


Regards

Anthony
0 Kudos
Udaya_BhaskerCheerala
New Contributor
Anthony,

Thankyou very much. I will try to export the selected features using the below code.

Thanks,
-U











Uday,

It is possible but you would have to write your own function to do it. The main problem you will end up having is getting the KML to have the same symbology as your features. I have written an exporter for a draw widget that exports all drawn graphics to KML. Below is the code that may give you some pointers:

private function saveKML():void 
{
 //create string to hold KML
 var KML:String = new String;
 KML = "";
 KML = '<?xml version="1.0" encoding="UTF-8"?>\n<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">\n<Document>\n<Folder>\n';
 
 for (var i:int = 0; i < graphicsLayer.numGraphics; i++)
 {
  var gra:Graphic = graphicsLayer.getChildAt(i) as Graphic;
  var symTypeName:String = "";
  var symType:String = "";
  var symLType:String = "";
  var symFontE:String = "";
  var symFontP:String = "middle";
  var symSize:Number = 1;
  var symColor:Number = 0x000000;
  var symColor2:Number = 0x000000;
  var symColor3:Number = 0x000000;
  var symWidth:Number = 1;
  var symText:String = "";
  var symAlpha1:Number = 1;
  var symAlpha2:Number = 1;
  var geomType:String = "";
  var geomSR:Number;
  var gname:String = "";
  var symAngle:Number = 0;
  var symcolour:String = "";
  var polysymcolour:String = "";
  var symAlpha:String = "FF";
  var symAlphaOutline:String = "FF"; 
  
  switch(gra.geometry.type)
  {
   case Geometry.MAPPOINT:
   {
    var pnt:MapPoint = gra.geometry as MapPoint;
    KML = KML + "<Placemark>\n<Style>\n<IconStyle>\n<scale>1.000000</scale>\n<Icon>\n<href>" + kmlPointSymbol + "</href>\n</Icon>\n</IconStyle>\n</Style>\n<name>" + gra.attributes.title + "</name>\n<description>" + gra.attributes.content + "</description>\n<Point>\n<coordinates>\n" + pnt.x.toString() + "," + pnt.y.toString() + "\n</coordinates>\n</Point>\n</Placemark>\n";
    break;
   }
   case Geometry.POLYLINE:
   {
    var polyline:Polyline = gra.geometry as Polyline;
    var lineSym:SimpleLineSymbol = gra.symbol as SimpleLineSymbol;
    symcolour = lineSym.color.toString(16);
    while (symcolour.length < 6)
    {
     symcolour = 0 + symcolour;
    }
    symWidth = lineSym.width;
    symAlpha = (lineSym.alpha * 255).toString(16);
    
    for (var i1:int = 0; i1 < polyline.paths.length; i1++)
    {
     KML = KML + "<Placemark>\n<name>" + gra.attributes.title + "</name>\n<description>" + gra.attributes.content + "</description>\n<Style>\n<LineStyle>\n<color>" + symAlpha + symcolour.substr(4,2) + symcolour.substr(2,2) + symcolour.substr(0,2)  + "</color>\n<width>" + symWidth + "</width>\n</LineStyle>\n</Style>\n<LineString>\n<coordinates>\n";
     for (var j:int = 0; j < polyline.paths[i1].length; j++)
     {
      var mp:MapPoint = polyline.getPoint(i1,j) as MapPoint;
      KML = KML + mp.x.toString() + "," + mp.y.toString() + ",0 ";
      
     }
     KML = KML + "\n</coordinates>\n</LineString>\n</Placemark>\n";
    }
    break;
   }
   case Geometry.POLYGON:
   {
    var poly:Polygon= gra.geometry as Polygon;
    var polySym:SimpleFillSymbol = gra.symbol as SimpleFillSymbol;
    
    polysymcolour = polySym.color.toString(16);
    
    while (polysymcolour.length < 6)
    {
     polysymcolour = 0 + polysymcolour;
    }
    
    symcolour = polySym.outline.color.toString(16);
    
    while (symcolour.length < 6)
    {
     symcolour = 0 + symcolour;
    }
    
    symWidth = polySym.outline.width;
    
    if(polySym.style != "solid")
    {
     symAlpha = (polySym.alpha * 128).toString(16);
    }
    else
    {
     symAlpha = (polySym.alpha * 255).toString(16);
    }
    
    symAlphaOutline = (polySym.outline.alpha * 255).toString(16);
    
    for (var i2:int = 0; i2 < poly.rings.length; i2++)
    {
     KML = KML + "<Placemark>\n<name>" + gra.attributes.title + "</name>\n<description>" + gra.attributes.content + "</description>\n<Style>\n<PolyStyle>\n<color>" + symAlpha + polysymcolour.substr(4,2) + polysymcolour.substr(2,2) + polysymcolour.substr(0,2) + "</color>\n</PolyStyle>\n<LineStyle>\n<color>" + symAlphaOutline + symcolour.substr(4,2) + symcolour.substr(2,2) + symcolour.substr(0,2)  + "</color>\n<width>" + symWidth + "</width>\n</LineStyle>\n</Style>\n<Polygon>\n<outerBoundaryIs>\n<LinearRing>\n<coordinates>\n";
     for (var j1:int = 0; j1 < poly.rings[i2].length; j1++)
     {
      var mp2:MapPoint = poly.getPoint(i2,j1) as MapPoint;
      KML = KML + mp2.x.toString() + "," + mp2.y.toString() + " ";
     }
     KML = KML + "\n</coordinates>\n</LinearRing>\n</outerBoundaryIs>\n</Polygon>\n</Placemark>\n";
    }
    break;
   }
    //case Geometry.EXTENT:
    //{
    //var rect:Extent= gra.geometry as Extent;
    //KML = KML + "<Placemark><name>" + gra.attributes.title + "</name><Polygon><outerBoundaryIs><LinearRing><coordinates>" + rect.xmin + "," + rect.ymin + " " + rect.xmax + "," + rect.ymin + " " + rect.xmax + "," + rect.ymax + " " + rect.xmin + "," + rect.ymax + "</coordinates></LinearRing></outerBoundaryIs></Polygon></Placemark>";
    //break;
    //}
  }
  
 }
 KML = KML + "</Folder>\n</Document>\n</kml>";
 if(!fr) fr = new FileReference();
 fr.save(KML,"SavedGraphics.kml"); 
}


Regards

Anthony
0 Kudos