UTM(墨卡托)享潜、BD09(百度坐標)、GCJ-02(火星坐標系)颓帝、WGS84(GPS坐標)相互轉換

# -*- coding: utf-8 -*-
"""
坐標轉換
"""
import math
import utm

# 坐標轉換變量
x_pi = 3.14159265358979324 * 3000.0 / 180.0
pi = 3.1415926535897932384626
a = 6378245.0  # 長半軸
ee = 0.00669342162296594323  # 偏心率平方

def utm_to_bd09(utm_e, utm_n, zone=50, hemi='N'):
    """
    UTM(通用橫軸墨卡托)坐標轉bd09坐標(百度)
    :param utm_e:
    :param utm_n:
    :param zone:
    :param hemi:
    :return:
    """
    bd_lng = None
    bd_lat = None
    try:
        # utm轉gps
        lat, lng = utm.to_latlon(utm_e, utm_n, zone, str(hemi))
        if not out_of_china(lng, lat):  # 判斷是否在國內
            bd_lng, bd_lat = wgs84_to_bd09(lng, lat)
    except Exception as e:
        data = unicode({"utm_e": utm_e, "utm_n": utm_n, 'zone': zone})
    return bd_lng, bd_lat


def utm_to_gcj02(utm_e, utm_n, zone=50, hemi='N'):
    """
    UTM(通用橫軸墨卡托)坐標轉火星坐標系(GCJ-02)
    UTM-->谷歌米碰、高德
    :param utm_e:
    :param utm_n:
    :param zone:
    :param hemi:
    :return:
    """
    mglng = None
    mglat = None
    try:
        # utm轉WGS84(GPS坐標)
        lat, lng = utm.to_latlon(utm_e, utm_n, zone, str(hemi))
        if not out_of_china(lng, lat):  # 判斷是否在國內
            mglng, mglat = wgs84_to_gcj02(lng, lat)
    except Exception as e:
        print e
    return mglng, mglat


def gcj02_to_utm(lon, lat):
    """
    火星坐標系(GCJ-02)轉UTM
    谷歌窝革、高德——>墨卡托
    :param lon:
    :param lat:
    :return:(56.79680,-5.00601)=>(377485.7656709162, 6296561.854853108, 30, 'V')

    """
    lon, lat = gcj02_to_wgs84(lon, lat)
    res_utm = utm.from_latlon(lat, lon)
    return res_utm[0], res_utm[1]


def bd09_to_utm(lon, lat):
    """
    bd09坐標(百度)轉UTM
    百度坐標——>墨卡托
    :param lon:
    :param lat:
    :return:(56.79680,-5.00601)=>(377485.7656709162, 6296561.854853108, 30, 'V')

    """
    lon, lat = bd09_to_wgs84(lon, lat)
    res_utm = utm.from_latlon(lat, lon)
    return res_utm[0], res_utm[1]


def gcj02_to_bd09(lng, lat):
    """
    火星坐標系(GCJ-02)轉百度坐標系(BD-09)
    谷歌、高德——>百度
    :param lng:火星坐標經度
    :param lat:火星坐標緯度
    :return:
    """
    lng = float(lng)
    lat = float(lat)
    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


def bd09_to_gcj02(bd_lon, bd_lat):
    """
    百度坐標系(BD-09)轉火星坐標系(GCJ-02)
    百度——>谷歌吕座、高德
    :param bd_lat:百度坐標緯度
    :param bd_lon:百度坐標經度
    :return:轉換后的坐標列表形式
    """
    bd_lat = float(bd_lat)
    bd_lon = float(bd_lon)
    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)
    gg_lng = z * math.cos(theta)
    gg_lat = z * math.sin(theta)
    return gg_lng, gg_lat


def wgs84_to_gcj02(lng, lat):
    """
    WGS84轉GCJ02(火星坐標系)
    GPS坐標-->谷歌虐译、高德
    :param lng:WGS84坐標系的經度
    :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
    magic = math.sin(radlat)
    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)
    mglat = lat + dlat
    mglng = lng + dlng
    return mglng, mglat


def gcj02_to_wgs84(lng, lat):
    """
    GCJ02(火星坐標系)轉WGS84
    谷歌、高德-->GPS坐標
    :param lng:火星坐標系的經度
    :param lat:火星坐標系緯度
    :return:
    """
    if out_of_china(lng, lat):
        return [lng, lat]
    mglng, mglat = wgs84_to_gcj02(lng, lat)
    return [lng * 2 - mglng, lat * 2 - mglat]


def bd09_to_wgs84(bd_lon, bd_lat):
    """
    百度坐標系(BD-09)轉WGS84
    百度-->GPS坐標
    :param bd_lon:
    :param bd_lat:
    :return:
    """
    lon, lat = bd09togcj02(bd_lon, bd_lat)
    return gcj02_to_wgs84(lon, lat)


def wgs84_to_bd09(lon, lat):
    """
    WGS84轉百度坐標系(BD-09)
    GPS坐標-->百度
    :param lon:
    :param lat:
    :return:
    """
    lon, lat = wgs84_to_gcj02(lon, lat)
    return gcj02tobd09(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
    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
    return ret


def out_of_china(lng, lat):
    """
    WGS84(GPS)坐標的判斷是否再國內
    判斷是否在國內吴趴,不在國內不做偏移
    :param lng:
    :param lat:
    :return:
    """
    return not (73.66 < lng < 135.05 and 3.86 < lat < 53.55)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末漆诽,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子锣枝,更是在濱河造成了極大的恐慌厢拭,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撇叁,死亡現場離奇詭異供鸠,居然都是意外死亡,警方通過查閱死者的電腦和手機陨闹,發(fā)現死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門楞捂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人趋厉,你說我怎么就攤上這事寨闹。” “怎么了君账?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵繁堡,是天一觀的道長。 經常有香客問我乡数,道長椭蹄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任瞳脓,我火速辦了婚禮塑娇,結果婚禮上,老公的妹妹穿的比我還像新娘劫侧。我一直安慰自己埋酬,他們只是感情好,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布烧栋。 她就那樣靜靜地躺著写妥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪审姓。 梳的紋絲不亂的頭發(fā)上珍特,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天,我揣著相機與錄音魔吐,去河邊找鬼扎筒。 笑死莱找,一個胖子當著我的面吹牛,可吹牛的內容都是我干的嗜桌。 我是一名探鬼主播奥溺,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼骨宠!你這毒婦竟也來了浮定?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤层亿,失蹤者是張志新(化名)和其女友劉穎桦卒,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體匿又,經...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡方灾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了碌更。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片迎吵。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖针贬,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情拢蛋,我是刑警寧澤桦他,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站谆棱,受9級特大地震影響快压,放射性物質發(fā)生泄漏。R本人自食惡果不足惜垃瞧,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一蔫劣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧个从,春花似錦脉幢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至奕污,卻和暖如春萎羔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背碳默。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工贾陷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留缘眶,地道東北人。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓髓废,卻偏偏與公主長得像巷懈,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子瓦哎,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344