Сериализация данных из PostGIS в JSON - PullRequest
0 голосов
/ 05 октября 2018

Я работаю над службой .NET Core REST, в которой будет контроллер, который будет отправлять данные геометрии обратно в GeoJson, чтобы я мог показать их на своей карте Leaflet.

У меня проблемы с преобразованием моегокласс в JSON.

Я пробовал это:

StringBuilder sb = new StringBuilder();
JsonTextWriter writer = new JsonTextWriter(new StringWriter(sb));
var jsonSerializer = GeoJsonSerializer.Create(new JsonSerializerSettings()
    {NullValueHandling = NullValueHandling.Ignore});
jsonSerializer.Serialize(writer, _context.Locations);
writer.Flush();
return Ok(sb.ToString());

Но потом я получаю эту ошибку

Self referencing loop detected for property 'CoordinateValue' with type 'GeoAPI.Geometries.Coordinate'

Я искал примеры и читал документывесь день, но не могу заставить его работать.

Класс, который мне нужно сериализовать:

public class SobekLocation
{
    public int Id { get; set; }
    public string LocationId { get; set; }
    public bool Use { get; set; }
    public Point Location { get; set; }
}

Любые предложения приветствуются.

Редактировать :

Я делаю свою коллекцию функций и пытаюсь ее сериализовать.Он что-то делает, но он недействителен GeoJSON.

    public FeatureCollection GetLocationsAsFeatureCollection()
    {
        var featureCollection = new FeatureCollection();
        foreach (var location in GetLocations().Take(5))
        {
            var attr = new AttributesTable
            {
                {"Id", location.Id},
                {"Use", location.Use},
                {"LocationId", location.LocationId}
            };

            var feature = new Feature(location.Location, attr);
            featureCollection.Add(feature);
        }

        return featureCollection;
    }

И часть сериализации:

var fc = _service.GetLocationsAsFeatureCollection();
var sb = new StringBuilder();
var jsonSerializer = JsonSerializer.Create(new JsonSerializerSettings
{
    // To prevent the Self referencing loop error:
    ReferenceLoopHandling = ReferenceLoopHandling.Ignore 
});

using (var sw = new StringWriter(sb))
{
    jsonSerializer.Serialize(sw, fc);
}

return Ok(sb.ToString());

Сериализованные данные:

{  
   "Features":[  
      {  
         "Geometry":{  
            "CoordinateSequence":{  
               "Dimension":3,
               "Ordinates":7,
               "Count":1
            },
            "Coordinates":[  
               {  
                  "X":191390.015,
                  "Y":523064.716597462,
                  "Z":"NaN"
               }
            ],
            "NumPoints":1,
            "IsEmpty":false,
            "Dimension":0,
            "BoundaryDimension":-1,
            "X":191390.015,
            "Y":523064.716597462,
            "Coordinate":{  
               "X":191390.015,
               "Y":523064.716597462,
               "Z":"NaN"
            },
            "GeometryType":"Point",
            "OgcGeometryType":1,
            "Boundary":[  

            ],
            "Z":"NaN",
            "M":"NaN",
            "Factory":{  
               "PrecisionModel":{  
                  "IsFloating":true,
                  "MaximumSignificantDigits":16,
                  "Scale":0,
                  "PrecisionModelType":0,
                  "OffsetX":0,
                  "OffsetY":0
               },
               "CoordinateSequenceFactory":{  
                  "Ordinates":7
               },
               "SRID":28992
            },
            "UserData":null,
            "SRID":28992,
            "PrecisionModel":{  
               "IsFloating":true,
               "MaximumSignificantDigits":16,
               "Scale":0,
               "PrecisionModelType":0,
               "OffsetX":0,
               "OffsetY":0
            },
            "NumGeometries":1,
            "IsSimple":true,
            "IsValid":true,
            "Area":0,
            "Length":0,
            "EnvelopeInternal":{  
               "IsNull":false,
               "Width":0,
               "Height":0,
               "MinX":191390.015,
               "MaxX":191390.015,
               "MinY":523064.716597462,
               "MaxY":523064.716597462,
               "Area":0,
               "MinExtent":0,
               "MaxExtent":0,
               "Centre":{  
                  "X":191390.015,
                  "Y":523064.716597462,
                  "Z":"NaN"
               }
            },
            "IsRectangle":false
         },
         "Attributes":[  
            {  
               "Key":"Id",
               "Value":1
            },
            {  
               "Key":"Use",
               "Value":false
            },
            {  
               "Key":"LocationId",
               "Value":"KNP_1"
            }
         ],
         "BoundingBox":null
      }
   ],
   "Type":"FeatureCollection",
   "CRS":null,
   "Count":5,
   "BoundingBox":null
}

Как вы можетевсе свойства начинаются с прописной буквы, но они должны быть строчными.А после изменения свойств вручную geojsonlint.com сообщает: GeoJSON features must have a type=feature member

Edit2 :

Я добился определенного прогресса.Сейчас я использую пакет GeoJSON.Net и теперь могу создать действительный GeoJSON в соответствии с http://geojsonlint.com/. Но все же моя карта Leaflet жалуется на недопустимый GeoJSON, поэтому на карте все еще ничего не отображается;)

Вот мой новый конвертер:

    public GeoJSON.Net.Feature.FeatureCollection GetLocationsAsGeoJsonFeatureCollection()
    {
        var featureCollection = new GeoJSON.Net.Feature.FeatureCollection();
        foreach (var location in GetLocations())
        {
            var attr = new Dictionary<string, object>()
            {
                {"Id", location.Id},
                {"Use", location.Use},
                {"LocationId", location.LocationId}
            };

            var position = new Position(location.Location.Coordinate.X, location.Location.Coordinate.Y);
            var geom = new GeoJSON.Net.Geometry.Point(position);
            var feature = new GeoJSON.Net.Feature.Feature(geom, attr, location.Id.ToString());
            featureCollection.Features.Add(feature);
        }

        return featureCollection;
    }

И GeoJSON, который он производит:

{  
   "type":"FeatureCollection",
   "features":[  
      {  
         "type":"Feature",
         "id":"1",
         "geometry":{  
            "type":"Point",
            "coordinates":[  
               523064.716597462,
               191390.015
            ]
         },
         "properties":{  
            "id":1,
            "use":false,
            "locationId":"KNP_1"
         }
      },
      {  
         "type":"Feature",
         "id":"2",
         "geometry":{  
            "type":"Point",
            "coordinates":[  
               519349.860113963,
               170162.249352578
            ]
         },
         "properties":{  
            "id":2,
            "use":false,
            "locationId":"CP_6"
         }
      },
      {  
         "type":"Feature",
         "id":"3",
         "geometry":{  
            "type":"Point",
            "coordinates":[  
               519952.507022603,
               170402.383673312
            ]
         },
         "properties":{  
            "id":3,
            "use":false,
            "locationId":"CP_UR_5_1"
         }
      },
      {  
         "type":"Feature",
         "id":"4",
         "geometry":{  
            "type":"Point",
            "coordinates":[  
               519948.062527202,
               170582.612655391
            ]
         },
         "properties":{  
            "id":4,
            "use":false,
            "locationId":"CP_UR_6_1"
         }
      },
      {  
         "type":"Feature",
         "id":"5",
         "geometry":{  
            "type":"Point",
            "coordinates":[  
               519902.432252114,
               170602.894875503
            ]
         },
         "properties":{  
            "id":5,
            "use":false,
            "locationId":"CP_UR_6_2"
         }
      }
   ]
}

Это мой код для Leaflet:

L.geoJson('http://localhost:5000/api/data/',
  {
    attribution: 'Mine'
  }
).addTo(map);

Я все ещеищу совет, как легко нанести мои данные PostGIS на карту Leaflet.

...