百度MapAPI之地理编码
地理编码:将具体地址数据转换为对应坐标点经纬度功能
大致思路:
1、从数据库取得具体地理位置
2、将地址作为参数访问API接口,获取返回数据
3、处理response数据并将经度(lng、longitude)、纬度(lat、latitude)存入数据库
API接口:http://api.map.baidu.com/geocoder/v2/?address=地址(&city=城市名)&output=json&ak=ak(密钥)
address:详细地址
city:可选参数,address所在城市名,起过滤作用
output:返回数据格式,json/xml
ak:访问百度API密钥,必须有,申请很容易。EsZB0Gz6IFXqj6OGBN951ROOOdzfEXXx
数据库表设计
语言选择:python(python处理数据和访问url都比java方便简单)
import pymysql
import requests
import json
import redef getLocation():
#数据库连接
conn = pymysql.Connect(host='localhost',
port=3306,
user='root',
passwd='root',
db='AnalyseBusiness',
charset='utf8')
try:
# 获取游标
cur = conn.cursor()
# 执行sql语句 选择经纬度为空的记录
cur.execute('select * from BusinessInfo where longitude is null or latitude is null')
# 取得select返回的记录
data = cur.fetchall()
for d in data:
# url = "http://api.map.baidu.com/geocoder/v2/?address=天安门&city=北京&output=json&ak=EsZB0Gz6IFXqj6OGBN951ROOOdzfEXXx"
# 将address和city加入构成访问url get请求
url = "http://api.map.baidu.com/geocoder/v2/?address=" + d[0] + "&city=" + d[
1] + "&output=json&ak=EsZB0Gz6IFXqj6OGBN951ROOOdzfEXXx"
response = requests.get(url)
## 正则表达式获取经纬度 若查询无相关结果 取值异常 if判断list是否为空 为空设置经纬度为999作为标识
text = response.text
pattern_lng = "lng\":(.*?),"
pattern_lat = "lat\":(.*?)}"
lng = re.findall(pattern_lng, text)
lat = re.findall(pattern_lat, text)
if lng or lat:
data = (lng[0], lat[0])
else:
# 纬度:从赤道向北和向南,各分90°,北纬为正数,南纬为负数
# 经度:向东到180°或向西到180°
# 若查询不到 存入非法经纬度值 作为标识
data = ("999", "999")
sql = "update BusinessInfo set longitude='%s', latitude='%s' WHERE address='" + d[0] + "'"
cur = conn.cursor()
cur.execute(sql % data)
conn.commit()
cur.close()
conn.close()
except Exception:
conn.rollback()
conn.close()
print("定位失败")
if __name__ == '__main__':
getLocation()
结果
提示:百度Map获取到的是百度经纬度坐标,如需要转换为国测局坐标(GCJ02)的坐标系,需调用地址转换API
API接口:http://api.map.baidu.com/geoconv/v1/?coords=114.21892734521,29.575429778924&from=1&to=5&ak=密钥 //GET请求
import requests
import re
import json
def addCity():
try:
print("百度坐标")
url = "http://api.map.baidu.com/geocoder/v2/?address=大雁塔&city=陕西省西安市&output=json&ak=EsZB0Gz6IFXqj6OGBN951ROOOdzfEXXx"
response = requests.get(url)
text = response.text
print(type(text))
pattern_lng = "lng\":(.*?),"
pattern_lat = "lat\":(.*?)}"
lng = re.findall(pattern_lng, text)
lat = re.findall(pattern_lat, text)
print("lng:" + lng[0])
print("lat:" + lat[0])
print("国测局(GCJ02)坐标")
url1 = "http://api.map.baidu.com/geoconv/v1/?coords=" + lng[0] + "," + lat[
0] + "&from=3&to=5&ak=EsZB0Gz6IFXqj6OGBN951ROOOdzfEXXx"
text2 = requests.get(url1).text
pattern_x = "x\":(.*?),"
pattern_y = "y\":(.*?)}"
x = re.findall(pattern_x, text2)
y = re.findall(pattern_y, text2)
print("x:" + x[0])
print("y:" + y[0])
except Exception:
print("error")
if __name__ == '__main__':
addCity()
结果