1
1
# -*- coding: utf-8 -*-
2
2
import json
3
- import requests
3
+ import urllib
4
4
import math
5
5
6
- key = 'your key here' # 这里填写你的高德api的key
7
6
x_pi = 3.14159265358979324 * 3000.0 / 180.0
8
7
pi = 3.1415926535897932384626 # π
9
8
a = 6378245.0 # 长半轴
10
9
ee = 0.00669342162296594323 # 扁率
11
10
12
11
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
34
39
else :
35
40
return None
36
- else :
37
- return None
38
41
39
42
40
- def gcj02tobd09 (lng , lat ):
43
+ def gcj02_to_bd09 (lng , lat ):
41
44
"""
42
45
火星坐标系(GCJ-02)转百度坐标系(BD-09)
43
46
谷歌、高德——>百度
@@ -52,7 +55,7 @@ def gcj02tobd09(lng, lat):
52
55
return [bd_lng , bd_lat ]
53
56
54
57
55
- def bd09togcj02 (bd_lon , bd_lat ):
58
+ def bd09_to_gcj02 (bd_lon , bd_lat ):
56
59
"""
57
60
百度坐标系(BD-09)转火星坐标系(GCJ-02)
58
61
百度——>谷歌、高德
@@ -69,7 +72,7 @@ def bd09togcj02(bd_lon, bd_lat):
69
72
return [gg_lng , gg_lat ]
70
73
71
74
72
- def wgs84togcj02 (lng , lat ):
75
+ def wgs84_to_gcj02 (lng , lat ):
73
76
"""
74
77
WGS84转GCJ02(火星坐标系)
75
78
:param lng:WGS84坐标系的经度
@@ -78,8 +81,8 @@ def wgs84togcj02(lng, lat):
78
81
"""
79
82
if out_of_china (lng , lat ): # 判断是否在国内
80
83
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 )
83
86
radlat = lat / 180.0 * pi
84
87
magic = math .sin (radlat )
85
88
magic = 1 - ee * magic * magic
@@ -91,7 +94,7 @@ def wgs84togcj02(lng, lat):
91
94
return [mglng , mglat ]
92
95
93
96
94
- def gcj02towgs84 (lng , lat ):
97
+ def gcj02_to_wgs84 (lng , lat ):
95
98
"""
96
99
GCJ02(火星坐标系)转GPS84
97
100
:param lng:火星坐标系的经度
@@ -100,8 +103,8 @@ def gcj02towgs84(lng, lat):
100
103
"""
101
104
if out_of_china (lng , lat ):
102
105
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 )
105
108
radlat = lat / 180.0 * pi
106
109
magic = math .sin (radlat )
107
110
magic = 1 - ee * magic * magic
@@ -113,9 +116,19 @@ def gcj02towgs84(lng, lat):
113
116
return [lng * 2 - mglng , lat * 2 - mglat ]
114
117
115
118
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 ):
117
130
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 ))
119
132
ret += (20.0 * math .sin (6.0 * lng * pi ) + 20.0 *
120
133
math .sin (2.0 * lng * pi )) * 2.0 / 3.0
121
134
ret += (20.0 * math .sin (lat * pi ) + 40.0 *
@@ -125,9 +138,9 @@ def transformlat(lng, lat):
125
138
return ret
126
139
127
140
128
- def transformlng (lng , lat ):
141
+ def _transformlng (lng , lat ):
129
142
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 ))
131
144
ret += (20.0 * math .sin (6.0 * lng * pi ) + 20.0 *
132
145
math .sin (2.0 * lng * pi )) * 2.0 / 3.0
133
146
ret += (20.0 * math .sin (lng * pi ) + 40.0 *
@@ -150,9 +163,13 @@ def out_of_china(lng, lat):
150
163
if __name__ == '__main__' :
151
164
lng = 128.543
152
165
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