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

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

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

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

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

14
задан Dmitry Lebedev 14 June 2010 в 00:35
поделиться

1 ответ

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

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

Генерация географических данных

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

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

Другой вариант - использовать библиотеку, которая вам поможет: в частности, векторные форматы. (Google "featureserver vectorformats" для информации, поскольку я могу включить только одну гиперссылку.) Установленный через PyPI / easy_install vectorformats, вы можете использовать формат 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 .)

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

  1. Создайте представление Django, используя векторные форматы для возврата ваших данных в виде GeoJSON
  2. Создайте отдельное представление, которое возвращает HTML-страницу, как в связанном примере OpenLayers, с изменениями, показанными в примере кода.
  3. Это представление обслуживает HTML-страницу, которая загружает ваши данные GeoJSON и анализирует их.
28
ответ дан 1 December 2019 в 09:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: