使用GeoDjango获得2点之间的距离?[关闭]


11

我有两个由gps坐标定义的位置,纬度/经度很像Google地图返回的位置:

http://gmaps-samples.googlecode.com/svn/trunk/geocoder/singlegeocode.html

我需要计算它们之间的距离。我知道我可以使用google API,但是我将处理批量查询,所以我宁愿在自己的服务器上进行操作。

我已经花了几个小时阅读文档,安装了geodjango OK,但是似乎找不到这个示例。文学中的一切都比我需要的复杂得多。

Answers:


9

答案似乎在此Google网上论坛线程中

from django.contrib.gis.geos import GEOSGeometry
pnt = GEOSGeometry('SRID=4326;POINT(40.396764 -3.68042)')
pnt2 = GEOSGeometry('SRID=4326;POINT( 48.835797 2.329102  )')
pnt.distance(pnt2) * 100

3
请记住,POINT()的格式为POINT(XY)。您可能试图以马德里为例,但是您使用的积分实际上分别在印度洋和肯尼亚。

6
目的是* 100什么?
克里斯蒂安·丘皮图

4
您不应该将这些点转换为以米为单位的投影吗?如果您知道的话,请使用UTM区域以获得更好的准确性。>>> pnt.transform(900913)>>> pnt2.transform(900913)>>> pnt.distance(pnt2)1153485.9216961625
monkut 2012年

似乎Point未使用
Oleg Belousov

1
不要使用此答案。距离函数不遵循任何形式的SRID,只会在2d平面上给出距离。
乔纳森·理查兹


2

您也可以使用Point。

from django.contrib.gis.geos import Point
p1 = Point(37.2676483,-6.9273579)
p2 = Point(37.2653293,-6.9249401)
distance = p1.distance(p2)
distance_in_km = distance * 100

1
不要使用此答案。距离函数不遵循任何形式的SRID,只会在2d平面上给出距离。
乔纳森·理查兹

1

您还可以使用Sven Marnach的Python代码获得所需的结果。我添加了一行代码以米为单位获取结果。

码:

from math import sin, cos, radians, degrees, acos

def calc_dist(lat_a, long_a, lat_b, long_b):
    lat_a = radians(lat_a)
    lat_b = radians(lat_b)
    long_diff = radians(long_a - long_b)
    distance = (sin(lat_a) * sin(lat_b) +
                cos(lat_a) * cos(lat_b) * cos(long_diff))
    resToMile = degrees(acos(distance)) * 69.09
    resToMt = resToMile / 0.00062137119223733
    return resToMt

0

如果您想要一个不使用geodjango库或函数的答案。寻找一些带有标签的问题和答案。它们为您提供适用于任何语言或框架的公式。一个这样的问题是GPS坐标之间的距离


我宁愿使用geodjango,因为我认为执行批量计算的最有效方法是使用空间db的内部逻辑。我网站的其余部分是django,因此最好在同一框架下使所有内容保持一致。
MadMaardigan'3

0

我非常喜欢在django和geopy的帮助下见过的解决方案。尽管如此,我还是稍微修改了代码,以便可以自由输入两个以上的点。

from django.contrib.gis.geos import Point
from geopy.distance import distance as geopy_distance
from itertools import tee, izip


def pairwise(iterable):
    a, b= tee(iterable)
    next(b, None)
    return izip(a,b)

chicago = Point(41.50, 87.37)
san_francisco = Point(37.47, 122.26)
st_louis = Point(38.62, 90.19)
washington = Point(38.53, 77.02)

points = (washington, st_louis, chicago, san_francisco)

d = sum(geopy_distance(a,b).meters for (a,b) in pairwise(points))

distance_km = d/1000
distance_miles = distance_km*0.621371

print "Distance in kilometre: ",distance_km
print "Distance in miles: ",distance_miles
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.