2013-07-16 3 views
8

다음 모델이 있습니다.특정 반경 내에있는 위도와 경도 좌표로 장고 모델을 필터링하는 방법

class Location(models.Model): 
    name = models.CharField(max_length = 128, blank = True) 
    address =models.CharField(max_length = 200, blank= True) 
    latitude = models.DecimalField(max_digits=6, decimal_places=3) 
    longitude = models.DecimalField(max_digits=6, decimal_places=3) 

    def __unicode__(self): 
     return self.name 

내 현재 위도 & 경도 인 경우 :

current_lat = 43.648 
current_long = 79.404 

제가 조사를 좀 해봤 두 위치 사이의 거리 좌표를 계산 Haversine Equation을 가로 질러왔다. 아래는 내가 발견 방정식입니다 : 내가 좋아하는 것

import math 

def distance(origin, destination): 
    lat1, lon1 = origin 
    lat2, lon2 = destination 
    radius = 6371 # km 

    dlat = math.radians(lat2-lat1) 
    dlon = math.radians(lon2-lon1) 
    a = math.sin(dlat/2) * math.sin(dlat/2) + math.cos(math.radians(lat1)) \ 
     * math.cos(math.radians(lat2)) * math.sin(dlon/2) * math.sin(dlon/2) 
    c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a)) 
    d = radius * c 

    return d 

는 10km 반경 내에있는 모든 위치 개체를 반환하기 위해 내가이 모든 위치의 개체를 반환에만 것 같은 방법으로 필터링 할 수있는 방법, 그 이 10km 반경 내에 떨어지는가?

LocationsNearMe = Location.objects.filter(#This is where I am stuck) 

내가 그것을 단지 10km 반경 내에 위치 개체를 반환하도록 필터링에 하버 사인 방정식을 구현할 수 어쨌든 있나요?

나는 상세한 답변을 찾고 있습니다. 도움을 감사하십시오.

+1

geodjango를 사용해보고 사용해야합니다. https://docs.djangoproject.com/en/dev/ref/contrib/gis/ – user710907

+0

geodjango를 자세히 살펴보면이 문제에 대한 해결책이 있습니다. b 그것은 geodjango가 필요합니다 : https://gist.github.com/omouse/5623772 –

+0

올바른 방향으로 저를 안내해 주셔서 감사합니다. 솔루션에서 당신은 요점을 지니지 만,이 모델에서는 두 개의 필드로 구분됩니다 : 경도 위도. 답변란에이 사례에 대한 답을 아래에 적어주십시오. – noahandthewhale

답변

7

(대신 원) 기하학적 사각형의 형태로 결과를 반환하지만 당신은 항상 (더 이전 단계의 결과를 필터링하여 브라이언 접근 방식에 의해 제안 할 수있는 hoepfully해야 더 작은 부분 집합이어야 함) 각각에 대해 반경 내에 있는지 확인하십시오.

사용자가 검은 점에 있습니다. Brian이 제시 한 정사각형 근사값은 초록색이지만 주황색 점도 반환합니다. 최악의 경우 사용자가 예상보다 2 배 이상 멀리 있어야 (거리의 40 % 추가) 먼 거리에서의 다이버 런스는 중요 할 수 있습니다. 따라서 모든 주황색 및 녹색 점에 대해 검정색 점 (예 : 도시에서 네비게이션과 같은 매우 짧은 거리 인 경우 유클리드 점)이 가정 된 반지름보다 크지 않은지 확인해야합니다.

enter image description here

UPDATE :

당신은 하버 사인 거리 또는 (더 나은)를 사용하려면 GeoDjango의 하바에게 주변 검색을 다루는 두 개의 장고 뷰를 비교하는이 조각의 모양 언급 할 경우

https://gist.github.com/andilabs/4232b463e5ad2f19c155

+0

답변 해 주셔서 감사합니다.이 문제를 해결하는 방법에 대한 귀하의 통찰력에 정말 감사드립니다! :) – noahandthewhale

+0

요지가 깨졌습니다. –

+1

다음은 새로운 링크 http://andilabs.github.io/django/devops/tools/postgres/postgis/2015/01/31/postgis-geodjango-english.html입니다. –

8

filter으로 범위 쿼리를 수행 할 수 있습니다.

LocationsNearMe = Location.objects.filter(latitude__gte=(the minimal lat from distance()), 
              latitude__lte=(the minimal lat from distance()), 
              (repeat for longitude)) 

불행하게도,이