lbs.core.coord_convert 源代码

# encoding: utf-8
from __future__ import absolute_import, unicode_literals, division

import math


[文档]class CoordConvert(object): X_PI = math.pi * 3000 / 180 A = 6378245 EE = 0.00669342162296594323
[文档] @classmethod def gcj02_to_bd09(cls, longitude, latitude): """ GCJ02(火星坐标系)转BD09(百度坐标系) :param longitude: GCJ02经度 :param latitude: GCJ02纬度 :return: BD09经度,BD09纬度 """ z = math.sqrt(longitude * longitude + latitude * latitude) + 0.00002 * math.sin(latitude * cls.X_PI) theta = math.atan2(latitude, longitude) + 0.000003 * math.cos(longitude * cls.X_PI) longitude = z * math.cos(theta) + 0.0065 latitude = z * math.sin(theta) + 0.006 return longitude, latitude
[文档] @classmethod def bd09_to_gcj02(cls, longitude, latitude): """ BD-09(百度坐标系)转GCJ02(火星坐标系) :param longitude: BD09经度 :param latitude: BD09纬度 :return: GCJ02经度, GCJ02纬度 """ x = longitude - 0.0065 y = latitude - 0.006 z = math.sqrt(x * x + y * y) - 0.00002 * math.sin(y * cls.X_PI) theta = math.atan2(y, x) - 0.000003 * math.cos(x * cls.X_PI) longitude = z * math.cos(theta) latitude = z * math.sin(theta) return longitude, latitude
[文档] @classmethod def wgs84_to_gcj02(cls, longitude, latitude): """ WGS84转GCJ02(火星坐标系) :param longitude: WGS84经度 :param latitude: WGS84纬度 :return: GCJ02经度, GCJ02纬度 """ if not cls.in_china(longitude, latitude): return longitude, latitude longitude_add, latitude_add = cls._transform(longitude - 105, latitude - 35) rad_latitude = latitude / 180 * math.pi magic = math.sin(rad_latitude) magic = 1 - cls.EE * magic * magic sqrt_magic = math.sqrt(magic) latitude_add = (latitude_add * 180) / ((cls.A * (1 - cls.EE)) / (magic * sqrt_magic) * math.pi) longitude_add = (longitude_add * 180) / (cls.A / sqrt_magic * math.cos(rad_latitude) * math.pi) latitude += latitude_add longitude += longitude_add return longitude, latitude
[文档] @classmethod def wgs84_to_bd09(cls, longitude, latitude): """ WGS84转BD09(百度坐标系) :param longitude: GCJ02经度 :param latitude: GCJ02纬度 :return: BD09经度,BD09纬度 """ longitude, latitude = cls.wgs84_to_gcj02(longitude, latitude) return cls.gcj02_to_bd09(longitude, latitude)
@classmethod def _transform(cls, x, y): sqrt_x = math.sqrt(math.fabs(x)) x_add = 300 + 1 * x + 2 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * sqrt_x y_add = -100 + 2 * x + 3 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * sqrt_x t_x = (20 * math.sin(6 * x * math.pi) + 20 * math.sin(2 * x * math.pi)) * 2 / 3 x_add += t_x y_add += t_x x_add += (20 * math.sin(x * math.pi) + 40 * math.sin(x / 3 * math.pi)) * 2 / 3 y_add += (20 * math.sin(y * math.pi) + 40 * math.sin(y / 3 * math.pi)) * 2 / 3 x_add += (150 * math.sin(x / 12 * math.pi) + 300 * math.sin(x / 30 * math.pi)) * 2 / 3 y_add += (160 * math.sin(y / 12 * math.pi) + 320 * math.sin(y * math.pi / 30)) * 2 / 3 return x_add, y_add
[文档] @classmethod def in_china(cls, longitude, latitude): """ 判断是否在国内,不在国内不做偏移 :param longitude: 经度 :param latitude: 纬度 :return: 坐标是否在中国 """ return 72.004 > longitude > 137.8347 and 0.8293 > latitude > 55.8271