public static GpsItem gps84_To_BD09(double wgLat, double wgLon) { GpsItem gItem = gps84_To_Gcj02(wgLat, wgLon); GpsItem bitem = gcj02_To_Bd09(gItem.Lat, gItem.Lng); return(new GpsItem(bitem.Lat, bitem.Lng)); }
public static GpsItem gcj02_To_Gps84(double lat, double lon) { GpsItem pl = gps84_To_Gcj02(lat, lon); double offsetLat = pl.Lat - lat; double offsetLng = pl.Lng - lon; return(new GpsItem(lat - offsetLat, lon - offsetLng)); }
public static GpsItem bd09_To_Gps84(double bd_lat, double bd_lon) { GpsItem gcj02 = PositionUtil.bd09_To_Gcj02(bd_lat, bd_lon); GpsItem map84 = PositionUtil.gcj02_To_Gps84(gcj02.Lat, gcj02.Lng); return(map84); }
public double ESP = 0.000001;// (1e-5) // / <summary> // / 判断点是否在线段上,考虑可控误差 // / </summary> // / <param name="p1"></param> // / <param name="p2"></param> // / <param name="p0"></param> // / <param name="offset"></param> // / <returns></returns> public Boolean IsPointOnLine(GpsItem p0, GpsItem p1, GpsItem p2, int offset) { if (Math.Abs(MultiplyPoint(p1, p2, p0)) >= ESP * offset) { return(false); } if ((p0.Lng - p1.Lng) * (p0.Lng - p2.Lng) > 0) { return(false); } if ((p0.Lat - p1.Lat) * (p0.Lat - p2.Lat) > 0) { return(false); } return(true); }
//点是否在多边形中 public Boolean IsInPolygon(GpsItem p, List <GpsItem> points) { int i, j = points.Count - 1; bool oddNodes = false; double ret; for (i = 0; i < points.Count; i++) { if (points[i].Lat < p.Lat && points[j].Lat >= p.Lat || points[j].Lat < p.Lat && points[i].Lat >= p.Lat) { ret = points[i].Lng + (p.Lat - points[i].Lat) / (points[j].Lat - points[i].Lat) * (points[j].Lng - points[i].Lng); if (ret < p.Lng) { oddNodes = !oddNodes; } } j = i; } return(oddNodes); }
// / <summary> // / 计算叉乘 |P0P1| × |P0P2| // / </summary> // / <param name="p1"></param> // / <param name="p2"></param> // / <param name="p0"></param> // / <returns></returns> private double MultiplyPoint(GpsItem p1, GpsItem p2, GpsItem p0) { return((p1.Lng - p0.Lng) * (p2.Lat - p0.Lat) - (p2.Lng - p0.Lng) * (p1.Lat - p0.Lat)); }