在系统开发中,有时会用到一些常用的空间算法,引用一些类库是可以解决问题,但是有时类库的运行效率比较慢,引用的东西比较多,如果需要的方法不多,可以写一些简单的计算方法。
下边分享几个常用的gis计算方法:
//判断点是否在面里
public bool IsPointInPolygon(List<CVector> poly, CVector point){int i, j;bool c = false;for (i = 0, j = poly.Count - 1; i < poly.Count; j = i++){if ((((poly[i].VY <= point.VY) && (point.VY < poly[j].VY))|| ((poly[j].VY <= point.VY) && (point.VY < poly[i].VY)))&& (point.VX < (poly[j].VX - poly[i].VX) * (point.VY - poly[i].VY)/ (poly[j].VY - poly[i].VY) + poly[i].VX)){c = !c;}}return c;}
//计算弧度
public double Rad(double d)
{return d * Math.PI / 180.0;
}
//计算角度
public static double RAngle(double d){return d * 180.0 / Math.PI;
}
//计算两个坐标的中心点
public double[] ComputeMidPoint(double lat1, double long1, double lat2, double long2){lat1 = Rad(lat1);long1 = Rad(long1);lat2 = Rad(lat2);long2 = Rad(long2);var Bx = Math.Cos(lat2) * Math.Cos(long2 - long1);var By = Math.Cos(lat2) * Math.Sin(long2 - long1);var _rlat = Math.Atan2(Math.Sin(lat1) + Math.Sin(lat2), Math.Sqrt((Math.Cos(lat1) + Bx) * (Math.Cos(lat1) + Bx) + By * By));var _rlong = long1 + Math.Atan2(By, Math.Cos(lat1) + Bx);return new double[] { _rlat, _rlong };}
//计算一批点的四至坐标
public OCExtent GetPointsExtent(List<CVector> PList){OCExtent cET = new OCExtent();for (int i = 0; i < PList.Count; i++){CVector aP = PList[i];if (i == 0){cET.minX = aP.VX;cET.maxX = aP.VX;cET.minY = aP.VY;cET.maxY = aP.VY;}else{if (cET.minX > aP.VX){cET.minX = aP.VX;}else if (cET.maxX < aP.VX){cET.maxX = aP.VX;}if (cET.minY > aP.VY){cET.minY = aP.VY;}else if (cET.maxY < aP.VY){cET.maxY = aP.VY;}}}return cET;}
关注公众号,多多支持!
















