在将从PHP复制的经纬度SQL查询迁移到新Python后端时遇到困难,需征求意见
我正在把一个网站的后台换成Django,因为它最开始是用PHP写的,简直是一团糟,地球上或火星上都没有比这更糟糕的了……总之,我把我写的PHP和Python代码复制到下面。它们返回的值是完全一样的,但不知道为什么,Django/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)";
Python:
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)
附言:这是Django返回的查询结果……
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 )
1 个回答
2
我注意到你在把orderloc
里的经纬度转换成浮点数。那你在模型里,这些经纬度的字段类型是什么呢?Django有一个叫FloatField
的字段类型,如果你要处理浮点数,应该在模型里用这个字段类型。我在想,这可能是因为你在比较真正的浮点数和像字符(CHAR)这样的值时,它们不完全匹配,导致了问题。
另外,Python里的浮点数有时候会有点奇怪,比如在计算后返回25.00000000001,而不是整整的25。因为你在处理经纬度,这通常有固定的小数位数,你也可以试试使用DecimalFields
。这个字段类型基本上和浮点数一样,但它限制存储的数据位数。再次强调,这只是一些建议。