当前位置: 首页 > 面试题库 >

根据距离和方向计算点

郭琦
2023-03-14
问题内容

我想使用GeoDjango或GeoPy根据方向和距离计算一个点。

例如,如果我的点是(-24680.1613,6708860.65389),我想使用Vincenty距离公式找出北1KM,东1KM,苏尔1KM和西1KM的点。

我能找到的最接近的东西是distance.py(https://code.google.com/p/geopy/source/browse/trunk/geopy/distance.py?r=105)中的“目标”函数。尽管我在任何地方都找不到此文档,但我仍想弄清楚如何使用它。

任何帮助深表感谢。


问题答案:

编辑2

好的,有一个带有geopy的即用型解决方案,只是没有充分记录在案:

import geopy
import geopy.distance

# Define starting point.
start = geopy.Point(48.853, 2.349)

# Define a general distance object, initialized with a distance of 1 km.
d = geopy.distance.VincentyDistance(kilometers = 1)

# Use the `destination` method with a bearing of 0 degrees (which is north)
# in order to go from point `start` 1 km to north.
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():
    # After going 1 km North, 1 km East, 1 km South and 1 km West
    # we are back where we were before.
    return (-24680.1613, 6708860.65389)

但是,我不确定这是否完全符合您的目的。

好的,说真的,您可以开始使用geopy。首先,您需要在geopy已知的坐标系中定义起点。乍一看,您似乎不能只是将某个距离“增加”到某个方向。我认为原因是,距离的计算是一个没有简单逆解的问题。或者我们将如何反转https://code.google.com/p/geopy/source/browse/trunk/geopy/distance.py#217中measure定义的功能?

因此,您可能需要采取迭代方法。

如此处所述:您可以像这样计算两个给定点之间的距离:

pt1 = geopy.Point(48.853, 2.349)
pt2 = geopy.Point(52.516, 13.378)
# distance.distance() is the  VincentyDistance by default.
dist = geopy.distance.distance(pt1, pt2).km

如果向北走一公里,您会反复将纬度更改为正方向,并对照距离进行检查。您可以使用简单的迭代求解器(例如SciPy)自动执行此方法:只需geopy.distance.distance().km - 1通过http://docs.scipy.org/doc/scipy/reference/optimize.html#root-
finding中
列出的优化器之一找到的根。

我认为很明显,您可以通过将纬度更改为负方向来向南移动,而通过更改经度则可以向西和向东移动。

我没有进行此类地理计算的经验,仅当没有简单的直接方法“向北”行驶一定距离时,这种迭代方法才有意义。

编辑: 我的建议的示例实现:

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

# Find the root of the target function, vary the positve latitude offset between
# 0 and 2 degrees (which is for sure enough for finding a 1 km distance, but must
# be adjusted for larger distances).
latitude_positive_offset = scipy.optimize.bisect(north(start, 1),  0, 2)


# Build Point object for identified point in space.
end = geopy.Point(
    latitude=start.latitude + latitude_positive_offset,
    longitude=start.longitude
    )

print "1 km north: %s" % end

# Make the control.
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.


 类似资料:
  • 我需要计算汽车行驶的距离!不是距离,不是距离到否。如果我们通过谷歌提供的API计算,距离可以完全不同。谷歌可以提供从一个点到另一个点的1公里距离,但汽车可以按照骑手想要的方式行驶800米。使用加速计没有帮助。它适用于步行,但绝不适用于更快的速度。 我尝试过使用Google的位置API:距离到或距离之间根本不是一个选项。它可以给出与IN REAL截然不同的结果。在真实的汽车中,可以通过非常短的地方并

  • 问题内容: 我正在尝试使用Haversine公式来计算由纬度和经度标识的一长串位置的距离矩阵,该公式采用两个坐标对的元组来产生距离: 我可以使用嵌套的for循环计算所有点之间的距离,如下所示: 使用一个简单的函数: 但是考虑到时间的复杂性,这需要花费相当长的时间,大约需要20秒才能获得500点,而且我的清单要长得多。这让我着眼于矢量化,并且遇到了((docs)),但无法弄清楚如何在这种情况下应用它

  • 问题内容: 我很难缠一些三角学。我正在尝试根据起始纬度,对数,距离和方位来推论目标纬度和经度。 幸运的是,我找到了一个令人惊叹的网站,该网站准确地描述了我需要的功能:http : //www.movable- type.co.uk/scripts/latlong.html “给定目标点的距离并与起点保持距离”我尝试了java程序,但对我不起作用。我按照网站所述部署它。这是我的代码: 但它显示的输出

  • 我有一个多边形类型的几何体,我正在计算一个点的最小距离可能在多边形几何体内部(由360个点组成,作为闭合几何体)或多边形几何体外部。使用postgis的ST_distance方法,当点在几何体外部时,我得到精确的距离,但如果点在几何体内部,则得到0作为距离,我想要与多边形几何体最近点的点之间的最小距离,无论该点位于几何体内部还是外部。

  • 我目前正在开发一个专注于健身的应用程序。我的基本想法是允许人们跟踪他们的速度、距离和时间。到目前为止,我已经通过使用位置管理器getSpeed()设法获得了速度。我想知道如何获得旅行的距离?我寻找了一些示例,但对我来说有点困惑,因为我刚刚开始使用android。我将感谢任何帮助或建议,谢谢

  • 我试图使用Scala类计算两点之间的距离。但它给出了一个错误说 类型不匹配;发现:其他。需要类型(具有基础类型点):?{def x:?}请注意,隐式转换不适用,因为它们是不明确的:在[A](x:A)类型的对象Predef中确保[A]的方法any2Ensuring和在[A](x:A)“ArroAssoc[A]类型的对象Predef中的方法Ani2ArrowasSoc都是可能的其他转换函数。输入到?{