Python将x,y数据转换为纬度和经度数据

时间:2018-07-03 13:24:53

标签: python python-3.x math geolocation trigonometry

此代码是一个函数,然后使用if语句通过for循环运行它(为简洁起见不包括在内,但基本上,它使我可以按机器和位置分离一些工厂输出数据)。该函数旨在将x和y数据(以米为单位)从已知的经纬度位置转换为已知纬度,并将其转换为新的经纬度位置。我使用毕达哥拉斯(Pythagoras),然后在SO上找到一个公式。

它可以正常工作,但是数学失败,因为它或多或少地增加了输出的经度。它应该产生与参考位置非常相似的数据,因为它离参考位置的距离不得超过50米。

这是JSON的一部分,从中获取数据

"id": "b4994c877c9c",
"name": "forklift_0001",  <---forklift data used in IF statement
"areaId": "Tracking001",
"areaName": "hall_1",
"color": "#FF0000",
"coordinateSystemId": "CoordSys001",
"coordinateSystemName": null,
"covarianceMatrix": [
    0.47,
    0.06,
    0.06,
    0.61
],
"position": [
    33.86,    <---position data converted from known lat/long, X then Y.
    33.07,
    2.15
   ],
    "positionAccuracy": 0.36,
    "positionTS": 1489363199493,
    "smoothedPosition": [
        33.96,
        33.13,
        2.15

这是代码

import json
import pprint
import time
import math

file_list = ['13_01.json']

output_nr = 1

def positionToLatLon( position ):
    posx = position[0]
    posy = position[1]
    R = 6371 #Radius of the Earth
    brng = 1.57 #Bearing is 90 degrees converted to radians.
    d = math.sqrt((posx*posx) + (posy*posy)) #Distance in km from the lat/long  #Pythagoras formula
    lat1 = math.radians(40.477719)#reference lat point converted to radians
    lon1 = math.radians(16.941589)#reference 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)
    result = []
    result.append(lat2)
    result.append(lon2)
    return result

因此它运行时没有任何错误,但输出不正确,它或多或少地增加了一定的经度,因此将整个结果向东移动了60m,使分析效果不好,我不明白为什么。

我一直在寻找其他公式,但是没有运气,我的数学还不足以判断我是否使用了错误的三角函数或其他函数。

感谢所有帮助。

1 个答案:

答案 0 :(得分:0)

将brng = 1.57更改为brng =(math.pi / 2)。这不是一个合适的估计值,很可能是您所有错误(如果不是全部)的来源