Python 如何在geodjango中使用openlayers和OpenStreetMap显示数据?
我已经让geodjango使用管理应用程序运行 现在我想写一些视图来显示数据。基本上,我只想在地图上添加一个点列表(见管理部分) Geodjango似乎使用了一个特殊的文件来实现它在管理中的魔力。有没有一个很好的方法与此接口 如何编写视图/模板以在打开的街道地图窗口上显示geodjango数据,如管理窗口中所示 目前,我正在深入研究文件和api,寻找一个“简单”的解决方案。(我没有js经验,所以这需要一些时间。) 目前我可以看到的方法是添加以下内容作为模板,并使用django添加显示点所需的代码。(基于示例)Python 如何在geodjango中使用openlayers和OpenStreetMap显示数据?,python,mapping,openlayers,geodjango,Python,Mapping,Openlayers,Geodjango,我已经让geodjango使用管理应用程序运行 现在我想写一些视图来显示数据。基本上,我只想在地图上添加一个点列表(见管理部分) Geodjango似乎使用了一个特殊的文件来实现它在管理中的魔力。有没有一个很好的方法与此接口 如何编写视图/模板以在打开的街道地图窗口上显示geodjango数据,如管理窗口中所示 目前,我正在深入研究文件和api,寻找一个“简单”的解决方案。(我没有js经验,所以这需要一些时间。) 目前我可以看到的方法是添加以下内容作为模板,并使用django添加显示点所需的代码
绘制特征示例
var映射;
函数init(){
map=newOpenLayers.map('map');
var layer=new OpenLayers.layer.WMS(“OpenLayers WMS”,
"http://labs.metacarta.com/wms/vmap0“,{层:'基本'});
map.addLayer(层);
/*
*图层样式
*/
//我们需要不透明的外部图形和非不透明的内部图形
var layer_style=OpenLayers.Util.extend({},OpenLayers.Feature.Vector.style['default']);
图层_style.fillOpacity=0.2;
图层_style.graphicsopacity=1;
/*
*蓝色风格
*/
var style_blue=OpenLayers.Util.extend({},layer_style);
style_blue.strokeColor=“蓝色”;
style_blue.fillColor=“蓝色”;
style_blue.graphicName=“星形”;
样式\蓝色。点半径=10;
样式\蓝色。笔划宽度=3;
样式为蓝色。旋转=45;
style_blue.strokeLinecap=“butt”;
var vectorLayer=newopenlayers.Layer.Vector(“简单几何体”{style:Layer\u style});
//创建点要素
var point=新的OpenLayers.Geometry.point(-111.04,45.68);
var pointFeature=new OpenLayers.Feature.Vector(点,空,样式为蓝色);
//通过django在此处添加其他点/功能
map.addLayer(矢量层);
地图设置中心(新OpenLayers.LonLat(点x,点y),5);
addFeatures([pointFeature]);
}
是这样做的,还是有更好的方法?我认为您的解决方案是可行的,可能是最简单的方法。只需将javascript模板化,并在呈现模板时使用Django注入数据点
如果您想变得更有趣,可以使用Django视图,将数据点作为JSON(application/JSON)提供,然后使用AJAX根据浏览器中发生的事件回调和检索数据。如果您希望您的应用程序在OpenLayers提供的基础上具有更高的交互性,这可能值得增加复杂性,但当然这一切都取决于您的应用程序的需要。另一个解决方案是创建一个利用GeoDjango管理小部件的表单 为此,我: 设置GeneratePolyGoAdminClass:
class GeneratePolygonAdmin(admin.GeoModelAdmin):
list_filter=('polygon',)
list_display=('object', 'polygon')
构建表单的位置:
geoAdmin=GeneratePolygonAdmin(ModelWithPolygonField, admin.site)
PolygonFormField=GeneratePolygon._meta.get_field('Polygon')
PolygonWidget=geoAdmin.get_map_widget(PolygonFormField)
Dict['Polygon']=forms.CharField(widget=PolygonWidget()) #In this case, I am creating a Dict to use for a dynamic form
填充表单的小部件:
def SetupPolygonWidget(form, LayerName, MapFileName, DefaultPolygon=''):
form.setData({'Polygon':DefaultPolygon})
form.fields['Polygon'].widget.params['wms_layer']=LayerName
form.fields['Polygon'].widget.params['wms_url']='/cgi-bin/mapserv?MAP=' + MapFileName
form.fields['Polygon'].widget.params['default_lon']=-80.9
form.fields['Polygon'].widget.params['default_lat']=33.7
form.fields['Polygon'].widget.params['default_zoom']=11
form.fields['Polygon'].widget.params['wms_name']=YOURWMSLayerName
form.fields['Polygon'].widget.params['map_width']=800
form.fields['Polygon'].widget.params['map_height']=600
form.fields['Polygon'].widget.params['map_srid']=YOUR_SRID
form.fields['Polygon'].widget.params['modifiable']=True
form.fields['Polygon'].widget.params['map_options']={}
form.fields['Polygon'].widget.params['map_options']['buffer'] = 0
return form
根据以下代码:
看起来你可以使用OpjyJS选项来包括OpenStrutMeP(我还没有测试过)。
你可以考虑使用。最后,我通常会根据自己的需要定制解决方案,但这是一个很好的开始方式。
查看geodjango basic apps项目中的本教程:也许你还不需要修改你自己的javascript,这已经很老了,我不会像我最初想的那样去修改模板。现在,我将使用一个对django视图的ajax请求,该视图将geojson返回到传单geojson层 这使得django方面非常简单 Django视图示例:
# -*- coding: utf-8 -*-
'''
'''
import json
from django.http import HttpResponse, HttpResponseBadRequest
from django.contrib.gis.geos import Polygon
from models import ResultLayer, MyModel
def get_layer_polygons(request, layer_id):
"""
Return the polygons for the given bbox (bounding box)
"""
layer = ResultLayer.objects.get(id=layer_id)
bbox_raw = request.GET.get("bbox", None)
# Make sure the incoming bounding box is correctly formed!
bbox = None
if bbox_raw and bbox_raw.count(",") == 3:
bbox = [float(v) for v in bbox_raw.split(",")]
if not bbox:
msg = "Improperly formed or not given 'bbox' querystring option, should be in the format '?bbox=minlon,minlat,maxlon,maxlat'"
return HttpResponseBadRequest(msg)
bbox_poly = Polygon.from_bbox(bbox)
bbox_poly.srid = 900913 # google
bbox_poly.transform(layer.srid) # transform to the layer's srid for querying
bin_size = int(bin_size)
# build vector polygons from bin
results = MyModel.objects.filter(layer=layer, poly__intersects=bbox_poly).transform(900913, field_name="poly")
geojson_data = []
for r in results:
# loading json in order to dump json list later
gjson = r.poly.geojson
py_gjson = json.loads(gjson)
geojson_data.append(py_gjson)
return HttpResponse(json.dumps(geojson_data), mimetype='application/json')
我认为最好的方法是创建一个django视图,该视图返回必要数据所需的JSON对象。
# -*- coding: utf-8 -*-
'''
'''
import json
from django.http import HttpResponse, HttpResponseBadRequest
from django.contrib.gis.geos import Polygon
from models import ResultLayer, MyModel
def get_layer_polygons(request, layer_id):
"""
Return the polygons for the given bbox (bounding box)
"""
layer = ResultLayer.objects.get(id=layer_id)
bbox_raw = request.GET.get("bbox", None)
# Make sure the incoming bounding box is correctly formed!
bbox = None
if bbox_raw and bbox_raw.count(",") == 3:
bbox = [float(v) for v in bbox_raw.split(",")]
if not bbox:
msg = "Improperly formed or not given 'bbox' querystring option, should be in the format '?bbox=minlon,minlat,maxlon,maxlat'"
return HttpResponseBadRequest(msg)
bbox_poly = Polygon.from_bbox(bbox)
bbox_poly.srid = 900913 # google
bbox_poly.transform(layer.srid) # transform to the layer's srid for querying
bin_size = int(bin_size)
# build vector polygons from bin
results = MyModel.objects.filter(layer=layer, poly__intersects=bbox_poly).transform(900913, field_name="poly")
geojson_data = []
for r in results:
# loading json in order to dump json list later
gjson = r.poly.geojson
py_gjson = json.loads(gjson)
geojson_data.append(py_gjson)
return HttpResponse(json.dumps(geojson_data), mimetype='application/json')