在GeoDjango的自定义视图中渲染GeoQuerySet的空间数据

Dmi*_*dev 14 django view geodjango openlayers

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

事实上,使用GeoDjango支持的管理应用程序,我们都很有可能查看/编辑与当前对象相关的空间数据.

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

我非常感谢来自经验丰富的GeoDjango程序员的任何暗示.

Chr*_*idt 28

这个问题的两半:

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

生成地理数据

在Django中有几种不同的方法来生成地理数据.内置,您可以在查询集上使用.kml()或.json()方法; 这样做会导致每个返回的实例都具有.json或.kml属性,该属性具有作为字符串生成的Geometry的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 
Run Code Online (Sandbox Code Playgroud)

可以通过HTTPResponse返回此字符串以返回GeoJSON对象.因此,您的视图会将这4行包装在生成查询集(qs,此处)的位中,然后返回带有字符串的HttpResponse.

消费数据

OpenLayers具有可以读取数据的"格式"对象:GeoJSON和KML以及其他格式.

您可以使用标准XMLHttpRequest机制加载数据,然后使用以下格式解析它们:

var f = new OpenLayers.Format.GeoJSON();
var features = f.read(req.responseText);
layer.addFeatures(features);
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用内置协议支持来加载远程数据:

     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
     ));
Run Code Online (Sandbox Code Playgroud)

你可以在这个例子中看到'url'指向你的Django视图; 所有数据加载和根据提供的格式解析它都包括在内.(您可以在OpenLayers示例中看到固定行为/ http协议的类似示例.)

把它放在一起

  1. 创建Django视图,使用vectorformats将数据作为GeoJSON返回
  2. 创建一个单独的视图,它返回一个HTML页面,如链接的OpenLayers示例,以及代码示例中显示的修改.
  3. 该视图提供加载GeoJSON数据并解析它的HTML页面.

  • 实际上,我浏览了GeoDjango Admin应用程序模板并发现,GeoDjango的作者在django/contrib/gis/templates/gis/admin/openlayers.js中为我们创建了一个名为'extra_layers'的特殊空块.我们可以通过模板继承来"注入"js代码,在地图上添加我们的额外图层.如果捆绑的Admin应用程序对我们来说可行,则无需为上面的答案中的嵌入式地图创建HTML页面的单独视图.这是我正在寻找的.希望这有助于某人. (2认同)