2010-11-20 2 views
1

geodjango에 웹 사이트를 구축하는 중입니다. 프론트 엔드에서 나는 openlayers에 대한 맵을 가지고 있으며 일부 장고 URL에서 아약스 쿼리를 실행하고 geojson을 다시 얻을 수 있기를 원합니다.django json serializer가 geojson을 구현하지 않습니다.

표준 django json serializer가 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] 
} 

그래서 내 질문은 짐작할 수 있겠지만, 내 자신을 완전히 굴리지 않고 장고에서 geojson 시리얼 라이저를 구현하는 가장 좋은 방법은 무엇입니까? 그리고 내 자신을 굴리는 것에 관해서는 어디에서 시작해야합니까?

답변

1

그래서 ... 나는 다소 불안해합니다. serializer의 non-geojson 부분을 하드 코드하고 geojson 부분을 얻기 위해 GEOS의 json 함수를 사용했습니다. 나는이 보이는 전망이

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을 포함하도록 serializer를 업데이트 한 경우 더 좋은 방법이 있습니다.

3

독자적인 시리얼 라이저를 작성해야합니다.

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) 
그냥 여기에 내가 그것을 만든 사람이 Point 유형 지원의의 DjangoJSONEncoder에서 상속
관련 문제