14

我刚刚开始了我在 GeoDjango 上的第一个项目。

事实上,使用 GeoDjango 支持的 Admin 应用程序,我们都可以查看/编辑与当前对象关联的空间数据。

问题是,在填充对象后,我需要在一张地图上一次渲染多个对象的关联几何图形。我可能会将其实现为模型操作,重定向到自定义视图。我只是不知道,如何在视图中包含 OpenLayers 小部件以及如何从我的 GeoQuerySet 中渲染我的复合几何。

我将非常感谢经验丰富的 GeoDjango 程序员提供的任何提示。

4

1 回答 1

28

这个问题的两半:

  • 如何生成 OpenLayers 可以通过 Django 读取的地理数据?
  • 如何使用 OpenLayers 使用这些数据?

生成地理数据

在 Django 中有几种不同的方式来生成地理数据。内置,您可以在查询集上使用 .kml() 或 .json() 方法;这样做会导致每个返回的实例都有一个 .json 或 .kml 属性,该属性具有生成为字符串的几何图形的 KML 或 JSON。

然后,您可以在使用 {{feature.kml}} 或 {{feature.json}} 的模板中使用此输出。(后者有点困难,因为您必须在它到达模板之前手动进行 JSON 编码,这有点奇怪。)

另一种选择是使用库来帮助您:特别是矢量格式。(谷歌“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. 创建一个单独的视图,该视图返回一个类似于链接的 OpenLayers 示例的 HTML 页面,其中包含代码示例中显示的修改。
  3. 该视图为加载 GeoJSON 数据并解析它的 HTML 页面提供服务。
于 2010-06-15T13:46:26.063 回答