百度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()

结果

 

转载于:https://www.cnblogs.com/GG-Bond/p/10500024.html

Python中利用百度地图API进行批量地理编码(将地址转换为经纬度坐标),你需要首先注册并获取到百度地图的API密钥。以下是基本步骤: 1. **安装所需的库**: 首先,你需要安装`requests`库来发送HTTP请求,可以使用pip命令安装: ``` pip install requests ``` 2. **申请API密钥**: 访问百度地图开发者官网(https://lbsyun.baidu.com/),注册并创建一个新的项目,然后在项目管理页面获取到AK(应用Key)和SK(应用Secret Key)。 3. **编写代码**: 使用`requests`库,你可以构建POST请求,包含你的API密钥、地址列表以及特定的参数,如`output`设置为JSON格式。下面是一个简单的示例: ```python import requests def batch_geocode(addresses, ak, sk): url = "http://api.map.baidu.com/geocoding/v3" params = { 'ak': ak, 'address': addresses, # 地址列表,例如:["北京王府井", "上海外滩"] 'output': 'json', # 返回结果格式 'batch': True # 批量查询标志 } response = requests.post(url, params=params) if response.status_code == 200: geocodes = response.json()['result'] for address, coord in geocodes.items(): lat, lng = coord['location']['lat'], coord['location']['lng'] print(f"地址:{address}, 经纬度:({lat},{lng})") else: print("请求失败,状态码:", response.status_code) # 使用你的API密钥 addresses = ["北京市东城区王府井大街", "上海市黄浦区南京东路"] ak = 'your_api_key' sk = 'your_secret_key' batch_geocode(addresses, ak, sk) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值