2011-07-26 1 views
0

PHP가 원래 코딩 되었기 때문에 Django의 백엔드를 움직이고 있습니다. 어쨌든 지구와 화성에서 가장 큰 혼란이 있습니다 ... 어쨌든 .. PHP와 Python을 복사했습니다. 그것을 아래에 베끼는 것을 생각해 냈다. 둘 다 IDENTICAL 값을 반환하지만, 어떤 이유로 Django/Python은 쿼리에서 아무 것도 반환하지 않습니다.경도/위도 SQL 쿼리로 고생 PHP에서 새로운 Python 백엔드로 복사했습니다. 몇 초의 의견이 필요합니다

나는 GeoDjango를 설치하는 방법을 제안했지만, 그렇게하지 않아도 될 것으로 기대하고있었습니다.

PHP :

$lat = $myrow['latitude']; 
$lon = $myrow['longitude']; 

// get the min/max latitudes and longitudes for the radius search 
$lat_range = $miles/69.172; 
$lon_range = abs($miles/(cos($lon) * 69.172)); 

$min_lat = $lat - $lat_range; 
$max_lat = $lat + $lat_range; 
$min_lon = $lon - $lon_range; 
$max_lon = $lon + $lon_range; 

$sql = "SELECT * FROM zipcodes WHERE 
     (latitude >= $min_lat AND latitude <= $max_lat AND 
     longitude >= $min_lon AND longitude <= $max_lon)"; 

파이썬 :

distance = float(distance) 
orderloc = Zipcodes.objects.get(zip=order.zip) 
orderloc.longitude = float(orderloc.longitude) 
orderloc.latitude = float(orderloc.latitude) 

latrange = distance/69.172 
lonrange = math.fabs(distance/(math.cos(orderloc.longitude) * 69.172)) 

minlat = orderloc.latitude - latrange 
maxlat = orderloc.latitude + latrange 
minlon = orderloc.longitude - lonrange 
maxlon = orderloc.longitude + lonrange 

distanceresults = Zipcodes.objects.all().filter(longitude__gte=minlon, 
     longitude__lte=maxlon,latitude__gte=minlat,latitude__lte=maxlat) 

추신 : 그래서 여기

코드입니다 이 장고 반환하는 쿼리 ...

SELECT (a ton of stuff here) FROM `zipcodes` WHERE (`zipcodes`.`longitude` <= -74.489601513 AND `zipcodes`.`longitude` >= -75.957598487 AND `zipcodes`.`latitude` >= 39.8528641705 AND `zipcodes`.`latitude` <= 41.2985358295) 
+0

쉘에서 실행하고 Zipcodes 필터로 "재생"해 보셨습니까? 파이썬 manage.py 셸 – Jesse

+0

껍질에서하지 않았지만 .. 코드와 함께 놀았어요 .. 예를 들면 : : : 나는 각각의 minlat, maxlat, etc 값에 100을 더했습니다. ll은 (아마 모든) 결과를 반환 할 것입니다. 그래서 나는 값이 어떻게 든 망쳐 놓은 것 같아요. 나는 또한 변수가 아닌 정확한 값을 입력하려고 시도했다. 아무것도 수행하지 못했다. – Chris

+0

PS가 질문 인 경우 파이썬의 마지막 두 줄은 "SELECT (여기에있는 물건 중 하나)에서 우편 번호"라는 쿼리입니다 ... – jcfollower

답변

2

난 당신이 수레에 orderloc에 위도와 경도를 변환하는 것으로 나타났습니다이다. 처음에는 어떤 필드 유형이 모델에 있습니까? Django에는 FloatField 필드 유형이 있으므로 부동 소수점을 처리하는 경우 모델에서 해당 필드 유형을 사용해야합니다. 이 사실을 기반으로 실제 참 파란색 부동 소수점을 CHAR 값과 비교하는 문제 일 수 있다고 생각합니다. 정확히 일치하지는 않습니다.

또는 파이썬의 부동 소수점은 때때로 계산을 한 후에 25가 아니라 25.00000000001과 같은 숫자를 반환하는 경우가 있습니다. 일반적으로 고정 된 숫자 세트가있는 위도와 경도를 다루고 있으므로 DecimalFields을 사용해 볼 수도 있습니다. 이것들은 본질적으로 수레처럼 기능하지만 정의 된 수의 장소로 저장된 데이터를 제한합니다. 다시 말하지만, 그냥 아이디어를 던지십시오.

+0

.. 지금보십시오. – Chris

+0

고마워요. .. :) – Chris

+0

문제 없습니다. 다행이라고 생각합니다. –