给出起始坐标,方位和距离的目标坐标

问题描述 投票:2回答:4

enter image description here我正在看这里列出的公式:http://www.movable-type.co.uk/scripts/latlong.html

我似乎遇到了麻烦,因为结果坐标不是我所期望的那样。

鉴于以下信息:

开始年份:28.455556

开始lon:-80.527778

承重:317.662819(度)

距离:130.224835(海里)

def getEndpoint(lat1,lon1,bearing,d):
        R = 6378.1                   #Radius of the Earth
        brng = math.radians(bearing) #convert degrees to radians
        d = d*1.852                  #convert nautical miles to km
        lat2 = math.asin( math.sin(lat1)*math.cos(d/R) + math.cos(lat1)*math.sin(d/R)*math.cos(brng))
        lon2 = lon1 + math.atan2(math.sin(brng)*math.sin(d/R)*math.cos(lat1),math.cos(d/R)-math.sin(lat1)*math.sin(lat2))
        return lat2,lon2

该函数返回:

结束年份:-0.209110644042

结束时间:-80.5017472335

但这是我开始位置以东的坐标,它没有任何意义,因为317轴承指向我的起始位置的西北方向。

上面的图片是左上角的最终结束坐标应该是什么样子。

哪里出错了?

python coordinates gis latitude-longitude
4个回答
1
投票

根据this page

math.sin(x) ...返回x弧度的正弦值。

因此,您需要在等式之前将lat1和lon1转换为弧度,然后您可以将lat2和lon2转换回度。


1
投票

Doh我忘记转换为弧度然后在计算完成后转换回度数。这是最终的代码:

def getEndpoint(lat1,lon1,bearing,d):
    R = 6371                     #Radius of the Earth
    brng = math.radians(bearing) #convert degrees to radians
    d = d*1.852                  #convert nautical miles to km
    lat1 = math.radians(lat1)    #Current lat point converted to radians
    lon1 = math.radians(lon1)    #Current long point converted to radians
    lat2 = math.asin( math.sin(lat1)*math.cos(d/R) + math.cos(lat1)*math.sin(d/R)*math.cos(brng))
    lon2 = lon1 + math.atan2(math.sin(brng)*math.sin(d/R)*math.cos(lat1),math.cos(d/R)-math.sin(lat1)*math.sin(lat2))
    lat2 = math.degrees(lat2)
    lon2 = math.degrees(lon2)
    return lat2,lon2

1
投票

如果您想要高精度结果,请考虑使用geodesics。以下是GeographicLib的示例,它使用以度为单位的角度单位和以米为单位的距离单位。

from geographiclib.constants import Constants
from geographiclib.geodesic import Geodesic

def getEndpoint(lat1, lon1, bearing, d):
    geod = Geodesic(Constants.WGS84_a, Constants.WGS84_f)
    d = geod.Direct(lat1, lon1, bearing, d * 1852.0)
    return d['lat2'], d['lon2']

print(getEndpoint(28.455556, -80.527778, 317.662819, 130.224835))
# (30.05352669918092, -82.21197985232848)

这应该距离确切位置不超过几纳米。


0
投票

另请注意,您的纬度位于赤道以南。我怀疑你的问题是坐标系:三角函数一般用笛卡尔坐标:参考角度(方位0)是+ x轴,也称为“正东方”,向+ y方向(逆时针方向)前进。指南针标题从北方开始顺时针方向。

替换1:

brng = math.radians(90-bearing) #convert degrees to radians

你也错过了使用你的起始纬度。尝试:

lat2 = lat1 + math.asin(...

这给了我们最终的位置

(28.246445355975514, -80.50284677329569)
© www.soinside.com 2019 - 2024. All rights reserved.