javascript - 地理定位、准确性和仿射变换 : What is causing my inaccurate conversion from a lat/long location into a point on my image

标签 javascript mysql svg geolocation coordinate-systems

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

使用 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 值由用户响应两次点击 map 图像而提供。

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

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

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

感谢您提供任何帮助,感谢您阅读到这里。

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

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

完整运行值的示例值。

引用点

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

点 1 (lat,long) = (X.099546,-Y.465179)

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

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

地理位置

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

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

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

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

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

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

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

最佳答案

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

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;

对于有兴趣将此作为简化其应用程序数学运算的潜在解决方案的任何其他人 发生的漂移在对 Angular 线为 8000 英尺且引用点差异约为 3000 英尺的 map 上不到 40 英尺。这意味着漂移略高于引用点距离的 1%,这包括人为错误的影响。

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

我在一张旋转了 ~90 度的 map 上再次测试了它并且代码被阻止了

关于javascript - 地理定位、准确性和仿射变换 : What is causing my inaccurate conversion from a lat/long location into a point on my image,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31372785/

相关文章:

php - 搜索在 laravel 中不起作用

php - Laravel 无法在 mysql 中创建新的表字段

php - PDO mySql 查询在调用时第二次没有在 for 循环中执行

jquery - 如何避免在拉斐尔中使用文本?

html - 是否可以使用 CSS 在 SVG 元素上设置背景图像?

javascript - 有没有办法检测对象的属性何时发生更改?

javascript - 如何获取小数点后的任意位数以及我必须存储的数据类型

javascript - 如何更换 Cordova 主页?

javascript - 迭代 Angular 4 Firebase 数据库中的对象数组

带有 svg 的 css 剪辑路径在 Chrome 中不起作用