百度地图POI边界坐标数据采集
优采云 发布时间: 2020-08-07 06:19在线工具地址: 百度地图POI边界数据采集工具
因为之前我已经研究过AutoNavi地图的POI数据边界坐标的采集,其后面的界面过于不稳定,因此很难成功地采集数据. 此功能已被搁置一段时间. 最近,它在@entropy的帮助下完成. 使用百度地图界面采集POI边界函数. 但是,在此预先声明下,无论是百度还是AutoNavi,每个都使用POI的ID来完成边界坐标的采集. 相同的POI数据在AutoNavi和百度上具有不同的ID. 因此,如果要使用百度采集边界界面,则必须确保现有的POI数据是通过百度POI界面采集的,并且具有ID字段. (总结: 不要使用AutoNavi界面采集的POI数据调用百度界面来爬坡边界数据. )
确定POI边界数据采集的接口地址
https://map.baidu.com/?newmap=1&reqflag=pcmap&biz=1&from=webmap&da_par=direct&pcevaname=p*敏*感*词*.1&qt=ext&uid=207119787bb3c5c95d17c334&c=340&ext_ver=new&tn=B_NORMAL_MAP&nn=0&auth=fw9wVDQUyKS7%3DQ5eWeb5A21KZOG0NadNuxHNBxBBLBHtxjhNwzWWvy1uVt1GgvPUDZYOYIZuEt2gz4yYxGccZcuVtPWv3GuxNt%3DkVJ0IUvhgMZSguxzBEHLNRTVtlEeLZNz1%40Db17dDFC8zv7u%40ZPuxtfvSulnDjnCENTHEHH%40NXBvzXX3M%40J2mmiJ4Y&ie=utf-8&l=19&b=(12679382.095,2565580.38;12679884.095,2565907.38)&t=1573133634785
接口非常简单,不需要密钥,可以通过GET请求调用它. 在参数中,您需要使用自己的POI ID替换uid =之后的字符串. 因此,打开浏览器后可以看到结果,数据结构如下:
{
"content": {
"geo": "4|12674567.8667,2556549.714;12674700.0816,2556667.07656|1-12674700.0816,2556615.59082,12674663.0912,2556549.714,12674567.8667,2556601.53877,12674605.8561,2556667.07656,12674700.0816,2556615.59082;",
"uid": "207119787bb3c5c95d17c334"
},
"current_city": {
"code": 340,
"geo": "1|12697919.69,2560977.31;12697919.69,2560977.31|12697919.69,2560977.31;",
"level": 12,
"name": "深圳市",
"sup": 1,
"sup_bus": 1,
"sup_business_area": 1,
"sup_lukuang": 1,
"sup_subway": 1,
"type": 2,
"up_province_name": "广东省"
},
"err_msg": "",
"hot_city": [
"北京市|131",
"上海市|289",
"广州市|257",
"深圳市|340",
"成都市|75",
"天津市|332",
"南京市|315",
"杭州市|179",
"武汉市|218",
"重庆市|132"
],
"result": {
"data_security_filt_res": 0,
"error": 0,
"illegal": 0,
"login_debug": 1,
"qid": "",
"region": "0",
"type": 10,
"uii_qt": "poi_profile",
"uii_type": "china_main"
},
"uii_err": 0
}
current_city的地理位置是我们需要查找的POI数据的边界坐标,其余就是如何解析此数据. 但应注意,此坐标系是bd09mc(百度墨卡托公制坐标). 坐标系描述可以参考
http://lbs.baidu.com/index.php?title=android-yingyan/guide/coordtrans
因此数据需要稍后转换为百度经纬度坐标.
用于基于UID获取边界数据并进行简单分析的代码参考:
def get_boundary_by_uid(uid):
bmap_boundary_url = 'https://map.baidu.com/?newmap=1&reqflag=pcmap&biz=1&from=webmap&da_par=direct&pcevaname=p*敏*感*词*.1&qt=ext&uid=' + uid + '&c=340&ext_ver=new&tn=B_NORMAL_MAP&nn=0&auth=fw9wVDQUyKS7%3DQ5eWeb5A21KZOG0NadNuxHNBxBBLBHtxjhNwzWWvy1uVt1GgvPUDZYOYIZuEt2gz4yYxGccZcuVtPWv3GuxNt%3DkVJ0IUvhgMZSguxzBEHLNRTVtlEeLZNz1%40Db17dDFC8zv7u%40ZPuxtfvSulnDjnCENTHEHH%40NXBvzXX3M%40J2mmiJ4Y&ie=utf-8&l=19&b=(12679382.095,2565580.38;12679884.095,2565907.38)&t=1573133634785'
s = requests.Session()
s.mount('http://', HTTPAdapter(max_retries=3))
s.mount('https://', HTTPAdapter(max_retries=3))
data = s.get(url=bmap_boundary_url, timeout=5, headers={"Connection": "close"})
data = data.text
data = json.loads(data)
content = data['content']
if not 'geo' in content:
return None
geo = content['geo']
i = 0
strsss = ''
for jj in str(geo).split('|')[2].split('-')[1].split(','):
jj = str(jj).strip(';')
if i % 2 == 0:
strsss = strsss + str(jj) + ','
else:
strsss = strsss + str(jj) + ';'
i = i + 1
return strsss.strip(";")
调用百度Map API进行坐标转换
http://lbsyun.baidu.com/index.php?title=webapi/guide/changeposition
需要注意的是,该界面只能将其他坐标系中的数据转换为百度的公制坐标系和百度的经纬度坐标系,而不能反转.
http://api.map.baidu.com/geoconv/v1/?coords=112.343,232.34&from=6&to=5&ak=百度密钥
其中from = 6&to = 5表示从百度度量坐标系转换为百度经纬度坐标系. 有关详细信息,请参阅官方文档.
def transform_coordinate_batch(coordinates):
req_url = 'http://api.map.baidu.com/geoconv/v1/?coords='+coordinates+'&from=6&to=5&ak=' + bmap_key
s = requests.Session()
s.mount('http://', HTTPAdapter(max_retries=3))
s.mount('https://', HTTPAdapter(max_retries=3))
data = s.get(req_url, timeout=5, headers={"Connection": "close"}) # , proxies=proxies
data = data.text
data = json.loads(data)
coords = ''
if data['status'] == 0:
result = data['result']
if len(result) > 0:
for res in result:
lng = res['x']
lat = res['y']
coords = coords + ";" + str(lng) + "," + str(lat)
return coords.strip(";")
最终数据
当前获得的边界数据格式如下:
113.85752917167422,22.512113353880437;113.85719688487298,22.51156349239119;113.8563414779429,22.51199606423422;113.8566827388162,22.512543094177662;113.85752917167422,22.512113353880437
现在您有了数据,其余的操作很简单. 这主要取决于您自己的需求. 如果需要在ARCGIS中显示区域数据,则需要再次进行处理. 结果示例:
在分析之下: uid是POI的ID,数字是自增的,暂时无用,一个uid对应于多个x,y对,一个x,y是一个点坐标,并且连接了多个点坐标形成多边形表面数据.
file_name = 'data/boundary_result_wgs84 - polygon.csv'
csv_file = pd.read_csv(file_name, encoding='gbk')
a_col = []
data_csv = {}
numbers, xs, ys, uids = [], [], [], []
index = 1
for i in range(len(csv_file)):
boundary = str(csv_file['boundary'][i])
uid = str(uuid.uuid4()).replace('-', '')
if boundary is not '':
for point in boundary.split(";"):
lng = point.split(",")[0]
lat = point.split(",")[1]
xs.append(lng)
ys.append(lat)
numbers.append(index)
uids.append(uid)
index = index + 1
data_csv['number'] = numbers
data_csv['x'] = xs
data_csv['y'] = ys
data_csv['uid'] = uids
df = pd.DataFrame(data_csv)
df.to_csv(os.getcwd() + os.sep + 'data/polygon-shape.csv', index=False, encoding='gbk')
请务必阅读
目前,POI边界坐标的采集已成为在线工具. 如果您有兴趣,可以尝试一下. 地址: 百度地图POI边界采集工具
上传需要采集的POI ID的CSV文件并申请了百度地图密钥后,即可采集到相应的边界数据!请注意,最好不要在一次上传中上传太多数据.