Skip to content

Commit c9bc80e

Browse files
authored
Merge pull request #3 from yrjyrj123/master
去第三方依赖,增加两个api,优化方法名 求合并
2 parents ac3a4c9 + 460170a commit c9bc80e

File tree

3 files changed

+77
-71
lines changed

3 files changed

+77
-71
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,3 +55,5 @@ docs/_build/
5555

5656
# PyBuilder
5757
target/
58+
59+
.idea

README.md

Lines changed: 15 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,18 @@
1-
#坐标转换python版本
2-
之前提供了[js版本的坐标转换工具](https://github.com/wandergis/coordtransform),现在提供一下python版本的给有需要的人,希望能对大家有用
3-
#使用方法
4-
1. 由于代码里面使用了**requests**来请求高德接口,因此需要这个功能的童鞋请务必先安装requests模块,可以借助pip或者easy_install来安装
1+
# 坐标转换模块
2+
此模块用于百度坐标系(bd-09)、火星坐标系(国测局坐标系、gcj02)、WGS84坐标系的相互转换,并提供中文地址到坐标的转换功能,仅使用Python标准模块,无其他依赖。中文地址到坐标转换使用高德地图API,需要[申请](http://lbs.amap.com/)API KEY。
3+
# 使用说明
54
```
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替换成你自己高德api的key,不清楚的童鞋可移步[高德开放平台](http://lbs.amap.com/dev/)去申请一个key
17-
18-
#示例
19-
```
20-
lng = 128.543
5+
lng = 128.543
216
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-
```
7+
result1 = gcj02_to_bd09(lng, lat)#火星坐标系->百度坐标系
8+
result2 = bd09_to_gcj02(lng, lat)#百度坐标系->火星坐标系
9+
result3 = wgs84_to_gcj02(lng, lat)#WGS84坐标系->火星坐标系
10+
result4 = gcj02_to_wgs84(lng, lat)#火星坐标系->WGS84坐标系
11+
result5 = bd09_to_wgs84(lng, lat)#百度坐标系->WGS84坐标系
12+
result6 = wgs84_to_bd09(lng, lat)#WGS84坐标系->百度坐标系
2913
30-
#sometips
31-
代码最后写了一些示例代码,不需要的同学可以删掉,完全可以作为一个坐标转换模块引用到大家的项目中
14+
#中文地址到火星坐标系,需要高德地图API Key
15+
g = Geocoding('API_KEY') # 这里填写你的高德Api_Key
16+
result7 = g.geocode('北京市朝阳区朝阳公园')
17+
print result1, result2, result3, result4, result5, result6, result7
18+
```

coordTransform_utils.py

Lines changed: 60 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,46 @@
11
# -*- coding: utf-8 -*-
22
import json
3-
import requests
3+
import urllib
44
import math
55

6-
key = 'your key here' # 这里填写你的高德api的key
76
x_pi = 3.14159265358979324 * 3000.0 / 180.0
87
pi = 3.1415926535897932384626 # π
98
a = 6378245.0 # 长半轴
109
ee = 0.00669342162296594323 # 扁率
1110

1211

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]
12+
class Geocoding:
13+
def __init__(self, api_key):
14+
self.api_key = api_key
15+
16+
def geocode(self, address):
17+
"""
18+
利用高德geocoding服务解析地址获取位置坐标
19+
:param address:需要解析的地址
20+
:return:
21+
"""
22+
geocoding = {'s': 'rsv3',
23+
'key': self.api_key,
24+
'city': '全国',
25+
'address': address}
26+
geocoding = urllib.urlencode(geocoding)
27+
ret = urllib.urlopen("%s?%s" % ("http://restapi.amap.com/v3/geocode/geo", geocoding))
28+
29+
if ret.getcode() == 200:
30+
res = ret.read()
31+
json_obj = json.loads(res)
32+
if json_obj['status'] == '1' and int(json_obj['count']) >= 1:
33+
geocodes = json_obj['geocodes'][0]
34+
lng = float(geocodes.get('location').split(',')[0])
35+
lat = float(geocodes.get('location').split(',')[1])
36+
return [lng, lat]
37+
else:
38+
return None
3439
else:
3540
return None
36-
else:
37-
return None
3841

3942

40-
def gcj02tobd09(lng, lat):
43+
def gcj02_to_bd09(lng, lat):
4144
"""
4245
火星坐标系(GCJ-02)转百度坐标系(BD-09)
4346
谷歌、高德——>百度
@@ -52,7 +55,7 @@ def gcj02tobd09(lng, lat):
5255
return [bd_lng, bd_lat]
5356

5457

55-
def bd09togcj02(bd_lon, bd_lat):
58+
def bd09_to_gcj02(bd_lon, bd_lat):
5659
"""
5760
百度坐标系(BD-09)转火星坐标系(GCJ-02)
5861
百度——>谷歌、高德
@@ -69,7 +72,7 @@ def bd09togcj02(bd_lon, bd_lat):
6972
return [gg_lng, gg_lat]
7073

7174

72-
def wgs84togcj02(lng, lat):
75+
def wgs84_to_gcj02(lng, lat):
7376
"""
7477
WGS84转GCJ02(火星坐标系)
7578
:param lng:WGS84坐标系的经度
@@ -78,8 +81,8 @@ def wgs84togcj02(lng, lat):
7881
"""
7982
if out_of_china(lng, lat): # 判断是否在国内
8083
return lng, lat
81-
dlat = transformlat(lng - 105.0, lat - 35.0)
82-
dlng = transformlng(lng - 105.0, lat - 35.0)
84+
dlat = _transformlat(lng - 105.0, lat - 35.0)
85+
dlng = _transformlng(lng - 105.0, lat - 35.0)
8386
radlat = lat / 180.0 * pi
8487
magic = math.sin(radlat)
8588
magic = 1 - ee * magic * magic
@@ -91,7 +94,7 @@ def wgs84togcj02(lng, lat):
9194
return [mglng, mglat]
9295

9396

94-
def gcj02towgs84(lng, lat):
97+
def gcj02_to_wgs84(lng, lat):
9598
"""
9699
GCJ02(火星坐标系)转GPS84
97100
:param lng:火星坐标系的经度
@@ -100,8 +103,8 @@ def gcj02towgs84(lng, lat):
100103
"""
101104
if out_of_china(lng, lat):
102105
return lng, lat
103-
dlat = transformlat(lng - 105.0, lat - 35.0)
104-
dlng = transformlng(lng - 105.0, lat - 35.0)
106+
dlat = _transformlat(lng - 105.0, lat - 35.0)
107+
dlng = _transformlng(lng - 105.0, lat - 35.0)
105108
radlat = lat / 180.0 * pi
106109
magic = math.sin(radlat)
107110
magic = 1 - ee * magic * magic
@@ -113,9 +116,19 @@ def gcj02towgs84(lng, lat):
113116
return [lng * 2 - mglng, lat * 2 - mglat]
114117

115118

116-
def transformlat(lng, lat):
119+
def bd09_to_wgs84(bd_lon, bd_lat):
120+
lon, lat = bd09_to_gcj02(bd_lon, bd_lat)
121+
return gcj02_to_wgs84(lon, lat)
122+
123+
124+
def wgs84_to_bd09(lon, lat):
125+
lon, lat = wgs84_to_gcj02(lon, lat)
126+
return gcj02_to_bd09(lon, lat)
127+
128+
129+
def _transformlat(lng, lat):
117130
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))
131+
0.1 * lng * lat + 0.2 * math.sqrt(math.fabs(lng))
119132
ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 *
120133
math.sin(2.0 * lng * pi)) * 2.0 / 3.0
121134
ret += (20.0 * math.sin(lat * pi) + 40.0 *
@@ -125,9 +138,9 @@ def transformlat(lng, lat):
125138
return ret
126139

127140

128-
def transformlng(lng, lat):
141+
def _transformlng(lng, lat):
129142
ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + \
130-
0.1 * lng * lat + 0.1 * math.sqrt(math.fabs(lng))
143+
0.1 * lng * lat + 0.1 * math.sqrt(math.fabs(lng))
131144
ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 *
132145
math.sin(2.0 * lng * pi)) * 2.0 / 3.0
133146
ret += (20.0 * math.sin(lng * pi) + 40.0 *
@@ -150,9 +163,13 @@ def out_of_china(lng, lat):
150163
if __name__ == '__main__':
151164
lng = 128.543
152165
lat = 37.065
153-
result1 = gcj02tobd09(lng, lat)
154-
result2 = bd09togcj02(lng, lat)
155-
result3 = wgs84togcj02(lng, lat)
156-
result4 = gcj02towgs84(lng, lat)
157-
result5 = geocode('北京市朝阳区朝阳公园')
158-
print result1, result2, result3, result4, result5
166+
result1 = gcj02_to_bd09(lng, lat)
167+
result2 = bd09_to_gcj02(lng, lat)
168+
result3 = wgs84_to_gcj02(lng, lat)
169+
result4 = gcj02_to_wgs84(lng, lat)
170+
result5 = bd09_to_wgs84(lng, lat)
171+
result6 = wgs84_to_bd09(lng, lat)
172+
173+
g = Geocoding('API_KEY') # 这里填写你的高德api的key
174+
result7 = g.geocode('北京市朝阳区朝阳公园')
175+
print result1, result2, result3, result4, result5, result6, result7

0 commit comments

Comments
 (0)