Визуализация пространственных данных GeoQuerySet в пользовательском представлении GeoDjango
Я только начал свой первый проект на GeoDjango.
На самом деле, благодаря приложению Admin с GeoDjango у всех нас есть прекрасная возможность просматривать / редактировать пространственные данные, связанные с текущим объектом.
Проблема в том, что после заполнения объектов мне нужно визуализировать геометрию нескольких объектов одновременно на одной карте. Я мог бы реализовать его как действие модели, перенаправив к пользовательскому представлению. Я просто не знаю, как включить виджет OpenLayers в представление и как отобразить там мою составную геометрию из моего GeoQuerySet.
Я был бы очень благодарен за любую подсказку от опытного программиста GeoDjango.
1 ответ
Две половины этого вопроса:
- Как мне сгенерировать географические данные, которые OpenLayers может читать через Django?
- Как мне использовать эти данные с OpenLayers?
Генерация географических данных
В Django есть несколько способов генерирования географических данных. Встроенный, вы можете использовать методы.kml() или.json() в наборе запросов; это приводит к тому, что каждый возвращаемый экземпляр имеет свойство.json или.kml, в котором KML или JSON Geometry генерируются в виде строки.
Затем вы можете использовать этот вывод в шаблонах, которые используют {{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 имеет объекты "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.)
Положить его вместе
- Создайте представление Django, используя векторные форматы для возврата данных в виде GeoJSON
- Создайте отдельное представление, которое возвращает HTML-страницу, подобную связанному примеру OpenLayers, с изменениями, показанными в примере кода.
- Это представление обслуживает HTML-страницу, которая загружает ваши данные GeoJSON и анализирует их.