最近项目中有用到调用高德地图poi数据,主要解决高德地图每次请求最多返回1000个POI信息,在这里以深圳市内中餐厅数据为例,将操作步骤整理了一下。
一、获取深圳市经纬度
1、需要在高德地图开放平台上注册账号,并且申请web服务的密钥。 2、POI分类编码和城市编码表 3、查询深圳市经纬度:登录高德地图开放平台 >> 开发支持 >> Web服务API > > 开发指南 >> API文档 >> 行政区域查询,然后根据文档说明进行操作,直接在示例中就能很快查询出深圳区域边界坐标点,也可以通过python脚本获取。 4、由于深圳是包含几个地块,我们可以将小块区域数据去除掉,获得的坐标数据中每块地的坐标串是以 | 分隔,将数据复制到world中,查找到小块区域的坐标并删除,然后剩余数据分行再复制到excel中,再在excel中进行分列操作,并添加x,y表头保存为excel 97-2013xls文件,方便下一步arcmap操作。
二、Arcmp操作将深圳市分为若干矩形区域,并获得各举行的左上即右下坐标点
1、下载Arcmap,网上可以下载到 2、打开arcmap,点击左上角 file >> add data >> add XYdata >> 选择文件>> 点击+选择上一步保存的xls文件 >> 点击ok
3、点击导出数据 >> 以shp文件保存到文件夹中 >> 点击ok >> yse
4、将点连成线:arctoolbox >> data management tools >> features >> 双击points to line >> 弹出对话框中将Export_Output_1拉入到输入框中,再选择输出位置 >> ok
将第一个图层√去掉,可以得到深圳区域边界线
5、绘制渔网:arctoolbox >> data management tools >> sampling >> create fishnet
选择输出区域,分成10行和10列,记录上下左右四个点的数据。
6、渔网内点编辑:将其他图层去掉,右击渔网图层打开属性表,点击add field
分别增加lng_left 、lat_top 、lng_right 、lat_bot,type设置为float,精度默认即可 对每个点进行赋值,原理:将每个中线点赋值为右侧边界值。
点击 Editor >> start editing 选中第一列,将第一列 lng_left 赋值为:113.751453+0.08770130,第二列赋值为113.751453+0.08770131,第三列赋值为113.751453+0.08770132,以此类推,第十列赋值为113.751453+0.08770139
再选中第一行,将第一行 lat_top 赋值为:22.861748-0.04231670 第二行赋值为 22.861748-0.04231671, 第三行赋值为22.861748-0.04231672, 以此类推,第十行赋值为22.861748-0.04231679 继续对 lng_right 进行赋值, 右边的经度等于左边经度加上差值 [lng_left] +0.0877013,lat_bot与此同理,= [lat_top] -0.0423167
赋值完成后点击保存编辑,然后点击结束编辑 然后需要删除多余数据点,将原本建立的深圳市边界图层打开,将边界外点位删除。删除点位同样需要点击 Editor >> start editing 将区域外的点选中删除 打开属性表,导出数据,选择导出 text file,导出的文件即为深圳市区域内划分为小矩阵的地点坐标
三、python处理数据
import pandas as pd
import requests
key = '***********************' #高德地图开发者平台申请的key
keywords = "中餐厅"
types = "050100"
url_head = "https://restapi.amap.com/v3/place/polygon?"
text1 = pd.read_csv(r"C:\Users\37957\Desktop\python获取高德poi\Export_Output2.txt") #从arcmap中导出的text文件地址
#for i in range(0, len(text1)): #获取全部矩阵数据时,有可能超过高德地图配置的每天30000条数据限额,可选择先获取前35条,第二天再获取剩余数据
for i in range(0, 35):
#经度和纬度用","分割,经度在前,纬度在后,坐标对用"|"分割,经纬度小数点后不得超过6位。
con_location = str(round(text1["lng_left"][i], 6)) + ',' + str(round(text1['lat_top'][i], 6)) + '|' + str(round(
text1['lng_right'][i], 6)) + ',' + str(round(text1['lat_bot'][i], 6))
url_ttl = url_head + "polygon=" + con_location + "&keywords=" + keywords + "&key=" + key + "&types=" + types + "&output=json&offset=20&extensions=base"
# rep0 = requests.get(url_ttl)
# json0 = rep0.json()
# count0 = json0["count"]
print("开始进行第%d个网格的数据提取." % i)
# print("一共%d条数据" % int(count0))
for p in range(1, 101): #遍历100页
url = url_ttl + '&page=' + str(p)
rep1 = requests.get(url)
json1 = rep1.json()
pois_data = json1['pois']
for poi in pois_data:
poi_name = str(poi["name"])
poi_adname = str(poi["adname"])
poi_address = str(poi.get("address", "无详细地址"))
poi_location = str(poi["location"])
poi_tel = str(poi.get("tel", "无联系方式"))
poi_info = poi_name + ";" + poi_adname + ";" + poi_address + ";" + poi_location + ";" + poi_tel + "\n"
poi_info = poi_info.encode('gbk', 'ignore').decode("gbk", "ignore") #避免编码错误
with open("poi_gaode.txt", 'a') as f:
f.write(poi_info)
print("正在写入数据...")
print("数据提取完成")
数据提取完成后,在当前目录生成的poi_gaode.txt文件即为我们需要的数据。