图片缩略图

geographiclib

version 1.50 (115 KB) by 查尔斯任课老师
MATLAB实现的一个c++库的子集,地理库
5.0
7评级

23下载

更新2019年9月19日

查看许可协议

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

这个包的更改日志可在

https://geographiclib.sourceforge.io/1.50/changes.html

引用作为

查尔斯·卡尼(2020)。geographiclib(//www.tianjin-qmedu.com/matlabcentral/fileexchange/50605-geographiclib), MATLAB中央文件交换。检索

意见及评分(23

查尔斯任课老师

>感谢您对这个图书馆的所有努力和支持万博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。

BlueEyes

好!在你的漂移输出之间会出现一些差异
----------------------
>>格式长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,然后使用毕达哥拉斯。

BlueEyes

地理距离增强建议:标记到标记的距离。两个地面站,如图所示:
https://www.sendspace.com/file/i5sg1u
有可能在这里做它和链接吗?或者,或者显示(X,Y,Z)直角坐标算法?
谢谢提前

BlueEyes

哦,是的!现在它正常工作了,函数变成:
---------
函数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。)

BlueEyes

代码修改后的截图
---------
https://www.sendspace.com/file/5nr3nm
---------

BlueEyes

我的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

刚刚通过邮件回复了干杯

查尔斯任课老师

回复@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)。谢谢。

BlueEyes

请注意以下缺点:
--------
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中实现。

赵Dejun

查尔斯任课老师

在计算面积时,当给出空的距离参数时,有一个模糊的错误。中提供了补丁

https://sourceforge.net/p/geographiclib/news/2017/03/bug-in-matlab-function-geodreckon/

这将包含在下一个版本中。

比尔Tandy

这正是我想要的!谢谢你!

的家伙

查尔斯任课老师

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/

这将包含在下一个版本中。

马太福音

陈羌族

太棒了!

更新

1.50

geoarea现在可以处理任意复杂的多边形。
修复了在mgrs_inv中导致prec = -1的UPS区域的错误结果。
在geodreckon。m和geoddistance。米,抑制(无害的)来自Octave的"警告:除零"消息。

1.49

更新到1.49版本

1.48.0.0

修正了混合标量和数组参数的georeckon的bug。
经度和方位角的默认范围是(-180d, 180d)。

1.47.0.0

提高面积计算的准确性(修正了1.46版本中引入的一个缺陷)。
修复了MATLAB中copyysignx的矢量化(Octave已经可以了)。

1.46.0.0

提高了求解逆问题时的精度
经度差接近180度。

1.45.0.0

同步geography lib 1.45。
Tranmerc_ {fwd,inv}使用混合标量+数组参数。
两个特定于octave的修复。
修正了geooddistance的数组不匹配

1.44.1.0

修复geoddistance中的模糊错误(仅适用于Octave)。

1.44.0.0

同步geography lib 1.44。

1.43.0.0

与地理iclib 1.43同步。
修正了georeckon的long_unroll特性的bug。
Mgrs_inv现在有一个可选的center参数。

1.6.0.0

恢复zip包装。MATLAB中心生成一个乱码压缩文件
当提交MLTBX文件时。

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

去除虚假的所需产品。