Python 如何在geodjango中使用openlayers和OpenStreetMap显示数据?

Python 如何在geodjango中使用openlayers和OpenStreetMap显示数据?,python,mapping,openlayers,geodjango,Python,Mapping,Openlayers,Geodjango,我已经让geodjango使用管理应用程序运行 现在我想写一些视图来显示数据。基本上,我只想在地图上添加一个点列表(见管理部分) Geodjango似乎使用了一个特殊的文件来实现它在管理中的魔力。有没有一个很好的方法与此接口 如何编写视图/模板以在打开的街道地图窗口上显示geodjango数据,如管理窗口中所示 目前,我正在深入研究文件和api,寻找一个“简单”的解决方案。(我没有js经验,所以这需要一些时间。) 目前我可以看到的方法是添加以下内容作为模板,并使用django添加显示点所需的代码

我已经让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')