|
|
@ -17,47 +17,62 @@ namespace Squidex.Domain.Apps.Core.Contents |
|
|
{ |
|
|
{ |
|
|
public static class GeoJsonValue |
|
|
public static class GeoJsonValue |
|
|
{ |
|
|
{ |
|
|
public static GeoJsonParseResult TryParse(IJsonValue value, IJsonSerializer serializer, out GeoJSONObject geoJSON) |
|
|
public static GeoJsonParseResult TryParse(IJsonValue value, IJsonSerializer serializer, out GeoJSONObject? geoJSON) |
|
|
{ |
|
|
{ |
|
|
Guard.NotNull(serializer, nameof(serializer)); |
|
|
Guard.NotNull(serializer, nameof(serializer)); |
|
|
Guard.NotNull(value, nameof(value)); |
|
|
Guard.NotNull(value, nameof(value)); |
|
|
|
|
|
|
|
|
geoJSON = null!; |
|
|
geoJSON = null!; |
|
|
|
|
|
|
|
|
if (value is JsonObject geoObject) |
|
|
if (value is JsonObject obj) |
|
|
{ |
|
|
{ |
|
|
try |
|
|
if (TryParseGeoJson(obj, serializer, out geoJSON)) |
|
|
{ |
|
|
|
|
|
using (var stream = DefaultPools.MemoryStream.GetStream()) |
|
|
|
|
|
{ |
|
|
{ |
|
|
serializer.Serialize(value, stream, true); |
|
|
|
|
|
|
|
|
|
|
|
stream.Position = 0; |
|
|
|
|
|
|
|
|
|
|
|
geoJSON = serializer.Deserialize<GeoJSONObject>(stream, null, true); |
|
|
|
|
|
|
|
|
|
|
|
return GeoJsonParseResult.Success; |
|
|
return GeoJsonParseResult.Success; |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
catch |
|
|
if (!obj.TryGetValue<JsonNumber>("latitude", out var lat) || !lat.Value.IsBetween(-90, 90)) |
|
|
{ |
|
|
|
|
|
if (!geoObject.TryGetValue<JsonNumber>("latitude", out var lat) || !lat.Value.IsBetween(-90, 90)) |
|
|
|
|
|
{ |
|
|
{ |
|
|
return GeoJsonParseResult.InvalidLatitude; |
|
|
return GeoJsonParseResult.InvalidLatitude; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (!geoObject.TryGetValue<JsonNumber>("longitude", out var lon) || !lon.Value.IsBetween(-180, 180)) |
|
|
if (!obj.TryGetValue<JsonNumber>("longitude", out var lon) || !lon.Value.IsBetween(-180, 180)) |
|
|
{ |
|
|
{ |
|
|
return GeoJsonParseResult.InvalidLongitude; |
|
|
return GeoJsonParseResult.InvalidLongitude; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
geoJSON = new Point(new Position(lat.Value, lon.Value)); |
|
|
geoJSON = new Point(new Position(lat.Value, lon.Value)); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
return GeoJsonParseResult.Success; |
|
|
return GeoJsonParseResult.InvalidValue; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private static bool TryParseGeoJson(JsonObject obj, IJsonSerializer serializer, out GeoJSONObject? geoJSON) |
|
|
|
|
|
{ |
|
|
|
|
|
geoJSON = null; |
|
|
|
|
|
|
|
|
|
|
|
if (!obj.TryGetValue("type", out var type) || type is not JsonString) |
|
|
|
|
|
{ |
|
|
|
|
|
return false; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
return GeoJsonParseResult.InvalidValue; |
|
|
try |
|
|
|
|
|
{ |
|
|
|
|
|
using (var stream = DefaultPools.MemoryStream.GetStream()) |
|
|
|
|
|
{ |
|
|
|
|
|
serializer.Serialize(obj, stream, true); |
|
|
|
|
|
|
|
|
|
|
|
stream.Position = 0; |
|
|
|
|
|
|
|
|
|
|
|
geoJSON = serializer.Deserialize<GeoJSONObject>(stream, null, true); |
|
|
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
catch |
|
|
|
|
|
{ |
|
|
|
|
|
return false; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|