Saltar al contenido

Cómo sembrar datos de NetTopologySuite.Geometries.Point de un archivo Json en ASP.Net core

Luego de de esta prolongada búsqueda de información pudimos solucionar este contratiempo que pueden tener muchos los usuarios. Te ofrecemos la solución y esperamos resultarte de mucha apoyo.

Solución:

NetTopologySuite tiene un nuget independiente, NetTopologySuite.IO.GeoJSON, para serializar tipos de NetTopologySuite desde y hacia JSON mediante Json.NET. Incluye convertidores para objetos geométricos como Point. Si agrega este nuget a su proyecto, podrá agregar entidades geométricas como Point a su modelo de datos y (des)serializar el modelo directamente.

Para hacer esto, primero agregue NetTopologySuite.IO.GeoJSON a tu proyecto.

Luego agregue el siguiente método de extensión:

public static partial class JsonExtensions

    public static T LoadFromFileWithGeoJson(string path, JsonSerializerSettings settings = null)
    
        var serializer = NetTopologySuite.IO.GeoJsonSerializer.CreateDefault(settings);
        serializer.CheckAdditionalContent = true;
        using (var textReader = new StreamReader(path))
        using (var jsonReader = new JsonTextReader(textReader))
        
            return serializer.Deserialize(jsonReader);
        
    

Y agrega un Location propiedad a su User modelo como en su pregunta:

public class User : IdentityUser

    public Point Location  get; set; 

    // Remainder unchanged.
    // ...

Ahora, el formato JSON para un Point parece:

"type":"Point","coordinates":[-122.431297,37.773972]

Así que edite su archivo JSON para que se vea así:

[
  {
    "Location": 
      "type": "Point",
      "coordinates": [
        -122.431297,
        37.773972
      ]
    ,
    // Remainder unchanged

Una vez hecho todo esto, podrá deserializar su archivo JSON de la siguiente manera:

var users = JsonExtensions.LoadFromFileWithGeoJson>("Data/UserSeedData.json");

Notas:

  • NetTopologySuite.IO.GeoJSON requiere Newtonsoft.Json versión 9.0.1 o superior. Si está utilizando una versión posterior, es posible que deba agregar un bindingRedirect para evitar advertencias de compilación.

  • Ver Cómo utilizar [NetTopologySuite.IO.GeoJSON] con ASP.NET Core para obtener información adicional sobre la integración de este paquete en su proyecto.

  • El SRID parece no guardarse como parte del JSON del punto. En cambio, está establecido por el IGeometryFactory utilizado al deserializar el Point, que por defecto es new GeometryFactory(new PrecisionModel(), 4326);.

    Si necesita controlar esto, puede construir un JsonSerializer usando una fábrica específica usando GeoJsonSerializer.Create(IGeometryFactory factory).

Violín de demostración aquí.

Podrías subclasificar NetTopologySuite.Geometries.Point y agrega un [JsonConstructor] para analizar su archivo json. Debería ser una sustitución directa para el resto de su código.

public class MyPoint : Point

    [JsonConstructor]
    public MyPoint(double latitude, double longitude, int srid)
        :base(new GeoAPI.Geometries.Coordinate(longitude, latitude))
    
        SRID = srid;
    

Tenga en cuenta que latitud = y y longitud = x, por lo que se invierte el orden.

Intercambio MyPoint por Point en tus User clase

public class User: IdentityUser 
  // member data here
  public MyPoint Location  get; set; 

Y debería funcionar con tu json tal como está.

Reseñas y calificaciones del artículo

Si guardas alguna cuestión o disposición de limar nuestro ensayo eres capaz de añadir una referencia y con mucho placer lo interpretaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *