Skip to content

Commit 0f14048

Browse files
author
wandergis
committed
代码提交到github
代码提交到github
1 parent 5f6b11f commit 0f14048

File tree

2 files changed

+193
-0
lines changed

2 files changed

+193
-0
lines changed

README.md

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#坐标转换python版本
2+
之前提供了js版本的坐标转换工具,现在提供一下python版本的给有需要的人,希望能对大家有用
3+
#使用方法
4+
1. 由于代码里面使用了**requests**来请求百度geocode接口,因此需要这个功能的童鞋请务必先安装requests模块,可以借助pip或者easy_install来安装
5+
```
6+
pip install requests
7+
```
8+
or
9+
```
10+
easy_install requests
11+
```
12+
2. 仅仅安装requests模块是不够的,童鞋还需要将代码内的
13+
```
14+
key = 'your key here' # 这里填写你的百度开放平台的key
15+
```
16+
中的key替换成你自己百度地图开放平台的key,不清楚的童鞋可移步[百度地图开放平台](http://developer.baidu.com/map/index.php?title=首页)去申请一个key
17+
18+
#示例
19+
```
20+
lng = 128.543
21+
lat = 37.065
22+
result1 = gcj02tobd09(lng, lat)
23+
result2 = bd09togcj02(lng, lat)
24+
result3 = wgs84togcj02(lng, lat)
25+
result4 = gcj02towgs84(lng, lat)
26+
result5 = geocode('北京市朝阳区朝阳公园')
27+
print result1, result2, result3, result4, result5
28+
```
29+
30+
#sometips
31+
代码最后写了一些示例代码,不需要的同学可以删掉,完全可以作为一个坐标转换模块引用到大家的项目中

coordTransform_utils.py

Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
# -*- coding: utf-8 -*-
2+
import json
3+
import requests
4+
import math
5+
6+
key = 'your key here' # 这里填写你的百度开放平台的key
7+
x_pi = 3.14159265358979324 * 3000.0 / 180.0
8+
pi = 3.1415926535897932384626 # π
9+
a = 6378245.0 # 长半轴
10+
ee = 0.00669342162296594323 # 扁率
11+
12+
13+
def geocode(address):
14+
"""
15+
利用百度geocoding服务解析地址获取位置坐标
16+
:param address:需要解析的地址
17+
:return:
18+
"""
19+
geocoding = {'s': 'rsv3',
20+
'key': key,
21+
'city': '全国',
22+
'address': address}
23+
res = requests.get(
24+
"http://restapi.amap.com/v3/geocode/geo", params=geocoding)
25+
if res.status_code == 200:
26+
json = res.json()
27+
status = json.get('status')
28+
count = json.get('count')
29+
if status == '1' and int(count) >= 1:
30+
geocodes = json.get('geocodes')[0]
31+
lng = float(geocodes.get('location').split(',')[0])
32+
lat = float(geocodes.get('location').split(',')[1])
33+
return [lng, lat]
34+
else:
35+
return None
36+
else:
37+
return None
38+
39+
40+
def gcj02tobd09(lng, lat):
41+
"""
42+
火星坐标系(GCJ-02)转百度坐标系(BD-09)
43+
谷歌、高德——>百度
44+
:param lng:火星坐标经度
45+
:param lat:火星坐标纬度
46+
:return:
47+
"""
48+
z = math.sqrt(lng * lng + lat * lat) + 0.00002 * math.sin(lat * x_pi)
49+
theta = math.atan2(lat, lng) + 0.000003 * math.cos(lng * x_pi)
50+
bd_lng = z * math.cos(theta) + 0.0065
51+
bd_lat = z * math.sin(theta) + 0.006
52+
return [bd_lng, bd_lat]
53+
54+
55+
def bd09togcj02(bd_lon, bd_lat):
56+
"""
57+
百度坐标系(BD-09)转火星坐标系(GCJ-02)
58+
百度——>谷歌、高德
59+
:param bd_lat:百度坐标纬度
60+
:param bd_lon:百度坐标经度
61+
:return:转换后的坐标列表形式
62+
"""
63+
x = bd_lon - 0.0065
64+
y = bd_lat - 0.006
65+
z = math.sqrt(x * x + y * y) - 0.00002 * math.sin(y * x_pi)
66+
theta = math.atan2(y, x) - 0.000003 * math.cos(x * x_pi)
67+
gg_lng = z * math.cos(theta)
68+
gg_lat = z * math.sin(theta)
69+
return [gg_lng, gg_lat]
70+
71+
72+
def wgs84togcj02(lng, lat):
73+
"""
74+
WGS84转GCJ02(火星坐标系)
75+
:param lng:WGS84坐标系的经度
76+
:param lat:WGS84坐标系的纬度
77+
:return:
78+
"""
79+
if out_of_china(lng, lat): # 判断是否在国内
80+
return lng, lat
81+
dlat = transformlat(lng - 105.0, lat - 35.0)
82+
dlng = transformlng(lng - 105.0, lat - 35.0)
83+
radlat = lat / 180.0 * pi
84+
magic = math.sin(radlat)
85+
magic = 1 - ee * magic * magic
86+
sqrtmagic = math.sqrt(magic)
87+
dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi)
88+
dlng = (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * pi)
89+
mglat = lat + dlat
90+
mglng = lng + dlng
91+
return [mglng, mglat]
92+
93+
94+
def gcj02towgs84(lng, lat):
95+
"""
96+
GCJ02(火星坐标系)转GPS84
97+
:param lng:火星坐标系的经度
98+
:param lat:火星坐标系纬度
99+
:return:
100+
"""
101+
if out_of_china(lng, lat):
102+
return lng, lat
103+
dlat = transformlat(lng - 105.0, lat - 35.0)
104+
dlng = transformlng(lng - 105.0, lat - 35.0)
105+
radlat = lat / 180.0 * pi
106+
magic = math.sin(radlat)
107+
magic = 1 - ee * magic * magic
108+
sqrtmagic = math.sqrt(magic)
109+
dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi)
110+
dlng = (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * pi)
111+
mglat = lat + dlat
112+
mglng = lng + dlng
113+
return [lng * 2 - mglng, lat * 2 - mglat]
114+
115+
116+
def transformlat(lng, lat):
117+
ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + \
118+
0.1 * lng * lat + 0.2 * math.sqrt(math.fabs(lng))
119+
ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 *
120+
math.sin(2.0 * lng * pi)) * 2.0 / 3.0
121+
ret += (20.0 * math.sin(lat * pi) + 40.0 *
122+
math.sin(lat / 3.0 * pi)) * 2.0 / 3.0
123+
ret += (160.0 * math.sin(lat / 12.0 * pi) + 320 *
124+
math.sin(lat * pi / 30.0)) * 2.0 / 3.0
125+
return ret
126+
127+
128+
def transformlng(lng, lat):
129+
ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + \
130+
0.1 * lng * lat + 0.1 * math.sqrt(math.fabs(lng))
131+
ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 *
132+
math.sin(2.0 * lng * pi)) * 2.0 / 3.0
133+
ret += (20.0 * math.sin(lng * pi) + 40.0 *
134+
math.sin(lng / 3.0 * pi)) * 2.0 / 3.0
135+
ret += (150.0 * math.sin(lng / 12.0 * pi) + 300.0 *
136+
math.sin(lng / 30.0 * pi)) * 2.0 / 3.0
137+
return ret
138+
139+
140+
def out_of_china(lng, lat):
141+
"""
142+
判断是否在国内,不在国内不做偏移
143+
:param lng:
144+
:param lat:
145+
:return:
146+
"""
147+
if lng < 72.004 or lng > 137.8347:
148+
return True
149+
if lat < 0.8293 or lat > 55.8271:
150+
return True
151+
return False
152+
153+
154+
if __name__ == '__main__':
155+
lng = 128.543
156+
lat = 37.065
157+
result1 = gcj02tobd09(lng, lat)
158+
result2 = bd09togcj02(lng, lat)
159+
result3 = wgs84togcj02(lng, lat)
160+
result4 = gcj02towgs84(lng, lat)
161+
result5 = geocode('北京市朝阳区朝阳公园')
162+
print result1, result2, result3, result4, result5

0 commit comments

Comments
 (0)