2013-10-02 2 views
1

에서 버퍼에 어떻게 반경을 기반으로 거리 검색을 갖고 싶어. 이렇게하기 위해, 포인트 오브젝트 주위에 버퍼를 작성하여 그 안에있는 오브젝트를 필터링하려고합니다.Geodjango는 : 포인트

>>> lat = 37.7762179974 
>>> lon = -122.411562492 
>>> from django.contrib.gis.geos import Point 
>>> pnt = Point(lat, lon) 
>>> buf = pnt.buffer(0.0001) 

을하지만이 Thing 개체를 필터링하는 데 문제가 그들이 버퍼 안에있는 여부에 따라 오전 :

>>> z = Thing.objects.filter(pnt__intersects=buf) 

(내가 알고 내가 그것에서 어딘지 여기

입니다 위의 내용은 올바르지 않지만 지금 시도하고있는 것을 자세히 설명하기 위해 사용합니다.)

어떻게 만들 수 있습니까? Point 주변의 버퍼와 필터 Thingsbuffer 안에 있습니까?


편집 :이 두 모델 필드의 조합으로 구성된 점을 기준으로 필터링 할 수있는 방법 models.py

class Thing(models.Model): 
    lat = models.FloatField() 
    lon = models.FloatField() 

?
내 모델의 pnt 필드가 없기 때문에 이것은 분명히 작동하지 않을 수 있습니다

>>> pnt = Point(lat, lon) 
>>> z = Thing.objects.filter(pnt__intersects=buf) 

을하지만 어떻게 비슷한 일을 할 수 있습니까?

+0

안녕하세요, @ 닉 B 나는 약간 늦게 (3 년까지) 대답을 올렸습니다. 봐. –

답변

0

"버퍼"가 무슨 뜻인지 잘 모르겠지만 반경 기반 거리 검색을 원하면 거리를 사용해보십시오! https://docs.djangoproject.com/en/dev/ref/contrib/gis/db-api/#distance-lookups

+0

어쩌면 제 질문이 명확하지 않을 수도 있지만, 제 생각에 당신이 놓친 것 같아요.나는'pnt'라는 모델 필드가 없으며'lat'와'lon' 만 가지고 있으므로'pnt'를 기반으로 필터링 할 수는 없습니다. 나는'lat + lon'에 기반하여 필터링하는 방법을 알고 싶습니다. 어떤 아이디어 주셔서 감사합니다! –

+0

모델에 'pnt'필드가 없으면 '.filter (pnt __ *)'는 나에게 의미가 없습니다. 데이터베이스에 'lat'와 'lon'을 수레로 저장 했으므로 처음에는 GeoDjango를 사용하는 것이 무엇입니까? –

+0

[이 게시글에 설명 된] 방법 (https://groups.google.com/forum/#!searchin/geodjango/distance%2420search%2420geodjango%2420hekevintran/geodjango/butW7zJQhSw/4Os60LTdEywJ)을 따르고있었습니다. "geodjango의 수석 개발자"가 작성한 이래로 나는 신뢰할 수있는 소스라고 생각했습니다. 그러나 저는 주제에 대한 권한이 아니며 추가 피드백을 기꺼이 받아들입니다. 이 시점까지 모든 의견에 감사드립니다! –

0

PostGIS와는 2D, 3D 또는 4D를 만들 수 있습니다 ST_MakePoint라는 방법이있다 : 당신은 확실히 문서를 살펴해야

from django.contrib.gis.measure import D 

Thing.objects.filter(pnt__distance_lte=(pnt,D(km=distance))) 

: 여기

는 킬로미터 메트릭 예입니다 포인트.

from django.contrib.gis.db.models.functions import GeoFunc 

class MakePoint(GeoFunc): 
    function='ST_MakePoint' 

이제 우리는 annotate()ing하여 지점을 만들 수 있으며, 그것에 intersects 적용 :

previous answer에서 우리는 기존의 PostGIS와 기능에서 사용자 지정 데이터베이스 함수를 생성 할 수 있음을 보았다

0,123,516 :
z = Thing.objects.annotate(pnt=MakePoint('lat', 'lon')) 
       .filter(pnt__intersects=buf) 

당신은 GeoFunc()F() 표현을 사용하여 동일한 효과를 얻을 수 있습니다

from django.contrib.gis.db.models.functions import GeoFunc 

z = Thing.objects.annotate(pnt=GeoFunc(
     F('lat'), F('lon'), 
     function='ST_MakePoint' 
    ).filter(pnt__intersects=buf) 

참고 : 당신은 당신의 Thing 모델의 pnt 필드를 추가하는 것을 고려하고 위를 피할 수 있습니다.