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

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

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

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

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

1 ответов


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

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

Формирование Географических Данных

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

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

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

Использование Данных

OpenLayers имеет объекты "format", которые могут считывать данные: существуют форматы для 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, используя vectorformats для возврата ваших данных как GeoJSON
  2. создайте отдельное представление, которое возвращает HTML-страницу, такую как связанный пример OpenLayers, с изменениями, показанными в примере кода.
  3. это представление служит HTML-странице, которая загружает данные GeoJSON и анализирует его.