关于SuperMap Objects .NET中计算沿线某个距离点方向的说明

我们可以通过查找指定距离点所在的前后两个线节点来计算线上某个距离点的方向:

// 定义要计算的线
GeoLine geoLine = new GeoLine();
// 定义沿线距离
double distance = 100;
// 定义要计算的剩余距离
double tempDistance = distance;
// 遍历线上所有点
for (int i = 0; i < geoLine.PartCount; i++)
{
    Point2Ds point2Ds = geoLine[i];
    for (int j = 1; j < point2Ds.Count; j++)
    {
        // 计算两个节点的距离并修正剩下需要沿线的距离
        Point2D point2D1 = point2Ds[j - 1];
        Point2D point2D2 = point2Ds[j];
        tempDistance -= Geometrist.Distance(new GeoPoint(point2D1), new GeoPoint(point2D2));
        // 判断是否到达指定的距离
        if (tempDistance <= 0)
        {
            // 根据当前所在前后节点计算并返回方向
            double dx = point2D2.X - point2D1.X;
            double dy = point2D2.Y - point2D1.Y;
            // 东北方向
            if (dx > 0 && dy > 0)
            {
                return Math.Atan(dx / dy) * 180d / Math.PI;
            }
            // 东南方向
            else if (dx > 0 && dy < 0)
            {
                return 180d - (Math.Atan(dx / -dy) * 180d / Math.PI);
            }
            // 西南方向
            else if (dx < 0 && dy < 0)
            {
                return 180d + (Math.Atan(-dx / -dy) * 180d / Math.PI);
            }
            // 西北方向
            else if (dx < 0 && dy > 0)
            {
                return 360d - (Math.Atan(-dx / dy) * 180d / Math.PI);
            }
            // 正北方向
            else if (dx == 0 && dy > 0)
            {
                return 0;
            }
            // 正南方向
            else if (dx == 0 && dy < 0)
            {
                return 180;
            }
            // 正东方向
            else if (dx > 0 && dy == 0)
            {
                return 90;
            }
            // 正西方向
            else if (dx < 0 && dy == 0)
            {
                return 270;
            }
            // 其他
            else
            {
                return 0;
            }
        }
    }
}
// 没有线则返回默认方向
return 0;

关于SuperMap Objects .NET中点串拟合飞行轨迹的说明

在三维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;