问题1:纬度和经度的长度不同...在赤道上(假设地球是一个球体)它们相同,但在极点,一个经度的长度为零。
更新:为了举例说明问题的严重性:
向南或向北移动一度纬度大约相当于行驶111.2公里(假设地球是一个球体)。向东或向西移动一度经度在赤道上大约相当于行驶111.2公里。在纬度为-41.3度时,只有83.5公里。
从(-41.3,174.8)到东边的(-41.3,174.92)距离为10.0公里。您的计算将其视为13.3公里——错误率达33%。
通过一个相当简单的近似值,您可以达到4米的误差。
from math import pi, sqrt, radians, cos
Earth_radius_km = 6371.009
km_per_deg_lat = 2 * pi * Earth_radius_km / 360.0
def approx_dist_1(lat1, lon1, lat2, lon2):
return km_per_deg_lat * sqrt((lat1 - lat2) ** 2 + (lon1 - lon2) ** 2)
def approx_dist_2(lat1, lon1, lat2, lon2):
km_per_deg_lon = km_per_deg_lat * cos(radians(lat1))
return sqrt((km_per_deg_lat *(lat1 - lat2)) ** 2 + (km_per_deg_lon * (lon1 - lon2)) ** 2)
这个大概的距离对于“寻找最近的披萨店”等应用程序来说足够好,而且它的优点是可以在像SQLite这样不支持正弦/余弦/正切及其反函数的基本环境中使用。
问题2:SQLite是宽容的,但你不应该养成使用引号的习惯,比如 (lat - '-41.288889')
问题3:我无法在SQLlite级别上重现你的问题:
sqlite> create table foo (lat float, lon float);
sqlite> insert into foo values(99.9, -170.1);
sqlite> select * from foo;
99.9|-170.1
sqlite> SELECT *, ((lat - '-41.288889') * (lat - '-41.288889')
...> + (lon - 174.777222) * (lon - 174.777222)) AS distance from foo;
99.9|-170.1|138874.600631492
sqlite>
也许您应该详细说明“This of seems to return the objects in the correct order, but I have no access to the distance attribute”... introspecting e 告诉您什么?
也许您应该进一步解释“这似乎按正确顺序返回对象,但我无法访问距离属性”的含义... introspecting e 对您有何启示?