From 63af338527cd2d7975a641e3dc74b5ed6b5f3fb4 Mon Sep 17 00:00:00 2001 From: vctcn93 Date: Tue, 28 Mar 2023 10:14:02 +0800 Subject: [PATCH] feature: add is_in_china wrapper. --- coordTransform_utils.py | 91 ++++++++++++++++++++--------------------- 1 file changed, 45 insertions(+), 46 deletions(-) diff --git a/coordTransform_utils.py b/coordTransform_utils.py index 78816f9..557b5e9 100644 --- a/coordTransform_utils.py +++ b/coordTransform_utils.py @@ -1,12 +1,15 @@ # -*- coding: utf-8 -*- + + import json import urllib import math -x_pi = 3.14159265358979324 * 3000.0 / 180.0 -pi = 3.1415926535897932384626 # π -a = 6378245.0 # 长半轴 -ee = 0.00669342162296594323 # 偏心率平方 + +X_PI = 3.14159265358979324 * 3000.0 / 180.0 +PI = 3.1415926535897932384626 # π +A = 6378245.0 # 长半轴 +EE = 0.00669342162296594323 # 偏心率平方 class Geocoding: @@ -40,6 +43,14 @@ def geocode(self, address): return None +def is_in_china(func): + def wrapper(lng, lat): + if lng > 73.66 and lng < 135.05 and lat > 3.86 and lat < 53.55: + return func(lng, lat) + return lng, lat + return wrapper + + def gcj02_to_bd09(lng, lat): """ 火星坐标系(GCJ-02)转百度坐标系(BD-09) @@ -48,11 +59,11 @@ def gcj02_to_bd09(lng, lat): :param lat:火星坐标纬度 :return: """ - z = math.sqrt(lng * lng + lat * lat) + 0.00002 * math.sin(lat * x_pi) - theta = math.atan2(lat, lng) + 0.000003 * math.cos(lng * x_pi) + z = math.sqrt(lng * lng + lat * lat) + 0.00002 * math.sin(lat * X_PI) + theta = math.atan2(lat, lng) + 0.000003 * math.cos(lng * X_PI) bd_lng = z * math.cos(theta) + 0.0065 bd_lat = z * math.sin(theta) + 0.006 - return [bd_lng, bd_lat] + return bd_lng, bd_lat def bd09_to_gcj02(bd_lon, bd_lat): @@ -65,13 +76,14 @@ def bd09_to_gcj02(bd_lon, bd_lat): """ x = bd_lon - 0.0065 y = bd_lat - 0.006 - z = math.sqrt(x * x + y * y) - 0.00002 * math.sin(y * x_pi) - theta = math.atan2(y, x) - 0.000003 * math.cos(x * x_pi) + z = math.sqrt(x * x + y * y) - 0.00002 * math.sin(y * X_PI) + theta = math.atan2(y, x) - 0.000003 * math.cos(x * X_PI) gg_lng = z * math.cos(theta) gg_lat = z * math.sin(theta) - return [gg_lng, gg_lat] + return gg_lng, gg_lat +@is_in_china def wgs84_to_gcj02(lng, lat): """ WGS84转GCJ02(火星坐标系) @@ -79,21 +91,20 @@ def wgs84_to_gcj02(lng, lat): :param lat:WGS84坐标系的纬度 :return: """ - if out_of_china(lng, lat): # 判断是否在国内 - return [lng, lat] dlat = _transformlat(lng - 105.0, lat - 35.0) dlng = _transformlng(lng - 105.0, lat - 35.0) - radlat = lat / 180.0 * pi + radlat = lat / 180.0 * PI magic = math.sin(radlat) - magic = 1 - ee * magic * magic + magic = 1 - EE * magic * magic sqrtmagic = math.sqrt(magic) - dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi) - dlng = (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * pi) + dlat = (dlat * 180.0) / ((A * (1 - EE)) / (magic * sqrtmagic) * PI) + dlng = (dlng * 180.0) / (A / sqrtmagic * math.cos(radlat) * PI) mglat = lat + dlat mglng = lng + dlng - return [mglng, mglat] + return mglng, mglat +@is_in_china def gcj02_to_wgs84(lng, lat): """ GCJ02(火星坐标系)转GPS84 @@ -101,19 +112,17 @@ def gcj02_to_wgs84(lng, lat): :param lat:火星坐标系纬度 :return: """ - if out_of_china(lng, lat): - return [lng, lat] dlat = _transformlat(lng - 105.0, lat - 35.0) dlng = _transformlng(lng - 105.0, lat - 35.0) - radlat = lat / 180.0 * pi + radlat = lat / 180.0 * PI magic = math.sin(radlat) - magic = 1 - ee * magic * magic + magic = 1 - EE * magic * magic sqrtmagic = math.sqrt(magic) - dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi) - dlng = (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * pi) + dlat = (dlat * 180.0) / ((A * (1 - EE)) / (magic * sqrtmagic) * PI) + dlng = (dlng * 180.0) / (A / sqrtmagic * math.cos(radlat) * PI) mglat = lat + dlat mglng = lng + dlng - return [lng * 2 - mglng, lat * 2 - mglat] + return lng * 2 - mglng, lat * 2 - mglat def bd09_to_wgs84(bd_lon, bd_lat): @@ -129,37 +138,27 @@ def wgs84_to_bd09(lon, lat): def _transformlat(lng, lat): ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + \ 0.1 * lng * lat + 0.2 * math.sqrt(math.fabs(lng)) - ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 * - math.sin(2.0 * lng * pi)) * 2.0 / 3.0 - ret += (20.0 * math.sin(lat * pi) + 40.0 * - math.sin(lat / 3.0 * pi)) * 2.0 / 3.0 - ret += (160.0 * math.sin(lat / 12.0 * pi) + 320 * - math.sin(lat * pi / 30.0)) * 2.0 / 3.0 + ret += (20.0 * math.sin(6.0 * lng * PI) + 20.0 * + math.sin(2.0 * lng * PI)) * 2.0 / 3.0 + ret += (20.0 * math.sin(lat * PI) + 40.0 * + math.sin(lat / 3.0 * PI)) * 2.0 / 3.0 + ret += (160.0 * math.sin(lat / 12.0 * PI) + 320 * + math.sin(lat * PI / 30.0)) * 2.0 / 3.0 return ret def _transformlng(lng, lat): ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + \ 0.1 * lng * lat + 0.1 * math.sqrt(math.fabs(lng)) - ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 * - math.sin(2.0 * lng * pi)) * 2.0 / 3.0 - ret += (20.0 * math.sin(lng * pi) + 40.0 * - math.sin(lng / 3.0 * pi)) * 2.0 / 3.0 - ret += (150.0 * math.sin(lng / 12.0 * pi) + 300.0 * - math.sin(lng / 30.0 * pi)) * 2.0 / 3.0 + ret += (20.0 * math.sin(6.0 * lng * PI) + 20.0 * + math.sin(2.0 * lng * PI)) * 2.0 / 3.0 + ret += (20.0 * math.sin(lng * PI) + 40.0 * + math.sin(lng / 3.0 * PI)) * 2.0 / 3.0 + ret += (150.0 * math.sin(lng / 12.0 * PI) + 300.0 * + math.sin(lng / 30.0 * PI)) * 2.0 / 3.0 return ret -def out_of_china(lng, lat): - """ - 判断是否在国内,不在国内不做偏移 - :param lng: - :param lat: - :return: - """ - return not (lng > 73.66 and lng < 135.05 and lat > 3.86 and lat < 53.55) - - if __name__ == '__main__': lng = 128.543 lat = 37.065