三维场景计算任意两点的空间距离

原创 2017年12月26日 11:35:22

在iDesktop中要知道场景中两点间的空间距离可以通过iDesktop自带的量算工具去获取到,在iObjects中也可以通过Action3D.MeasureDistance去量算出两点之间的空间距离,但是二者共同点是都需要通过鼠标点击才能获取到两点之间的空间距离,这样的方式在很多时候都不太方便。比如我要知道场景中某条三维线有多长,通过鼠标点击去测量的话,很容易因为鼠标点击位置不准确而造成的量算结果有一定的误差。下面我们将介绍两种方式来计算三维场景中任意两个三维点的空间距离,只需要知道两个三维点的X,Y,Z坐标即可,使用的开发工具为SuperMap iObjects .NET。


计算两个三维点间的空间距离问题在于三维点的X,Y坐标值单位通常是度,Z坐标值单位通常是米,两个单位之间怎么去统一计算,下面我们介绍的两种方式可以轻松解决这个问题。

方法一 用测地线的接口来计算两个三维点的空间距离

两点间的测地线距离是考虑了参考椭球体的曲率得到的,是一条“曲线”。Geometrist.ComputeGeodesicDistance()方法便是用来计算地球表面两点间的测地线距离,由于三维点有不同的高程,所以两个三维点的空间距离=(测地线距离^2+两点高程差^2)的平方根。在使用的测地线接口的时候需要传入构成测地线的经纬度坐标二维点串,二维点的坐标可以从三维的坐标中去获取出来,还需要传入参考椭球体的长半轴和扁率,我们将使用WGS1984坐标系的参考椭球体长半轴和扁率,直接上代码:

                Point2D point1 = new Point2D();
                point1.X = point3ds[0].X;
                point1.Y = point3ds[0].Y;
                Point2D point2 = new Point2D();
                point2.X = point3ds[1].X;
                point2.Y = point3ds[1].Y;
                point2ds.Add(point1);
                point2ds.Add(point2);
                double S_Distance = Geometrist.ComputeGeodesicDistance(point2ds, 6378137, 0.00335281066474748);

然后再计算出三维点之间的空间距离:

                double K_Distance =Math.Pow((S_Distance * S_Distance + H * H),0.5);

完整范例链接:https://pan.baidu.com/s/1c1693Yo 提取码:tcof

方法二 通过投影转换来计算两个三维点的空间距离

投影转换是将经纬度坐标系下点的坐标转换到目标投影坐标系下,从而得到以米为单位的平面投影坐标系下点的坐标。首先从三维点中取出X,Y坐标的值来构造二维点,再将构造的二维点的投影转换到WGS1984TransverseMercator投影坐标系下,再用转换好之后的点坐标构造两个点对象,使用Geometrist.Distance()方法计算出两个点对象之间的距离。

目标投影坐标系的中央经线是由三维点X值(经度)计算得到的,设置如下:

                PrjCoordSys prjcoordsys = new PrjCoordSys();
                double S_Longitude = (point3ds[1].X + point3ds[0].X) / 2;
                int D = (int)((S_Longitude + 6) / 6);
                int centralmeridian = D * 6 - 3;

                GeoCoordSys geocoordsys = new GeoCoordSys();
                geocoordsys.Type = GeoCoordSysType.Wgs1984;
                prjcoordsys.GeoCoordSys = geocoordsys;

                Projection projection = new Projection();
                projection.Type = ProjectionType.TransverseMercator;
                prjcoordsys.Projection = projection;

                PrjParameter prjparameter = new PrjParameter();
                prjparameter.CentralMeridian = centralmeridian;
                prjparameter.FalseEasting = 500000;
                prjparameter.ScaleFactor = 0.9996;
                prjcoordsys.PrjParameter = prjparameter;

投影转换目标点,计算平面投影坐标系下两点的距离:

                PrjCoordSys prjcoordsys = this.GetPrjCoordSys();
                bool a = CoordSysTranslator.Forward(point2ds,prjcoordsys);

                GeoPoint geopoint1=new GeoPoint(point2ds[0]);
                GeoPoint geopoint2=new GeoPoint(point2ds[1]);

                double S_Distance = Geometrist.Distance(geopoint1,geopoint2);

两个三维点的空间距离=(平面投影坐标系下两点距离^2+两点高程差^2)的平方根,计算代码:

                double K_Distance = Math.Pow((S_Distance * S_Distance + H * H), 0.5);

完整范例链接:http://pan.baidu.com/s/1o7PlUAI 提取码:t346

范例效果展示图

这里写图片描述

红色点:选取的目标点

水平净距:不考虑高程差时两点之间的距离

垂直净距:两点的高程差

空间距离:两点在三维空间的距离

版权声明:本文为博主原创文章,欢迎转载,SuperMap技术问答社区 http://ask.supermap.com

三维空间两直线/线段最短距离、线段计算算法

三维空间直线距离计算
  • u011511587
  • u011511587
  • 2016年07月29日 13:46
  • 1714

三维空间里点到直线的距离

三维欧式空间点到直线的距离计算方法。使用叉积的表示方法直线用固定点OO对应的向量 o⃗ \vec o 和直行的方向单位向量 a⃗ 0\vec a_0 表示;任意点 QQ 对应的向量 q⃗ \vec q...
  • lcfactorization
  • lcfactorization
  • 2016年11月22日 14:32
  • 2702

三维空间两条直线的最短距离、最近点及C++算法实现

在双目视觉立体空间重建中,会根据两个相机中的物体图像坐标,求取给定坐标系的三维坐标。根据物体图像坐标、相机内参、给定坐标系的相机外参,求取相机光轴线的方程,从而实现立体重建,本文主要是解决在已知三维空...
  • momo0637
  • momo0637
  • 2016年12月18日 15:46
  • 1624

根据地球上任意两点的经纬度计算两点间的距离

地球是一个近乎标准的椭球体,它的赤道半径为6378.140千米,极半径为 6356.755千米,平均半径6371.004千米。如果我们假设地球是一个完美的球体,那么它的半径就是地球的平均半径,记为R。...
  • llwinnner
  • llwinnner
  • 2012年03月27日 17:58
  • 724

弗洛伊德(Floyd)算法求任意两点间的最短距离

最近要搞最短路径方面的工作,把2年前搞过的北京地铁换乘算法拿出来看看,顺带整理下写出来,和大家分享下,算是抛砖引玉吧 Floyd-Warshall算法(Floyd-Warshall algorit...
  • ha000
  • ha000
  • 2016年08月30日 14:06
  • 957

已知有向图任意两点的最短距离,求最小边数

题目描述 相信大家都会解决有向图的最短路问题。这次我们反着来,给你一个有向图中每一对顶点之间的最短路的长度,请你计算出原图中最少可能包含多少条边。 输入格式 输入的第一行是一个整数T(T 每组输...
  • Zhuhuangjian
  • Zhuhuangjian
  • 2013年11月23日 21:24
  • 1376

POJ1125 dijkstra求任意两点距离

Stockbroker Grapevine Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 32240 Accepted...
  • qq_22902423
  • qq_22902423
  • 2015年12月18日 21:20
  • 107

hdu 2376 Average distance DFS 求树上任意两点距离和

hdu 2376 Average distance DFS 求树上任意两点距离和 题目链接:hdu 2376 Average distance 题意:标题都已经说明了题意了。求树上任意两点距离和的平均...
  • ACMore_Xiong
  • ACMore_Xiong
  • 2016年07月19日 20:38
  • 1070

HDU-1869(floyd求任意两点之间的距离)

这个题目,我一看到的居然是用DFS,汗了,,,但是我写着写着,还居然给过了样例,和自己的一些特殊数据,,但是到后来我突然就觉得不对了,,因为一出现环数据就过不了了,而我又不想在研究研究求出最小值,但是...
  • qinaide_lixiaoshuo
  • qinaide_lixiaoshuo
  • 2012年07月24日 22:26
  • 828

Dijkstra [迪杰斯特拉]算法思路(求单点到其他每个点的各个最短路径)Floyd算法:任意两点间最短距离

先给出一个无向图 用Dijkstra算法(迪杰斯特拉算法)找出以A为起点的单源最短路径步骤如下 应用Dijkstra算法计算从源顶点1到其它顶点间最短路径的过程列在下表中。 Di...
  • lingzhm
  • lingzhm
  • 2015年03月30日 19:50
  • 4261
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:三维场景计算任意两点的空间距离
举报原因:
原因补充:

(最多只允许输入30个字)