I am using ARCGis desktop and have written a quick conversion program to convert my layers to kml but I ran into some issues. It seems the only layers it can process correctly are group layers.
When it processes the group layers I am missing all the feature layers included in the group layer in the resulting doc.kml. It's also failing on feature layers with an error that says it's not a layer with the following message: ERROR 000840: The value is not a Layer. When I know it's a layer, I can pull it up in ARCMap and, indeed, ARCMap agrees with me that it's a layer. I can use the MapToKML function without issue but I need to control my layers individually so I was hoping I can generate KML for each individual layer on a map.
Thanks in advance for any help you can provide.
Here is my source code:
static void Main(string[] args)
{
IMapDocument mapDocument = new MapDocumentClass();
IPage page;
string mapFilename = @"c:\maps\BaseMap_NAD83_SD_StatePlane_Plumes_Scott.mxd";
Console.WriteLine("Initializing GEO...");
Geoprocessor GP = new Geoprocessor();
if (mapDocument.get_IsMapDocument(mapFilename) && mapDocument.get_IsPresent(mapFilename))
{
Console.WriteLine("Loading map...");
mapDocument.Open(mapFilename, "");
page = mapDocument.PageLayout.Page;
IMap map;
for (int iMapIndex = 0; iMapIndex < mapDocument.MapCount; iMapIndex++)
{
map = mapDocument.get_Map(iMapIndex);
Console.WriteLine("Converting layers for map {0}...", map.Name);
ILayer layer;
for (int iLayerIndex = 0; iLayerIndex < map.LayerCount; iLayerIndex++)
{
layer = map.get_Layer(iLayerIndex);
ConvertLayerToKML(GP, layer as ILayer2);
Marshal.ReleaseComObject(layer);
}
Marshal.ReleaseComObject(map);
}
}
mapDocument.Close();
Marshal.ReleaseComObject(mapDocument);
}
private static string[] ConvertLayerToKML(Geoprocessor GP, ILayer2 layer)
{
string [] messages = new string[] {};
string layerName = layer.Name;
LayerToKML layerToKML = new LayerToKML();
layerToKML.layer = layer;
layerToKML.layer_output_scale = 10000;
layerToKML.out_kmz_file = string.Format("{0}.kmz", layerName);
Console.WriteLine("Converting layer {0}", layerName);
object result = GP.Execute(layerToKML, null);
messages = new string[GP.MessageCount];
for (int i = 0; i < GP.MessageCount; i++)
{
messages[i] = GP.GetMessage(i);
}
return messages;
}