private static bool checkCross(LatLng p1, LatLng p2, LatLng p3, LatLng p4) { LatLng v1 = new LatLng { Lng = p1.Lng - p3.Lng, Lat = p1.Lat - p3.Lat }; LatLng v2 = new LatLng { Lng = p2.Lng - p3.Lng, Lat = p2.Lat - p3.Lat }; LatLng v3 = new LatLng { Lng = p4.Lng - p3.Lng, Lat = p4.Lat - p3.Lat }; double v = crossMul(v1, v3) * crossMul(v2, v3); v1 = new LatLng { Lng = p3.Lng - p1.Lng, Lat = p3.Lat - p1.Lat }; v2 = new LatLng { Lng = p4.Lng - p1.Lng, Lat = p4.Lat - p1.Lat }; v3 = new LatLng { Lng = p2.Lng - p1.Lng, Lat = p2.Lat - p1.Lat }; return (v <= 0 && crossMul(v1, v3) * crossMul(v2, v3) <= 0) ? true : false; }
/// <summary> /// 判断点是否在多变形内 /// </summary> /// <param name="point">测试点</param> /// <param name="polygon">面多边形</param> /// <returns></returns> public static bool IsInPolygon(LatLng point, List<LatLng> polygon) { LatLng p1, p2, p3, p4; p1 = point; p2 = new LatLng() { Lng = -180, Lat = point.Lat }; Int32 count = 0; for (var i = 0; i < polygon.Count-1; i++) { p3 = polygon[i]; p4 = polygon[i + 1]; if (checkCross(p1, p2, p3, p4)) { count++; } } p3 = polygon[polygon.Count - 1]; p4 = polygon[0]; if (checkCross(p1, p2, p3, p4)) { count++; } return (count % 2 == 0) ? false : true; }
/// <summary> /// 向量叉乘 /// </summary> /// <param name="v1"></param> /// <param name="v2"></param> /// <returns></returns> private static double crossMul(LatLng v1, LatLng v2) { return v1.Lng * v2.Lat - v2.Lng * v1.Lat; }
public static bool IsInCircle(LatLng center, LatLng testPoint, double radius) { return IsInCircle(center.Lat, center.Lng, testPoint.Lat, testPoint.Lng, radius); }