Как правильно получить координаты из Джанго в листовку с геойсон - PullRequest
0 голосов
/ 27 октября 2019

Я загрузил несколько мультиполигонов Shapefile в Geodjango, чтобы показать их в виде слоя на карте Leaflet. Но на веб-сайте слой не отображается, только сама карта.

Данные геометрии хранятся в базе данных Geodjango следующим образом:

from django.contrib.gis.db import models

class wgo(models.Model):
    (some more variables)
    poly = models.MultiPolygonField(srid=4326)

Я передаю мультиполигоны с помощью geojson и сериализую, какитак:

wcrds = wgo.objects.filter(id=wid)
gridone = serialize('geojson', wcrds.all())

return render(request, 'result.html', {'gridone': gridone})

И когда я осматриваю страницу, я вижу, что данные геоджонса действительно попадают в html:

var Hlayer = new L.GeoJSON(

    {"type": "FeatureCollection", "crs": {"type": "name", "properties": {"name": "EPSG:4326"}}, "features": [{"type": "Feature", "properties": {"wijkcode": "WK036356", "wijknaam": "Middenmeer", "poly": "SRID=4326;MULTIPOLYGON (((4.93714288723798 52.3576900936898, 4.93742729807085 52.3577390397678,)))", "pk": "909"}, "geometry": null}]} 
    , {
        style: Hstyle
    }
);

var mymap = L.map('mapid').setView([52.3701, 4.8967], 13);

var OpenStreetMap_Mapnik = L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
  maxZoom: 19,
  attribution: '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
}).addTo(mymap);

(я вынул большинство координат для краткостисакэ). Похоже, что geojson не понял, что переменная poly имеет геометрию.

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

Я импортировал шейп-файл напрямую через отображение слоев Геоджанго, следуя Геоджангоучебник . Кроме того, я просматривал и манипулировал этим шейп-файлом с помощью ogrinfo, ogr2ogr и, в Python, GDAL osgeo без проблем.

Есть идеи, как заставить Геоджанго и геойсон передавать координаты в нужном формате в Leaflet? Заранее спасибо.

1 Ответ

0 голосов
/ 27 октября 2019

Моя ошибка здесь. При сериализации geojson вы должны явно указать, какая переменная содержит геометрию. Вместо

gridone = serialize('geojson', wcrds.all())

Сделано это:

gridone = serialize('geojson', wcrds.all(), geometry_field='poly')

И это работает. Прочитайте документы , как говорится ...

...