Uso de GeoJSON en .NET
GeoJSON es un formato comúnmente utilizado para almacenar y para trabajar con información o datos espaciales dentro de un objeto JSON.
La diferencia entre JSON y XML es que reducimos el tamaño de los datos a transportar eliminando información repetitiva e innecesaria, y mostrándolo de forma más natural.
La información que viaja por la red es menor, y adquiere más importancia cuando hablamos de dispositivos pequeños, redes de baja calidad o velocidad, etc.
En el caso de GeoJSON, es casi más relevante esta diferenciación sobre todo al tratar datos espaciales.
GeoJSON está dentro del estándar RFC 7946 The GeoJSON Format.
Puedes encontrar más información sobre GeoJSON en este enlace.
Podemos «jugar» con posiciones GPS en este otro enlace si queremos hacer más pruebas.
Existe un paquete denominado GeoJSON.NET que trabaja con la famosa y conocida librería Newtonsoft Json.NET para aplicar acciones de serialización y deserialización de datos GeoJSON.
En el caso de Bing, éste soporta también GeoJSON.
Para más información sobre Bing y GeoJSON accede al siguiente enlace.
Un ejemplo de GeoJSON para Bing con la localización de New York sería:
{ "type": "FeatureCollection", "features": [ { "type": "Feature", "geometry": { "type": "Point", "coordinates": [-74.006393, 40.714172] }, "properties": { "name": "New York", "description": "New York" } } ] }
Sin embargo, en el caso del uso de la librería GeoJSON.NET tenemos alguna pequeña diferencia.
De hecho, voy a hacer a continuación un breve ejemplo del uso de GeoJSON.NET en una aplicación de consola.
Lo primero a tener en cuenta es que podrás acceder a la información de GeoJSON.NET en este enlace.
Desde Visual Studio y con ayuda de NuGet, podremos descargarnos la librería GeoJSON.NET.
No olvides que esta librería utiliza Newtonsoft.Json por debajo.
El JSON que utilizaré en este ejemplo, está formado por las coordenadas Latitud y Longitud de un punto de New York.
En concreto, la librería GeoJSON.NET nos permite acceder a un punto de forma directa o a una característica del punto.
Dicho de otro modo, para el caso de un punto concreto, utilizaré el siguiente GeoJSON.
{ "type": "Point", "coordinates": [40.714172, -74.006393] }
Mientras que para una características utilizaré este otro GeoJSON.
{ "type": "Feature", "geometry": { "type": "Point", "coordinates": [40.714172, -74.006393] }, "properties": { "name": "New York" } }
Una vez hecho esto, abre una aplicación de consola y escribe el siguiente código:
namespace GeoJSON { using Net.Feature; using Net.Geometry; using Newtonsoft.Json; using System; using System.Diagnostics; public class Program { private const string GOOGLE_MAPS_PATTERN = "https://www.google.es/maps/@{0},21z"; public static void Main(string[] args) { string jsonPoint = "{\"type\":\"Point\",\"coordinates\":[-73.989308, 40.741895]}"; string jsonFeature = "{\"type\":\"Feature\",\"geometry\":{\"type\":\"Point\",\"coordinates\":[-73.989308, 40.741895]},\"properties\":{\"name\":\"New York\"}}"; GeoJsonLibraryFromPoint(jsonPoint); GeoJsonLibraryFromFeature(jsonFeature); Console.WriteLine(); Console.WriteLine("Press any key to close the app"); Console.ReadKey(); } private static T Deserialize<T>(string json) { return JsonConvert.DeserializeObject<T>(json); } private static void GeoJsonLibraryFromPoint(string json) { Point data = Deserialize<Point>(json); Console.WriteLine("POINT"); Console.WriteLine($"Latidude: {data.Coordinates.Latitude}"); Console.WriteLine($"Longitude: {data.Coordinates.Longitude}"); Console.WriteLine(); string mapPosition = data.Coordinates.Latitude.ToString().Replace(",", ".") + "," + data.Coordinates.Longitude.ToString().Replace(",", "."); Process.Start(String.Format(GOOGLE_MAPS_PATTERN, mapPosition)); } private static void GeoJsonLibraryFromFeature(string json) { Feature data = Deserialize<Feature>(json); double latitude = ((GeoJSON.Net.Geometry.Position)((GeoJSON.Net.Geometry.Point)data.Geometry).Coordinates).Latitude; double longitude = ((GeoJSON.Net.Geometry.Position)((GeoJSON.Net.Geometry.Point)data.Geometry).Coordinates).Longitude; Console.WriteLine("FEATURE"); Console.WriteLine($"Latidude: {latitude}"); Console.WriteLine($"Longitude: {longitude}"); Console.WriteLine(); string mapPosition = latitude.ToString().Replace(",",".") + "," + longitude.ToString().Replace(",", "."); Process.Start(String.Format(GOOGLE_MAPS_PATTERN, mapPosition)); } } }
Este ejemplo, extraerá los datos GeoJSON de los dos JSON que he preparado y abrirá el navegador Web para navegar a la posición GPS que hemos indicado.
Como vemos, básicamente se encarga de extraer los datos del JSON para que podamos acceder a ellos.
Podrás acceder al código fuente completo de este ejemplo en este enlace en mi repositorio de GitHub.
Espero que te haya servido.
¡Happy Coding!