地理定位、准确性和仿射变换:是什么导致我从 lat/long 位置到图像上的点的不准确转换

Geolocation, Accuracy and Affine Transformation: What is causing my inaccurate conversion from a lat/long location into a point on my image

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

使用 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) 定义的线的另一侧).我试图告诉不准确的原因是什么。 (不过我暂时假设表观反射是巧合)

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

仿射变换根本不起作用 - 但根据 link 提供它包括缩放,所以这不应该是问题的原因 我的变量设置有问题 - 我查看我的代码的时间太长了,看不出它是否存在。 我失去了太多的准确性,将 var 数据移动到 MySQL 作为浮点数或 PHP 作为字符串 我没有从点击数据/lat/long 输入中提供足够准确的信息。 - 我在点击地图并从 google 地图获取 lat/long 时显着放大了我 SVG 不够准确 - 虽然查看 xml 数据它保留小数点。 我正在处理的区域太大,无法通过假设本地地图是平面来简化

感谢您的帮助,感谢您阅读到这里。

为了进一步参考,我将 JavaScript 给我的 lat/long 数据放入 google 地图中,我比较的是准确度而不是我的实际位置。

附加参考:我在图像的东西边缘发现"landmarks",经度差为0.02695,图像的长度至少是高度的两倍。

完整 运行-through 值的样本值。

参考点

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

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

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

点 2 (lat,long) = (X.10365341,-Y.457014)

地理位置

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

给定坐标(纬度,经度)=(X.102851,-Y.459996)

真实信号 (x,y) = (1022.7498707999475,351.02335709985346)

真实信号(近似经纬度)= (X.101964, -Y.459340)

(真正的光点经纬度是近似的,因为它在没有好的地标的水体中)

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

此外,我在 Chrome 的开发人员工具中使用了经纬度值,轴似乎稍微旋转了大约 30 度

经过充分的探索后,我发现我错误地订购了纬度和经度。在我尚未从顶部 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 度并且代码保持不变