在将从PHP复制的经纬度SQL查询迁移到新Python后端时遇到困难,需征求意见

0 投票
1 回答
571 浏览
提问于 2025-04-16 22:18

我正在把一个网站的后台换成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。这个字段类型基本上和浮点数一样,但它限制存储的数据位数。再次强调,这只是一些建议。

撰写回答