2

私はgeodjangoでウェブサイトを構築中です。フロント エンドには openlayers のマップがあり、django の URL で ajax クエリを実行して geojson を取得できるようにしたいと考えています。

問題は、標準の django json シリアライザーが geojson を実行しないことです。だから私は次のようなモデルを持っています:

class Asset (models.Model):
objects = models.GeoManager()

url_name = models.CharField(max_length=200)
name = models.CharField(max_length=200)
point = models.PointField(srid=4326)

def __unicode__(self):
    return self.name

そして、私はビューを作成したい:

def geojson_query(request):

#geographic query

...

assets = Asset.objects.all().filter(point__contained=bb_4326)
json = serializers.serialize("json", assets)
return HttpResponse(json)

しかし、次のような応答が返されます。

"url_name": "Upper_Svaneti", 
"name": "Upper Svaneti", 
"point": "POINT (43.0113899999999987 42.9163899999999998)"

私は次のようなものが欲しいのですが:

"url_name": "Upper_Svaneti", 
"name": "Upper Svaneti", 
"geometry": {
"type": "Point", 
"coordinates": [43.0113899999999987 42.9163899999999998]
}

私の質問は、自分自身を完全にロールバックせずに、django で geojson シリアライザーを実装する最良の方法は何だと思いますか? そして、それが自分自身を転がすことになるとしたら、どこから始めればよいでしょうか?

4

2 に答える 2

5

独自のシリアライザーを作成する必要があります。から継承するだけです。タイプDjangoJSONEncoderをサポートする私が作成したものを次に示します。Point

from django.core.serializers.json import DjangoJSONEncoder
from django.contrib.gis.geos import Point

class GeoJSONEncoder(DjangoJSONEncoder):
    def default(self, obj):
        if isinstance(obj, Point):
            return obj.coords
        return super(GeoJSONEncoder, self).default(obj)

その後、次のように使用できます。

from my_app.serializers import GeoJSONEncoder
from django.utils import simplejson

json = simplejson.dumps(data, cls=GeoJSONEncoder)
于 2013-11-10T23:50:47.143 に答える
1

というわけで…少しお粗末なことをしてしまいました。シリアライザーの geojson 以外の部分をハードコーディングし、GEOS の json 関数を使用して geojson 部分を取得しました。

したがって、モデルのメソッドは次のようになります。

def get_footprint_json(self):
    geojson=self.footprint.json
    json='{"type": "Feature","geometry": %s,"properties": {"name":"%s","url_name":"%s"}}'%(geojson,self.name,self.url_name)
    return json

そして...次のようなビューがあります。

json='{ "srid":4326, "type": "FeatureCollection","features": ['+','.join([asset.get_footprint_json() for asset in assets])+'] }'
return HttpResponse(json)

他の誰かがより良い方法を持っているかどうか、またはdjangoがシリアライザーを更新してgeojsonを含めるかどうかを知りたいです。

于 2010-11-27T23:35:00.647 に答える