这个问题的两半:
在Django中有几种不同的方法来生成地理数据。内置,您可以在查询集上使用.kml()或.json()方法;这样做会导致每个返回的实例都具有.json或.kml属性,该属性具有作为字符串生成的Geometry的KML或JSON。
然后,您可以在使用{{feature.kml}}或{{feature.json}}的模板中使用此输出。 (后者有点困难,因为你必须在它到达模板之前手动执行JSON编码,这有点奇怪。)
另一个选择是使用库来帮助您:特别是矢量格式。 (谷歌“featureserver vectorformats”获取信息,因为我只能包含一个超链接。)通过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协议 。)