关于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;

发表评论