12

管理アプリでopenlayersOpenStreetMapsを使用してgeodjangoを実行しています。

ここで、データを表示するビューをいくつか書きたいと思います。基本的に、ポイントのリスト (管理者に表示) をマップに追加したいだけです。

Geodjango は、特別な openlayers.jsファイルを使用して、管理者で魔法のように動作するようです。これとやり取りする良い方法はありますか?

管理画面で見られるように、開いているストリート マップ ウィンドウに geodjango データを表示するビュー/テンプレートを作成するにはどうすればよいですか?

現時点では、「簡単な」ソリューションを探してopenlayers.jsファイルと API を掘り下げています。(私はjsの経験がないので、これには時間がかかります。)

これを行うための現在の方法は、次をテンプレートとして追加し、django を使用してポイントを表示するために必要なコードを追加することです。(ここの例に基づく)

<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>

これがその方法ですか、それとももっと良い方法はありますか?

4

5 に答える 5

5

もう 1 つの解決策は、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

extra_js オプションを使用して OpenStreetMap を含めることができるようです (私はこれをテストしていません)。

于 2009-12-29T18:51:11.807 に答える
3

これはかなり古いものであり、最初に考えていたようにテンプレート ハックを作成するつもりはありません。ここで、geojson をリーフレット geojson レイヤーに返す django ビューへの 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')
于 2012-12-13T03:11:07.013 に答える
2

FloppyFormsの使用を検討できます。結局、私は通常、自分のニーズに合わせてソリューションをカスタマイズすることになりますが、これは始めるには良い方法です。

于 2011-10-03T22:26:06.733 に答える
2

あなたのソリューションは実行可能で、おそらく最も簡単なアプローチだと思います。JavaScript をテンプレート化し、Django を使用して、テンプレートがレンダリングされるときにデータ ポイントを挿入するだけです。

より洗練されたものにしたい場合は、データ ポイントを JSON (アプリケーション/json) として提供する Django ビューを用意し、AJAX を使用してコールバックし、ブラウザーで発生しているイベントに基づいてデータを取得できます。OpenLayers が提供するものを超えてアプリケーションを高度にインタラクティブにしたい場合、これは複雑さを増す価値があるかもしれませんが、もちろんそれはすべてアプリケーションのニーズに依存します。

于 2009-02-20T15:09:57.140 に答える
0

geodjango-basic-apps プロジェクトのこのチュートリアルをチェックしてください:
http://code.google.com/p/geodjango-basic-apps/wiki/FOSS4GWorkshop

おそらく、まだ独自の JavaScript をハックする必要はありません

于 2012-01-12T17:25:58.000 に答える