Рендеринг пространственных данных GeoQuerySet в пользовательском представлении GeoDjango

Я только что начал свой первый проект на GeoDjango.

На самом деле, с помощью приложения Admined с GeoDjango, у всех есть прекрасная возможность просматривать/редактировать пространственные данные, связанные с текущим объектом.

Проблема заключается в том, что после того, как объекты были заполнены , мне нужно сразу отобразить связанную геометрию объектов на одной карте. Я мог бы реализовать его в качестве действия модели, перенаправляя на пользовательский вид. Я просто не знаю, как включить виджет OpenLayers в представление и как отобразить там мою сложную геометрию из моего GeoQuerySet.

Я был бы очень благодарен за любой намек от опытного программиста GeoDjango.

Ответы

Ответ 1

Две половины этого вопроса:

  • Как создать географические данные, которые OpenLayers может читать через Django?
  • Как использовать эти данные с помощью OpenLayers?

Создание географических данных

Существует несколько способов генерации географических данных в Django. Встроенный, вы можете использовать методы .kml() или .json() в наборе запросов; это приводит к тому, что каждый возвращенный экземпляр имеет свойство .json или .kml, которое имеет KML или JSON геометрии, сгенерированные в виде строки.

Затем вы можете использовать этот вывод в шаблонах, которые используют {{feature.kml}} или {{feature.json}}. (Последнее несколько сложно, потому что вам придется вручную делать JSON-кодировку, прежде чем она попадет в шаблон, немного странная ситуация.)

Другой вариант - использовать библиотеку, которая поможет вам: в частности, векторные. ( "Векторные векторные элементы векторных версий" для Google, поскольку я могу включить только одну гиперссылку.) Установленный с помощью векторных форматов PyPI/easy_install, вы можете использовать формат Django:

>>> from vectorformats.Formats import Django, GeoJSON
>>> qs = Model.objects.filter(city="Cambridge")
>>> djf = Django.Django(geodjango="geometry", properties=['city', 'state'])
>>> geoj = GeoJSON.GeoJSON()
>>> s = geoj.encode(djf.decode(qs))
>>> print s 

Эта строка может быть возвращена через HTTPResponse для возврата объекта GeoJSON. Таким образом, ваше представление будет обернуть эти 4 строки в бит, которые сгенерировали запрос (qs, здесь), а затем вернули HttpResponse со строкой.

Потребляемые данные

OpenLayers имеет "формат" объектов, которые могут читать данные. Существуют форматы для GeoJSON и KML, а также другие.

Вы можете загрузить данные с помощью стандартных механизмов XMLHttpRequest, затем проанализировать их с помощью формата:

var f = new OpenLayers.Format.GeoJSON();
var features = f.read(req.responseText);
layer.addFeatures(features);

В качестве альтернативы вы можете использовать встроенную поддержку протокола для загрузки удаленных данных:

     map = new OpenLayers.Map('map');
     var wms = new OpenLayers.Layer.WMS(
         "OpenLayers WMS", "http://labs.metacarta.com/wms/vmap0",
         {layers: 'basic'}
     );

     var layer = new OpenLayers.Layer.Vector("GML", {
         strategies: [new OpenLayers.Strategy.Fixed()],
         protocol: new OpenLayers.Protocol.HTTP({
            url: "/django/view/json/",
            format: new OpenLayers.Format.GeoJSON()
         })
     });

     map.addLayers([wms, layer]);
     map.zoomToExtent(new OpenLayers.Bounds(
         -3.92, 44.34, 4.87, 49.55
     ));

В этом примере вы можете увидеть, что "url" указывает на ваше представление Django; включена вся загрузка данных и их анализ в соответствии с предоставленным форматом. (Вы можете увидеть аналогичный пример в пример OpenLayers для фиксированного поведения/протокола http.)

Объединение вместе

  • Создайте представление Django, используя векторные формы для возврата ваших данных в виде GeoJSON
  • Создайте отдельный вид, который возвращает HTML-страницу, такую ​​как связанный с OpenLayers пример, с изменениями, показанными в образце кода.
  • Это представление служит HTML-странице, которая загружает ваши данные GeoJSON и анализирует ее.