この質問の 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 の例で同様の例を見ることができます。)
それを一緒に入れて
- vectorformats を使用してデータを GeoJSON として返す Django ビューを作成する
- リンクされた OpenLayers の例のような HTML ページを返す別のビューを作成し、コード サンプルに示されている変更を加えます。
- そのビューは、GeoJSON データを読み込んで解析する HTML ページを提供します。