在三维GIS开发中,场景飞行是一种常用的展示手段,平滑的飞行轨迹能使三维展示更加流畅。下面介绍在SuperMap Objects .NET中如何将一系列的坐标点串拟合成平滑的飞行轨迹线:
// 定义轨迹点串,包括X、Y、Z三维坐标 double[][] coordinates = new double[99][]; // 定义相关点集 Point2Ds point2Ds = new Point2Ds(); Point2Ds heightItemPoint2Ds = new Point2Ds(); Point2Ds heightPoint2Ds = new Point2Ds(); // 定义曲线拟合段数 int cardinalSegment = 20; // 遍历所有轨迹点 foreach (double[] coordinate in coordinates) { // 根据X、Y坐标创建高度曲线 Point2D point2D = new Point2D(coordinate[0], coordinate[1]); point2Ds.Add(point2D); heightItemPoint2Ds.Add(point2D); GeoCardinal heightItemGeoCardinal = new GeoCardinal(heightItemPoint2Ds); // 将高度曲线转换为几何线对象 GeoLine heightItemGeoLine = heightItemGeoCardinal.ConvertToLine(cardinalSegment); // 将高度曲线长度和Z坐标定义为轨迹曲线的坐标 point2D = new Point2D(heightItemGeoLine.Length, coordinate[2]); heightPoint2Ds.Add(point2D); } // 获取水平轨迹曲线 GeoCardinal geoCardinal = new GeoCardinal(point2Ds); GeoLine geoLine = geoCardinal.ConvertToLine(cardinalSegment); // 获取垂直轨迹曲线 GeoCardinal heightGeoCardinal = new GeoCardinal(heightPoint2Ds); GeoLine heightGeoLine = heightGeoCardinal.ConvertToLine(cardinalSegment); // 获取轨迹点集 Point2Ds allPoint2Ds = geoLine[0]; Point2Ds allHeightPoint2Ds = heightGeoLine[0]; // 拟合轨迹曲线 Point3Ds allPoint3Ds = new Point3Ds(); for (Int32 i = 0; i < allHeightPoint2Ds.Count; i++) { allPoint3Ds.Add(new Point3D(allPoint2Ds[i].X, allPoint2Ds[i].Y, allHeightPoint2Ds[i].Y)); } GeoLine3D geoLine3D = new GeoLine3D(allPoint3Ds); // 返回轨迹曲线 return geoLine3D;