Suite

Bibliothèque C# / .NET pour convertir GeoJson en KML

Bibliothèque C# / .NET pour convertir GeoJson en KML


J'extrait des données d'ArcGIS à l'aide d'ArcGIS.PCL qui fournit les géométries en tant que GeoJson. J'aimerais convertir ce GeoJson en KML. Quelqu'un connaît-il des bibliothèques .NET qui offrent cette fonctionnalité ? J'ai fait une bonne recherche mais rien n'est apparu sur mon radar.

Je suppose que quelques bibliothèques peuvent être nécessaires s'il n'y a pas de fourre-tout pour ce problème. Un qui peut convertir GeoJson en WKT puis un autre qui peut convertir WKT en KML.


Je n'ai pas trouvé de bibliothèque, mais j'ai codé une solution adaptée à mes besoins pour gérer uniquement les polygones. Le code est fourni ci-dessous pour toute autre personne qui pourrait le trouver utile.ConvertirGeoJsonEnKmlgénère un KML complet etConvertirGeoJsonEnKmlGeometryUniquementgénère une sortie KML réduite adaptée à une utilisation dans Google Fusion Tables.

en utilisant ArcGIS.ServiceModel.Common ; en utilisant ArcGIS.ServiceModel.GeoJson ; en utilisant Newtonsoft.Json ; en utilisant le système ; en utilisant System.Linq ; en utilisant System.Xml.Linq ; espace de noms MyKickassProject.Utilities { classe statique publique GeometryUtils { chaîne statique publique ConvertGeoJsonToKml(chaîne geoJson) { SharpKml.Dom.Document kmlDocument = new SharpKml.Dom.Document(); SharpKml.Dom.Placemark kmlPlacemark = new SharpKml.Dom.Placemark(); kmlPlacemark.Geometry = GeneratePolygon(geoJson); kmlDocument.AddFeature(kmlPlacemark); SharpKml.Dom.Kml kml = nouveau SharpKml.Dom.Kml(); kml.Feature = kmlDocument; var serializer = new SharpKml.Base.Serializer(); sérialiseur.Serialize(kml); retourner serializer.Xml; } chaîne statique publique ConvertGeoJsonToKmlGeometryOnly(string geoJson) { SharpKml.Dom.Polygon kmlPolygon = GeneratePolygon(geoJson); var serializer = new SharpKml.Base.Serializer(); serializer.SerializeRaw(kmlPolygon); return RemoveAllNamespaces(serializer.Xml); } statique privée SharpKml.Dom.Polygon GeneratePolygon(string geoJson) { var polygone = JsonConvert.DeserializeObject(geoJson); if (polygon.Coordinates.Count > 0) { SharpKml.Dom.Polygon kmlPolygon = new SharpKml.Dom.Polygon(); SharpKml.Dom.OuterBoundary kmlOuterBoundary = new SharpKml.Dom.OuterBoundary(); kmlOuterBoundary.LinearRing = PointCollectionToLinearRing(polygon.Coordinates[0]); kmlPolygon.OuterBoundary = kmlOuterBoundary; if (polygon.Coordinates.Count > 1) { for (int i = 1; i < polygon.Coordinates.Count; i++) { SharpKml.Dom.InnerBoundary kmlInnerBoundary = new SharpKml.Dom.InnerBoundary(); kmlInnerBoundary.LinearRing = PointCollectionToLinearRing(polygon.Coordinates[i]); kmlPolygon.AddInnerBoundary(kmlInnerBoundary); } } return kmlPolygon; } throw new Exception("Le type GeoJSON n'est pas géré."); } statique privée SharpKml.Dom.LinearRing PointCollectionToLinearRing(coordonnées PointCollection) { var linearRing = new SharpKml.Dom.LinearRing(); linearRing.Coordinates = new SharpKml.Dom.CoordinateCollection(); var points = coordonnees.AsEnumerable(); foreach (var point en points) { linearRing.Coordinates.Add(new SharpKml.Base.Vector(point[1], point[0])); } return linearRing; } chaîne statique privée RemoveAllNamespaces(string xmlDocument) { XElement xmlDocumentWithoutNs = RemoveAllNamespaces(XElement.Parse(xmlDocument)); return xmlDocumentWithoutNs.ToString(); } private static XElement RemoveAllNamespaces(XElement xmlDocument) { if (!xmlDocument.HasElements) { XElement xElement = new XElement(xmlDocument.Name.LocalName); xElement.Value = xmlDocument.Value; foreach (attribut XAttribute dans xmlDocument.Attributes()) xElement.Add(attribute); renvoie xElement ; } return new XElement(xmlDocument.Name.LocalName, xmlDocument.Elements().Select(el => RemoveAllNamespaces(el))); } } }

Peut-être pourriez-vous utiliser une approche basée sur GDAL ? Il semble que quelqu'un ait écrit des liaisons GDAL pour C#, ce qui peut aider, même si je ne peux pas dire que j'ai moi-même utilisé la bibliothèque…

Bonne chance