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


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


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

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

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

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()方法计算出两个点对象之间的距离。this

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

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;

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

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)的平方根,计算代码:xml

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

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

范例效果展现图

这里写图片描述

红色点:选取的目标点

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

垂直净距:两点的高程差

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