编辑2
好的,geopy有一个开箱即用的解决方案,只是文档不够完善。
import geopy
import geopy.distance
start = geopy.Point(48.853, 2.349)
d = geopy.distance.VincentyDistance(kilometers = 1)
print d.destination(point=start, bearing=0)
输出为 48 52m 0.0s N, 2 21m 0.0s E
(或 Point(48.861992239749355, 2.349, 0.0)
)。
90度方位角对应东方,180度是南方,以此类推。
旧的答案:
一个简单的解决方法是:
def get_new_point():
return (-24680.1613, 6708860.65389)
然而,我不确定这是否在所有情况下都适用于您的目的。
好吧,认真地说,您可以开始使用 geopy。首先,您需要在 geopy 已知的坐标系中定义起点。乍一看,似乎您无法仅仅“添加”一定距离到某个方向。我认为原因是计算距离是一个没有简单反演解的问题。否则我们如何反演在 https://code.google.com/p/geopy/source/browse/trunk/geopy/distance.py#217 中定义的 measure
函数?
因此,您可能希望采取迭代方法。
正如此处所述:https://dev59.com/Cmox5IYBdhLWcg3wnltI#9078861,您可以按以下方式计算两个给定点之间的距离:
pt1 = geopy.Point(48.853, 2.349)
pt2 = geopy.Point(52.516, 13.378)
dist = geopy.distance.distance(pt1, pt2).km
如果您要向北前进1公里,可以将纬度迭代地改变为正方向,并根据距离检查。您可以使用例如SciPy中的简单迭代求解器自动化这种方法:只需通过http://docs.scipy.org/doc/scipy/reference/optimize.html#root-finding中列出的一种优化器找到geopy.distance.distance().km - 1
的根。
我认为改变纬度为负方向是明显向南前进,而改变经度是向西或向东前进。
我没有这样的地理计算经验,只有在没有直接简单的方法可以“向北”前进一定距离时,这种迭代方法才有意义。
编辑:我提议的一个示例实现:
import geopy
import geopy.distance
import scipy.optimize
def north(startpoint, distance_km):
"""Return target function whose argument is a positive latitude
change (in degrees) relative to `startpoint`, and that has a root
for a latitude offset that corresponds to a point that is
`distance_km` kilometers away from the start point.
"""
def target(latitude_positive_offset):
return geopy.distance.distance(
startpoint, geopy.Point(
latitude=startpoint.latitude + latitude_positive_offset,
longitude=startpoint.longitude)
).km - distance_km
return target
start = geopy.Point(48.853, 2.349)
print "Start: %s" % start
latitude_positive_offset = scipy.optimize.bisect(north(start, 1), 0, 2)
end = geopy.Point(
latitude=start.latitude + latitude_positive_offset,
longitude=start.longitude
)
print "1 km north: %s" % end
print "Control distance between both points: %.4f km." % (
geopy.distance.distance(start, end).km)
输出:
$ python test.py
Start: 48 51m 0.0s N, 2 21m 0.0s E
1 km north: 48 52m 0.0s N, 2 21m 0.0s E
Control distance between both points: 1.0000 km.