/// <summary> /// 根据经纬度值计算出点与直线的距离 /// </summary> /// <param name="x">点的x坐标</param> /// <param name="y">点的y坐标</param> /// <param name="x1">线的第一个端点的x坐标</param> /// <param name="y1">线的第一个端点的y坐标</param> /// <param name="x2">线的第二个端点的x坐标</param> /// <param name="y2">线的第二个端点的y坐标</param> /// <returns>返回点与直线的距离</returns> public static double DistancePointToLine(double x, double y, double x1, double y1, double x2, double y2) { if (y1 == y2)//线段为平行于X轴 { if (Math.Min(x1, x2) < x && Math.Max(x1, x2) > x)//垂足在线段内 { return Math.Abs(ComputeD(y1, x, y, x));//点与该线的距离为TempP与P的的距离 } else { return Math.Min(ComputeD(y, x, y1, x1), ComputeD(y, x, y2, x2));//返回到某个端点的距离 } } if (x1 == x2)//线段为平行于Y轴 { if (Math.Min(y1, y2) < y && Math.Max(y1, y2) > y)//垂足在线段内 { return ComputeD(y, x1, y, x);//点与该线的距离为TempP与P的的距离 } else { return Math.Min(ComputeD(y, x, y1, x1), ComputeD(y, x, y2, x2));//返回到某个端点的距离 } } else//该线段不平行于X轴也不平行于Y轴 { double k = (y2 - y1) / (x2 - x1); //线段的斜率 double TempX, TempY; TempX = (Math.Pow(k, 2.0) * x1 + k * (y - y1) + x) / (Math.Pow(k, 2.0) + 1.0); TempY = k * (TempX - x1) + y1; if (TempX < -180 || TempX > 180 || TempY < -90 || TempY > 90) { return Math.Min(ComputeD(y, x, y1, x1), ComputeD(y, x, y2, x2));//返回到某个端点的距离 } double TempDis1=(ComputeD(TempY, TempX, y1, x1) + ComputeD(TempY, TempX, y2, x2)); double TempDis2=ComputeD(y1,x1,y2,x2); if((TempDis1 - TempDis2)<0.001) //垂足在线内 { return (ComputeD(TempY, TempX, y, x));//点与该线的距离为TempP与P的的距离 } else { return Math.Min(ComputeD(y, x, y1, x1), ComputeD(y, x, y2, x2));//返回到某个端点的距离 } } } /// <summary> /// 根据经纬度值计算出点与直线的 你的当前访问异常,请进行认证后继续阅读剩余内容。 提交