三维空间最短距离(三维场景计算任意两点的空间距离)

三维空间最短距离(三维场景计算任意两点的空间距离)(1)

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

三维空间最短距离(三维场景计算任意两点的空间距离)(2)

计算两个三维点间的空间距离问题在于三维点的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:///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:///s/1o7PlUAI 提取码:t346

范例效果展示图

三维空间最短距离(三维场景计算任意两点的空间距离)(3)

红色点:选取的目标点

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

垂直净距:两点的高程差

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

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页