def GPStoXY(lat, lon, lon0=BOTTOM_LEFT_LON, lat0=BOTTOM_LEFT_LAT):
"""
# 输入地图上某一点a经纬度,和当做(0,0)起始点的(lon0, lat0),将a转换为x,y坐标
"""
lat_rad = math.radians(lat)
lon_rad = math.radians(lon)
ref_lat_rad = math.radians(lat0)
ref_lon_rad = math.radians(lon0)
sin_lat = math.sin(lat_rad)
cos_lat = math.cos(lat_rad)
ref_sin_lat = math.sin(ref_lat_rad)
ref_cos_lat = math.cos(ref_lat_rad)
cos_d_lon = math.cos(lon_rad - ref_lon_rad)
arg = np.clip(ref_sin_lat * sin_lat + ref_cos_lat * cos_lat * cos_d_lon, -1.0, 1.0)
c = math.acos(arg)
k = 1.0
if abs(c) > 0:
k = (c / math.sin(c))
x = float(k * (ref_cos_lat * sin_lat - ref_sin_lat * cos_lat * cos_d_lon) * CONSTANTS_RADIUS_OF_EARTH)
y = float(k * cos_lat * math.sin(lon_rad - ref_lon_rad) * CONSTANTS_RADIUS_OF_EARTH)
return x, y
def XYtoGPS(x, y, ref_lon=BOTTOM_LEFT_LON, ref_lat=BOTTOM_LEFT_LAT):
"""
# 输入地图上某一点a的x,y坐标,和当做(0,0)起始点的(lon0, lat0),将a转换为经纬度坐标
"""
x_rad = float(x) / CONSTANTS_RADIUS_OF_EARTH
y_rad = float(y) / CONSTANTS_RADIUS_OF_EARTH
c = math.sqrt(x_rad * x_rad + y_rad * y_rad)
ref_lat_rad = math.radians(ref_lat)
ref_lon_rad = math.radians(ref_lon)
ref_sin_lat = math.sin(ref_lat_rad)
ref_cos_lat = math.cos(ref_lat_rad)
if abs(c) > 0:
sin_c = math.sin(c)
cos_c = math.cos(c)
lat_rad = math.asin(cos_c * ref_sin_lat + (x_rad * sin_c * ref_cos_lat) / c)
lon_rad = (ref_lon_rad + math.atan2(y_rad * sin_c, c * ref_cos_lat * cos_c - x_rad * ref_sin_lat * sin_c))
lat = math.degrees(lat_rad)
lon = math.degrees(lon_rad)
else:
lat = math.degrees(ref_lat)
lon = math.degrees(ref_lon)
return lat, lon
两个经纬度之间的距离计算【高精度】
def calculate_distance(lat1, lon1, lat2, lon2):
lat1 = math.radians(lat1)
lon1 = math.radians(lon1)
lat2 = math.radians(lat2)
lon2 = math.radians(lon2)
dlon = lon2 - lon1
dlat = lat2 - lat1
a = math.sin(dlat / 2) ** 2 + math.cos(lat1) * math.cos(lat2) * math.sin(dlon / 2) ** 2
c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))
distance1 = 6371 * c * 1000
return distance1