GeographicLib工具箱
1.50版2019-09-19
这个工具箱提供了一个子集的原生MATLAB实现
c++库,GeographicLib。这个工具箱的关键组件是
*测地线:直接,反,面积计算。
*投影:横向墨卡托投影、极立体投影等
*网格系统:UTM, UPS, MGRS。
*大地水准面查找:支持EGM84, EGM96, EGM2008大地水准面。万博1manbetx
*几何变换:地心,局部笛卡儿。
*大椭圆:直接,反向,面积计算。
这个工具箱和MATLAB的Mapping有一些重叠
工具箱。然而,这个工具箱提供:
*更好的准确性;
*处理扁球形和长球形;
*保证距离收敛;
*测地线的面积和微分性质的计算;
*等距方位角和日晷的椭球面版本
预测。
这个包的子集以前是这样发布的:
椭球面上的测地线(已废弃)
椭球面测地线投影(撤回)
伟大的椭圆(撤销)
将所有功能包含在一个工具箱中会更简单
代码共享(通过公共私有目录)。
有关c++库的详细文档可在以下网站获得
https://geographiclib.sourceforge.io/1.50
大地水准面查找需要安装一个或多个大地水准面模型。
对此的说明已经给出了
https://geographiclib.sourceforge.io/1.50/geoid.html#geoidinst
这个包的更改日志可在
查尔斯·卡尼(2020)。geographiclib(//www.tianjin-qmedu.com/matlabcentral/fileexchange/50605-geographiclib), MATLAB中央文件交换。检索.
1.50 | geoarea现在可以处理任意复杂的多边形。 |
|
1.49 | 更新到1.49版本 |
|
1.48.0.0 | 修正了混合标量和数组参数的georeckon的bug。 |
|
1.47.0.0 | 提高面积计算的准确性(修正了1.46版本中引入的一个缺陷)。 |
|
1.46.0.0 | 提高了求解逆问题时的精度 |
|
1.45.0.0 | 同步geography lib 1.45。 |
|
1.44.1.0 | 修复geoddistance中的模糊错误(仅适用于Octave)。 |
|
1.44.0.0 | 同步geography lib 1.44。 |
|
1.43.0.0 | 与地理iclib 1.43同步。 |
|
1.6.0.0 | 恢复zip包装。MATLAB中心生成一个乱码压缩文件 |
|
1.42.1.0 | 版本1.42.1重新打包为工具箱以消除虚假的依赖。m文件中没有变化。 |
|
1.4.0.0 | 与地理iclib 1.42同步。仅对文档进行了小的更改。 |
|
1.3.0.0 | 消除对鲁棒控制工具箱的虚假依赖(再次!) |
|
1.2.0.0 | 消除对鲁棒控制工具箱的虚假依赖(再次!) |
|
1.1.0.0 | 去除虚假的所需产品。 |
>感谢您对这个图书馆的所有努力和支持万博1manbetx
> MATLAB社区。刚刚开始,我就不评价了
>。需要报告的一个潜在问题(不是bug)是存在
的Mathworks和geographiclib实现之间的差异
> ecc2flat函数。当地理学的lib在路径上早于
>映射工具箱,然后(至少在MATLAB 2018a中)抛出一个错误
>的距离。当第5个输入(椭球)为时,从映射工具箱中提取M
>指定。无论[semimmajor Ecc]或
使用> referenceEllipsoid。我测试了wgs84椭球不是一个
>复杂/扩展的价值。
如果地理库和
映射工具箱版本的ecc2flat,我将考虑尝试使其
定义(与flat2ecc)一致。但是文档
对于ecc2flat
//www.tianjin-qmedu.com/help/map/ref/ecc2flat.html
表示调用序列f = ecc2flat(椭球体)”将
在未来的版本中移除”。所以也许我应该按兵不动。
>一个无关的有趣的“发现”是,我得到了一些不同
如果我转换相同测试点的MathWorks距离的>答案
>所有的点一次vs单独循环。你的
>地球距离在前面是稳定的。
是的,从标量和向量输入得到相同的结果是a
设计目标。
>注意,对于我的简单测试用例,geoddistance的范围是74%
>(单点转换)到244% (10k点转换)比
>距离,但这可能是值得得到一致性和
>精度改进,您声称。性能似乎下降
>带有点数。
好的,谢谢你提供的信息。我没有地图的权限
工具箱,所以我不能独立验证这个。
我认为(希望)我的实现可能更快的一种情况是
用测地线计算在一条测地线上的多个点
(使用标量lat1, lon1, azi1和矢量s12调用大地估算)。
此外,我很好奇现在的映射工具箱在准确性方面做得如何。
你能帮我查一下吗?下载GeodTest.dat
http://doi.org/10.5281/zenodo.32156
然后
t =负载(“GeodTest.dat”);
s12 = t (: 7);
s12a = geoddistance (t (: 1), t (:, 2), t (:, 4), t (:, 5));
s12b =距离(t (: 1), t (:, 2), t (:, 4), t (:, 5) defaultellipsoid)
时期= abs (s12a-s12);
errb = abs (s12b-s12);
国家地震恢复重建局max ()
国家地震恢复重建局总和(~ (< 1 e - 3))
马克斯(errb)
总和(~ (errb < 1 e - 3))
…
(反向测试是为了捕获nan。)事实上,距离在同一时间
可能会在合法输入时返回nan,使其不能被正式使用。
(例如,它不能用于依赖于三角形的算法
不平等)。但我不确定这种情况是否仍然存在。
感谢您为这个库所做的所有努力,以及对MATLAB社区的支持。万博1manbetx刚刚开始,我先不给它打分。要报告的一个潜在问题(不是bug)是,ecc2flat函数的Mathworks和geographiclib实现之间存在差异。当地理位置库在路径上比映射工具箱早,那么(至少在MATLAB 2018a中),一个错误抛出的距离。当指定第5个输入(椭球体)时,从映射工具箱中提取M。不管是否使用[semimmajor Ecc]或referenceEllipsoid,都会发生这种情况。我测试了wgs84椭球体不是一个复杂/长值。
一个不相关的有趣“发现”是,对于相同的测试点,如果我一次转换所有点,而逐个循环它们,那么我从MathWorks距离得到的答案会略有不同。你的地理距离在前面很稳定。
请注意,对于我的简单测试用例,geodistance的速度比distance慢74%(单点转换)到244% (10k点转换),但这可能值得获得一致性以及您所宣称的精度改进。性能似乎会随着点数的增加而降低。
再次感谢!
很棒的包!
Help geocent_fwd说,纬度和lon应该是度数!
[X, Y, Z] = geocent_fwd(37.0328、15.065,370)
X = 4922883.48104775
Y = 1325070.28306503
Z = 3820522.46838327
要知道相对于其中一个车站的方向,你
应该使用loccart_fwd而不是geocent_fwd。
好!在你的漂移输出之间会出现一些差异
----------------------
>>格式长g
> > rad =π/ 180;
> > lat = 37.0328 * rad;
> >经度= 15.065 * rad;
> > h = 370.0;
> > [X, Y, Z] = geocent_fwd(纬度,经度,h)
X = 6378036.70547581
Y = 29269.4077049027
Z = 71471.7403795619
下面的内容来自https://www.ngs.noaa.gov/cgi-bin/Inv_Fwd/invers3d.prl与结果之前已att [sendspace工作正常,点击两次代替]和复制以下(1^st站仅)
第一站:CB
X = 4922883.4811 m LAT = 37 1 58.08000北
Y = 1325070.2831 m LON = 15 3 54.00000 East
Z = 3820522.4683米EHT = 370.0000米
----------
干杯
sendspace链接似乎要求我创建一个帐户并提供一封电子邮件。
我还没准备好这么做。所以请想办法给我发图片。
如果你想求两点之间的欧几里得距离你可以把它们转换成
地心坐标用geocent_fwd,然后使用毕达哥拉斯。
地理距离增强建议:标记到标记的距离。两个地面站,如图所示:
https://www.sendspace.com/file/i5sg1u
有可能在这里做它和链接吗?或者,或者显示(X,Y,Z)直角坐标算法?
谢谢提前
哦,是的!现在它正常工作了,函数变成:
---------
函数n = GeodSolve59
检查经度接近180度的点是否闭合。
n = 0;
[s12, azi1, azi2] = geodistance (5, 0.00000000000001, 10, 180);
n = n + assertEquals(azi1, 0.000000000000035, 1.5e-14);
n = n + assertEquals(azi2, 179.9999999999999996, 1.5e-14);
n = n + assertEquals(s12, 18345191.174332713, 5e-9);
结束
---------
@BlueEyes你误解了补丁文件。规则是去掉开头的行
使用"-",并将它们替换为以"+"开头的行(但删除了"+")。
(基本上,s12测试中的增量从2.5e-9改为5e-9。)
代码修改后的截图
---------
https://www.sendspace.com/file/5nr3nm
---------
我的GNU Octave 4.0.0包仍然失败,如下所示:
-----
> > geographiclib_test
解析文件C:\Training\z_geodesia\karney\geographiclib_test.m第458行附近的错误
左边的赋值无效
>>> - n = n + assertEquals(s12, 18345191.174332713, 2.5e-9);
-------
干杯
这个补丁到地理iclib_test。m修复了BlueEyes报告的问题(它放松了
其中一个测试稍微):
diff - git / matlab / geographiclib / geographiclib_test。m b / matlab / geographiclib / geographiclib_test.m
指数2 bad2f18 . .d301465e 100644
——/ matlab / geographiclib / geographiclib_test.m
+ + + b / matlab / geographiclib / geographiclib_test.m
@@ -457,7 +457,7 @@函数n = GeodSolve59
[s12, azi1, azi2] = geodistance (5, 0.00000000000001, 10, 180);
n = n + assertEquals(azi1, 0.000000000000035, 1.5e-14);
n = n + assertEquals(azi2, 179.9999999999999996, 1.5e-14);
- n = n + assertEquals(s12, 18345191.174332713, 2.5e-9);
+ n = n + assertEquals(s12, 18345191.174332713, 5e-9);
结束
函数n = GeodSolve61
刚刚通过邮件回复了干杯
回复@BlueEyes:这可能是Matlab版本的问题
或正在其上运行的平台。拜托你能跑吗
以下是您版本的Matlab(或Octave)来帮助我诊断
存在的问题:
版本
[s12, azi1, azi2] = geodistance (5, 0.00000000000001, 10, 180);
流(“%。10 f %。15 f %。15f\n', s12, azi1, azi2)
并将结果提供给我(电子邮件为佳:
charles@karney.com)。谢谢。
请注意以下缺点:
--------
1..
> > geographiclib_test
GeodSolve59失败:1
错误:assert (n == 0)失败
错误:从
断言在第92行第11列
在第56行第3列的地理位置
2..通过消除相应的行,测试成功:
% i = GeodSolve59;如果我,n = n + 1;fprintf('GeodSolve59失败:%d\n', i);结束
> > geographiclib_test
>>
--------
干杯
太棒了! !我已经在Python中使用了地理库,我很高兴它现在在MATLAB中实现。
在计算面积时,当给出空的距离参数时,有一个模糊的错误。中提供了补丁
https://sourceforge.net/p/geographiclib/news/2017/03/bug-in-matlab-function-geodreckon/
这将包含在下一个版本中。
这正是我想要的!谢谢你!
2015-08-14更新到1.44版本导致geodistance出现bug,
当它在Octave(而不是MATLAB)中使用,并使用vector调用时
辐角包括赤道上的对映点对。
一个补丁被放弃了
https://sourceforge.net/p/geographiclib/news/2015/08/bug--fix-in-octave-version-of-geoddistance/
这将包含在下一个版本中。
太棒了!