Визуализация пространственных данных GeoQuerySet в пользовательском представлении GeoDjango - PullRequest
14 голосов
/ 14 июня 2010

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

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

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

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

1 Ответ

28 голосов
/ 15 июня 2010

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

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

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

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

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

Другой вариант - использовать библиотеку, чтобы помочь вам: в частности,vectorformats.(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 .)

Соединение вместе

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