此代码是一个函数,然后使用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,使分析效果不好,我不明白为什么。
我一直在寻找其他公式,但是没有运气,我的数学还不足以判断我是否使用了错误的三角函数或其他函数。
感谢所有帮助。
答案 0 :(得分:0)
将brng = 1.57更改为brng =(math.pi / 2)。这不是一个合适的估计值,很可能是您所有错误(如果不是全部)的来源