14

GeoDjango で最初のプロジェクトを開始したところです。

実際のところ、GeoDjango を利用した管理アプリケーションを使用すると、現在のオブジェクトに関連付けられた空間データを表示/編集する可能性が高くなります。

問題は、オブジェクトが設定された後、複数のオブジェクトに関連付けられたジオメトリを 1 つのマップに一度にレンダリングする必要があることです。カスタム ビューにリダイレクトするモデル アクションとして実装する場合があります。ビューに OpenLayers ウィジェットを含める方法と、GeoQuerySet から複合ジオメトリをそこにレンダリングする方法がわかりません。

経験豊富な GeoDjango プログラマーからのヒントをいただければ幸いです。

4

1 に答える 1

28

この質問の 2 つの半分:

  • OpenLayers が Django 経由で読み取ることができる地理データを生成するにはどうすればよいですか?
  • このデータを OpenLayers で使用するにはどうすればよいですか?

地理データの生成

Django で地理データを生成するには、いくつかの方法があります。組み込みで、クエリセットで .kml() または .json() メソッドを使用できます。そうすることで、返された各インスタンスに、文字列として生成された Geometry の KML または JSON を持つ .json または .kml プロパティが含まれます。

その後、{{feature.kml}} または {{feature.json}} を使用するテンプレートでこの出力を使用できます。(後者は、テンプレートにヒットする前に JSON エンコーディングを手動で行う必要があるため、やや困難です。これは少し奇妙な状況です。)

別のオプションは、ライブラリを使用して支援することです。具体的には、vectorformats です。(ハイパーリンクは 1 つしか含めることができないため、情報については Google の「featureserver vectorformats」を参照してください。) PyPI/easy_install vectorformats 経由でインストールすると、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 ビューを指していることがわかります。すべてのデータの読み込みと、提供された形式による解析が含まれます。(固定動作/http プロトコルの OpenLayers の例で同様の例を見ることができます。)

それを一緒に入れて

  1. vectorformats を使用してデータを GeoJSON として返す Django ビューを作成する
  2. リンクされた OpenLayers の例のような HTML ページを返す別のビューを作成し、コード サンプルに示されている変更を加えます。
  3. そのビューは、GeoJSON データを読み込んで解析する HTML ページを提供します。
于 2010-06-15T13:46:26.063 に答える