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 elIGeometryFactory
utilizado al deserializar elPoint
, que por defecto esnew GeometryFactory(new PrecisionModel(), 4326);
.Si necesita controlar esto, puede construir un
JsonSerializer
usando una fábrica específica usandoGeoJsonSerializer.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.