|
|
|

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

在iDesktop中要知道场景中两点间的空间距离可以通过iDesktop自带的量算工具去获取到,在iObjects中也可以通过Action3D.MeasureDistance去量算出两点之间的空间距离,但是二者共同点是都需要通过鼠标点击才能获取到两点之间的空间距离,这样的方式在...

作者:SuperMap来源:SuperMap技术问答社区 https://ask.supermap.com|2018年01月15日

在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);
 

完整范例链接: 提取码: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);

完整范例链接: 提取码:t346

范例效果展示必威现金回扣

这里写图片描述

红色点:选取的目标点

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

垂直净距:两点的高程差

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

 

上一篇:SuperMap GIS 9D SP1新特性速览

下一篇:iServer在线许可使用