地理位置、准确性和仿射变换:是啥导致我从纬度/经度位置不准确地转换为图像上的点

Posted

技术标签:

【中文标题】地理位置、准确性和仿射变换:是啥导致我从纬度/经度位置不准确地转换为图像上的点【英文标题】:Geolocation, Accuracy and Affine Transformation: What is causing my inaccurate conversion from a lat/long location into a point on my image地理位置、准确性和仿射变换:是什么导致我从纬度/经度位置不准确地转换为图像上的点 【发布时间】:2015-07-12 21:29:04 【问题描述】:

我已经实现了一些代码来创建一些代码来处理相对较小位置的图像,例如平面,以便在我存储的图像上的位置和传入的纬度/经度信息之间进行转换。

使用https://msdn.microsoft.com/en-us/library/jj635757(v=vs.85).aspx 提供的公式,我编写了这些代码行以及其他代码

var vector = math.matrix(
[[x1],
 [y1],
 [x2],
 [y2]]);
var matrix = math.matrix(
[[lat1,long1,1,0]
,[-long1,lat1,0,1]
,[lat2,long2,1,0]
,[-long2,lat2,0,1]]);
var solution = math.multiply(math.inv(matrix),vector);

当我将它放入并从我的数据库中取回时,存在从返回到解决方案的向量到转换数据的隐式转换。

a = parseFloat(conversiondata['A']);
b = parseFloat(conversiondata['B']);
c = parseFloat(conversiondata['C']);
d = parseFloat(conversiondata['D']);
var long = position.coords.longitude;
var lat = position.coords.latitude;
var x = a * lat + b * long + c;
var y = b * lat - a * long + d;

x1、x2、y1、y2 的值​​是通过获取用户点击数据提供的。 lat1、lat2、long1、long2 的值是用户在两次点击地图图像时提供的。

当将 x,y 放回地图上时,它的位置并不完全正确,地图上的位置似乎几乎位于 (x1,y1) 和 (x2,y2) 定义的线的另一侧。我试图说明不准确的原因是什么。 (不过,我暂时假设表面反射是巧合)

如果有人可以帮助我缩小可能出现问题的范围,这是我考虑过的事情(地图在任何方向上都达不到一英里以供参考)。

仿射变换根本不起作用 - 但根据链接,只要它包含缩放,因此不应该是问题的原因 我的变量设置有问题 - 我查看我的代码太久了,看不到它是否存在。 将 var 数据作为浮点数移动到 mysql 或作为字符串移动到 php 时,我失去了太多的准确性 我没有从点击数据/纬度/经度输入中提供足够准确的信息。 - 我在点击地图并从谷歌地图获取纬度/经度时显着放大 SVG 不够准确 - 虽然查看 xml 数据,但它保留了小数。 我正在处理的区域太大而无法通过假设本地地图是平面来简化

感谢您的帮助,感谢您阅读本文。

为了进一步参考,我将 javascript 提供给我的纬度/经度数据放入谷歌地图中,​​我将准确度与该数据进行比较,而不是我的实际位置。

附加参考:我在图像的东西边缘发现了“地标”,并计算出经度差为 0.02695,图像长度至少是高度的两倍。

完整运行值的示例值。

参考点

点 1 (x,y) = (619,564)

点 1(纬度、经度)= (X.099546,-Y.465179)

点 2 (x,y) = (1181,190)

点 2(纬度、经度)= (X.10365341,-Y.457014)

地理位置

预测坐标 (x,y) = (975,262)

给定坐标(lat,long) = (X.102851,-Y.459996)

真实昙花一现 (x,y) = (1022.7498707999475,351.02335709985346)

真正的光点(大约 lat,long)= (X.101964, -Y.459340)

(真正的 blip lat long 是近似的,因为它位于没有良好地标的水体中)

为了安全起见,我已从纬度/经度坐标中取出小数点前的数字,但我可以确认所有 X 都相等并且所有 Y 都相等

此外,我在 Chrome 的开发人员工具中使用了 lat long 值,看起来轴与应有的位置旋转了大约 30 度

【问题讨论】:

地球不是二维坐标系,而是一个扁球体。 我打算使用它的区域非常小,最多几个街区。我不认为由曲率引起的漂移应该很大,除非有人可以提供一些参考来估计漂移的大小 你能举个例子吗? 这需要一点时间,自从我最初的问题发布以来,我已经移动了一点,如果你能给出一个更具体的例子来说明你想看到什么数字,我会很高兴帮助。作为参考,您可能在纬度/经度空间中要求的坐标将包括我的参考点、我的 gps 坐标、我的 blip 的纬度/经度翻译到地图上或更抽象地是我的地图的角落。在 x/y 空间坐标将再次包括两个参考点,即图像的 blip 和高度/宽度。 @萨尔曼 只是一些样本坐标,你得到的结果,我的意思是预期的结果。 【参考方案1】:

经过充分的探索后,我发现我错误地订购了纬度和经度。在我尚未从顶部的 N 旋转的地图上,以下代码将我带到几英尺之内,这比依赖用户输入和像素网格导致的精度不足更容易解释。

var matrix = math.matrix(
[[long1,lat1,1,0]
,[-lat1,long1,0,1]
,[long2,lat2,1,0]
,[-lat2,long2,0,1]]);

var x = a * long + b * lat + c;
var y = b * long - a * lat + d;

对于有兴趣将其作为简化应用数学的潜在解决方案的任何其他人 发生的漂移在对角线为 8000 英尺且参考点相差约 3000 英尺的地图上不到 40 英尺。这意味着漂移仅略高于参考点距离的 1%,这包括人为错误的影响。

当您在较小的地图上工作时,此错误应该会减少,而在您在较大的地图上工作时会增加。

我在地图上再次测试了它,旋转了约 90 度,代码被搁置了

【讨论】:

以上是关于地理位置、准确性和仿射变换:是啥导致我从纬度/经度位置不准确地转换为图像上的点的主要内容,如果未能解决你的问题,请参考以下文章

使用从笛卡尔空间和世界文件生成的纬度和经度计算多边形面积

使用从笛卡尔空间和世界文件生成的纬度和经度计算多边形区域

如何使用 FusedLocationProviderClient 获取准确的位置(纬度和经度)

如何在本机反应中获得当前位置的准确纬度和经度

从地理编码纬度和经度获取地址

使用 Android GPS 位置纬度/经度准确计算车速 (MPH)