2009-02-18 10 views
12

मुझे एडमिन ऐप के साथ openlayers और OpenStreetMaps का उपयोग करके geodjango चल रहा है।geodjango में OpenStreetMap के साथ openlayers का उपयोग कर डेटा प्रदर्शित करने के लिए कैसे?

अब मैं डेटा प्रदर्शित करने के लिए कुछ विचार लिखना चाहता हूं। असल में, मैं सिर्फ मानचित्र में बिंदुओं (व्यवस्थापक में देखा गया) की एक सूची जोड़ना चाहता हूं।

जिओडोज़गो विशेषopenlayers.js फ़ाइल का उपयोग व्यवस्थापक में जादू करने के लिए प्रतीत होता है। क्या इसके साथ इंटरफेस करने का कोई अच्छा तरीका है?

व्यवस्थापक में देखी गई खुली सड़क मानचित्र विंडो पर geodjango डेटा प्रदर्शित करने के लिए मैं एक दृश्य/टेम्पलेट कैसे लिख सकता हूं?

फिलहाल, मैं openlayers.js फ़ाइल में खोद रहा हूं और एपीआई 'आसान' समाधान की तलाश में है। (मेरे पास जेएस अनुभव नहीं है इसलिए इसमें कुछ समय लग रहा है।)

वर्तमान तरीके से मैं इसे करने के लिए देख सकता हूं, टेम्पलेट के रूप में निम्न को जोड़ता है, और बिंदुओं को प्रदर्शित करने के लिए आवश्यक कोड जोड़ने के लिए django का उपयोग करता है। (उदाहरण के here के आधार पर)

<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
     <title>Draw Feature Example</title> 

     <script src="http://www.openlayers.org/api/OpenLayers.js"></script> 
     <script type="text/javascript"> 
      var map; 

      function init(){ 
       map = new OpenLayers.Map('map'); 
       var layer = new OpenLayers.Layer.WMS("OpenLayers WMS", 
         "http://labs.metacarta.com/wms/vmap0", {layers: 'basic'}); 
       map.addLayer(layer); 

       /* 
       * Layer style 
       */ 
       // we want opaque external graphics and non-opaque internal graphics 
       var layer_style = OpenLayers.Util.extend({}, OpenLayers.Feature.Vector.style['default']); 
       layer_style.fillOpacity = 0.2; 
       layer_style.graphicOpacity = 1; 

       /* 
       * Blue style 
       */ 
       var style_blue = OpenLayers.Util.extend({}, layer_style); 
       style_blue.strokeColor = "blue"; 
       style_blue.fillColor = "blue"; 
       style_blue.graphicName = "star"; 
       style_blue.pointRadius = 10; 
       style_blue.strokeWidth = 3; 
       style_blue.rotation = 45; 
       style_blue.strokeLinecap = "butt"; 

       var vectorLayer = new OpenLayers.Layer.Vector("Simple Geometry", {style: layer_style}); 

       // create a point feature 
       var point = new OpenLayers.Geometry.Point(-111.04, 45.68); 
       var pointFeature = new OpenLayers.Feature.Vector(point,null,style_blue); 
       // Add additional points/features here via django 

       map.addLayer(vectorLayer); 
       map.setCenter(new OpenLayers.LonLat(point.x, point.y), 5); 
       vectorLayer.addFeatures([pointFeature]); 
      } 
     </script> 
    </head> 
    <body onload="init()"> 
     <div id="map" class="smallmap"></div> 
    </body> 
</html> 

इस कि यह कैसे हुआ है, या वहाँ एक बेहतर तरीका है?

उत्तर

2

मुझे लगता है कि आपका समाधान व्यावहारिक और शायद सबसे आसान तरीका है। जावास्क्रिप्ट को बस टेम्पलेट करें और टेम्पलेट को प्रस्तुत किए जाने के कारण अपने डेटा पॉइंट इंजेक्ट करने के लिए Django का उपयोग करें।

आप अधिक सजावटी प्राप्त करना चाहता था, तो आप एक Django का मानना ​​है कि JSON (आवेदन/json) के रूप में डेटा बिंदुओं परोसा हो सकता था और उसके बाद से AJAX का उपयोग वापस घटनाओं पर आधारित डेटा है कि ब्राउज़र में हो रही हैं फोन और पुनः प्राप्त करने के । यदि आप चाहते हैं कि आपका एप्लिकेशन ओपनलेयर प्रदान करता है और उससे परे अत्यधिक इंटरैक्टिव हो, तो यह अतिरिक्त जटिलता के लायक हो सकता है, लेकिन निश्चित रूप से यह सब आपके आवेदन की ज़रूरतों पर निर्भर करता है।

+0

मुझे लगता है कि सबसे अच्छा तरीका एक Django राय यह है कि आवश्यक डेटा के लिए आवश्यक JSON ऑब्जेक्ट रिटर्न तैयार करना है। – monkut

4

एक और समाधान एक ऐसा फॉर्म बनाना है जो GeoDjango Admin विजेट का उपयोग करता हो।

ऐसा करने के लिए, मैं:

सेटअप एक GeneratePolygonAdminClass:

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 

आधारित कोड पर: http://code.djangoproject.com/browser/django/branches/gis/django/contrib/gis/admin/options.py?rev=7980

ऐसा लगता है कि आप OpenStreetMap शामिल करने के लिए अतिरिक्त_जेएस विकल्प का उपयोग कर सकते हैं (मैंने इसका परीक्षण नहीं किया है)।

1

आप FloppyForms उपयोग करने पर विचार कर सकता है। अंत में, मैं आम तौर पर अपने ही आवश्यकताओं के समाधान को अनुकूलित अंत है, लेकिन यह एक अच्छा तरीका शुरू करने के लिए है।

0

चेकआउट geodjango-बुनियादी क्षुधा परियोजना से इस ट्यूटोरियल:
http://code.google.com/p/geodjango-basic-apps/wiki/FOSS4GWorkshop

हो सकता है आप बस अभी तक अपने स्वयं के जावास्क्रिप्ट अप हैक करने की जरूरत नहीं है

2

यह काफी पुराना है, और मैं wouldn ' टी बनाने के लिए एक टेम्पलेट हैक के रूप में मैं मूल रूप से सोच रहा था चारों ओर जाना। अब मैं एक Django का मानना ​​है कि एक पत्रक GeoJSON परत को GeoJSON रिटर्न के लिए एक ajax अनुरोध के साथ leaflet.js का प्रयोग करेंगे।

यह 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') 
संबंधित मुद्दे