Django 计算两点域之间的距离-为什么我的结果不正确?
我试图计算两个位置之间的距离(以英里为单位),但得到的结果不正确 我认为它不正确的原因是,我在上面加了位置(纬度和经度),得到的距离以英里为单位,为Django 计算两点域之间的距离-为什么我的结果不正确?,django,geospatial,postgis,geodjango,Django,Geospatial,Postgis,Geodjango,我试图计算两个位置之间的距离(以英里为单位),但得到的结果不正确 我认为它不正确的原因是,我在上面加了位置(纬度和经度),得到的距离以英里为单位,为0.055。下面是我代码中的详细信息 PointField A : (-122.1772784, 47.7001663) PointField B : (-122.1761632, 47.700408) Distance : 0.001141091551967795 然而,根据网站的说法,距离应该是 Distance: 0.055 miles 下
0.055
。下面是我代码中的详细信息
PointField A : (-122.1772784, 47.7001663)
PointField B : (-122.1761632, 47.700408)
Distance : 0.001141091551967795
然而,根据网站的说法,距离应该是
Distance: 0.055 miles
下面是我计算距离的方法
这是我的模型
class modelEmp(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
location = models.PointField(srid=4326,max_length=40, blank=True, null=True)
objects = GeoManager()
这就是我计算距离的方法
result = modelEmpInstance.location.distance(PointFieldBLocation)
where result = 0.001141091551967795
关于我在这里可能做错了什么以及为什么我的结果与网站不同,有什么建议吗?您的计算没有错,但结果是以
EPSG:4326
的单位表示的,单位是度。为了计算所需单位的距离,我们需要执行以下操作:
将点转换为具有米单位的EPSG
- 如果您不太关心计算的准确性,可以使用
EPSG:3857
(但结果将是0.08104046068988752mi
)。
- 如果您确实关心计算的准确性,那么您需要找到一个带有适合您所在位置的仪表单位的EPSG。由于您的积分位于西雅图地区附近,因此相应的EPSG为
32148
创建以米为单位计算距离的对象
最后,将其转换为英里
:
from django.contrib.gis.measure import Distance
result = Distance(
m = modelEmpInstance.location.transform(
32148, clone=True
).distance(PointFieldBLocation.transform(32148, clone=True)
)
print(
'Raw calculation: {}\nRounded calculation: {}'
.format(result.mi, round(result.mi, 2)
)
这将打印:
Raw calculation: 0.0546237743898667
Rounded calculation: 0.055
FWIW我刚刚在Google Earth中输入了你的点,测量了282英尺或0.0534091英里之间的直接距离,这意味着其他网站是正确的,出于某种原因,我在代码中的计算是错误的变量modelEmpInstance
和PointFieldBLocation
来自哪里?(旁注-如果你使用camelcase作为变量,你的代码将更容易被其他人阅读。答案是正确的-只是以度为单位!我对GeoDjango了解不够,无法给出答案,但要从PostGIS获得米数结果,您要么需要米数SRID,要么使用地理类型而不是几何类型,要么使用st_distance_sphere。由于您的距离很小,您最准确的选择可能是使用局部投影。可能是重复的感谢您清除此问题。我是新来的。有没有一个服务可以告诉我什么是基于经纬度的EPSG?或者有一个标准的EPSG我可以使用吗?我不知道有一个网站,你可以添加一个点,并获得适当的EPSG的地方。但你可以做的是搜索你的点在地图上的位置,然后用谷歌搜索类似“西雅图EPSG”的东西。从那以后,我相信了,我一直在读一些关于EPSG的书。但我有一个问题。你提到我最初的结果是正确的,但以度为单位。有没有办法把它转换成长度单位?我不是在寻找一个超级精确的结果,但应该是+-15英里great@MistyD没有一种标准的方法可以做到这一点。如果你不在乎准确性,你可以使用EPSG:3857
。今天晚些时候我将尝试一下并标记它