高德开放平台提供了搜索POI功能,可以调用API来获取兴趣点的地理位置信息。本篇尝试用python获取高德POI并生成GIS常用shp文件。需要用的库有urllib3(或者request),json,以及用来生成shp的pandas和geopandas。

1. 申请高德开放平台Web服务API的key,个人开发者注意配额管理别超了额度和并发量,可以氪金增加额度。

2. 每次请求API最多返回对应区域内1000个POI信息,为了获取区域所有的POI,一般要划分区域或者划分多边形来获取。如果获取POI的数量大概不多,1000个都不到,按县来进行关键字搜索即可;如果数量比较多,需要用多边形搜索。

3. 平台还提供了POI分类编码和城市编码,用来选择类别和区域,用这个编码搜索会更准确。

1 关键字搜索

找出想要的POI编码,例如'140100'即为博物馆的POI。把想要的区域做成一个列表,例如['440303','440304']即为深圳罗湖区和福田区。另外还需要注意的是获取的POI坐标系是GCJ02,可以自行转换坐标系。

# get_Amap_POI('高德key','POI分类编码',[城市编码的列表],生成shp的路径名称)
def get_Amap_POI(key, types, location_list, shpname):poi_dict = {'id':[],'name':[],'type':[],'address':[],'lon':[],'lat':[]}print ('getting data...')for location in location_list:# count: number of POI in the page;count, page_index = 1,1while count != 0:parameters = "key={}&keywords={}&city={}&citylimit=true&output=JSON&page={}".format(key,types,location,page_index)url = "https://restapi.amap.com/v3/place/text?" + parametershttp = urllib3.PoolManager()response = http.request('GET', url, timeout = 5.0)jsonData = json.loads(response.data.decode('utf8'))if jsonData['status'] == '1':#print ("getting data from page {}...".format(page_index))count = int(jsonData['count'])page_index += 1for poi in jsonData['pois']:poi_dict['id'].append(poi['id'])poi_dict['name'].append(str(poi['name']))    # str() to prevent messy code in Chinesepoi_dict['type'].append(str(poi['type']))try:poi_dict['address'].append(str(poi['address']))   # some POI have no addressexcept:poi_dict['address'].append('')lon, lat = gcj2Wgs(float(poi['location'].split(',')[0]),float(poi['location'].split(',')[1]))poi_dict['lon'].append(lon)poi_dict['lat'].append(lat)else: print ("fail to request api in page {} in {}.".format(page_index, location))returnprint ("finished getting {} poi.".format(len(poi_dict['id'])))# write shpdf = pandas.DataFrame(poi_dict)gdf = geopandas.GeoDataFrame(df, geometry = geopandas.points_from_xy(df.lon, df.lat))gdf.crs = "EPSG:4326"   # projection: WGS84path = 'D:/1Data/GISM5060/' + shpnamegdf.to_file(path, encoding='utf8')   # utf8 to prevent messy code in Chineseprint ("finieshed writing {}.".format(path))

2 多边形搜索

多边形搜索可把区域划分成多个网格,再逐个获取网格中的POI,这样能获取的数量更多更完整。思路是用API的行政区域查询获取区域经纬度的最大值和最小值,即获取左上角和右下角的坐标,然后划分网格。

# acquire top-left-coordinate, bottom-right-coordinate of city
def get_city_scope(key, cityname):parameters = 'key={}&keywords={}&subdistrict={}&output=JSON&extensions=all'.format(key, cityname, 0)url = 'https://restapi.amap.com/v3/config/district?' + parametershttp = urllib3.PoolManager()response = http.request('GET',url)jsonData = json.loads(response.data.decode('utf8'))if jsonData['status'] == '1':district = jsonData['districts'][0]['polyline']district_list = re.split(';|\|',district)xlist, ylist = [], []for d in district_list:xlist.append(float(d.split(',')[0]))ylist.append(float(d.split(',')[1]))xmax = max(xlist)xmin = min(xlist)ymax = max(ylist)ymin = min(ylist)return [xmin, xmax, ymin, ymax]else:print ('fail to acquire: {}'.format(jsonData['info']))return None# search POI based on polygon (key, cityname, 宽度分成多少份, 高度分成多少份, POI types(list), output path)
def get_Amap_POI(key, cityname, width, height, typelist, shpname):print ('getting scope...')scope = get_city_scope(key, cityname)# 生成 width * height 个网格,每个网格左上角和右下角的坐标xlist = np.arange(scope[0], scope[1], (scope[1]-scope[0])/width)ylist = np.arange(scope[2], scope[3], (scope[3]-scope[2])/height)xlist = xlist.tolist()ylist = ylist.tolist()xlist.append(scope[1])ylist.append(scope[3])polygons = []for y in range(len(ylist)-1):for x in range(len(xlist)-1):polygons.append(str(xlist[x]) + ',' + str(ylist[y+1]) + '|' + str(xlist[x+1]) + ',' + str(ylist[y]))del xlist, ylist, scopepoi_dict = {'id':[],'name':[],'type':[],'address':[],'lon':[],'lat':[]}print ('getting data...')break_flag = False     # prevent failing to request API, break loop and save datafor polygon in polygons:for t in typelist:count, page_index = 1,1while count != 0:parameters = "key={}&polygon={}&types={}&output=JSON&page={}".format(key,polygon,t,page_index)url = "https://restapi.amap.com/v3/place/polygon?" + parametershttp = urllib3.PoolManager()try: response = http.request('GET', url, timeout = 10.0)except:print ('request timeout...saving data...')print ('stop at type {}, polygon {}'.format(t,polygons.index(polygon)))break_flag = TruebreakjsonData = json.loads(response.data.decode('utf8'))if jsonData['status'] == '1':print ("getting data from page {} in polygon {}...".format(page_index, polygons.index(polygon)))count = int(jsonData['count'])page_index += 1for poi in jsonData['pois']:poi_dict['id'].append(poi['id'])poi_dict['name'].append(str(poi['name']))    # str() to prevent messy code in Chinesepoi_dict['type'].append(str(poi['type']))try:poi_dict['address'].append(str(poi['address']))except:poi_dict['address'].append('')lon, lat = gcj2wgs(float(poi['location'].split(',')[0]),float(poi['location'].split(',')[1]))poi_dict['lon'].append(lon)poi_dict['lat'].append(lat)time.sleep(0.1)else: print ("fail to request api in page {} in polygon {}: {}".format(page_index, polygons.index(polygon), jsonData['info']))break_flag = Truebreakif break_flag == True: breakif break_flag == True: breakprint ("finished getting {} poi.".format(len(poi_dict['id'])))# write shpdf = pandas.DataFrame(poi_dict)gdf = geopandas.GeoDataFrame(df, geometry = geopandas.points_from_xy(df.lon, df.lat))gdf.crs = "EPSG:4326"   # projection: WGS84gdf.to_file(shpname, encoding='utf8')   # utf8 to prevent messy code in Chineseprint ("finieshed writing {}.".format(shpname))

python爬取高德POI并生成shp(关键字搜索/多边形搜索)相关推荐

  1. 使用python爬取高德POI数据,并转换为WGS84经纬度坐标的点矢量

    一,爬取高德POI数据(高德开放平台接口+ Python) 参考记者博客https://blog.csdn.net/hxx099/article/details/88974264 1,申请高德开放平台 ...

  2. python爬取高德poi数据_Python突破高德API限制完全爬取POI兴趣点数据

    一.背景 爬取POI数据,基本上是个老生常谈的话题了,现在市面上随处可见各路大神制作的获取POI数据的工具,但是当我将从高德地图中实际获取的POI数据与工具爬取的POI数据进行对比之后发现,市面上流行 ...

  3. PYTHON爬取高德地图POI

    PYTHON爬取高德地图POI 使用高德地图API爬取POI数据,首先需要申请高德地图API的KEY和获取<POI分类编码表>,本实例的最后结果是根据不同的poi类型分别生成多个EXCEL ...

  4. python爬取网易云音乐生成王力宏歌曲词云

    python爬取网易云音乐生成王力宏歌曲词云 # -*- coding:utf-8 -*- # 网易云音乐,通过歌手id生成词云 import requests import sys,re,os fr ...

  5. python爬取高德地图_爬虫实战:如何爬取高德地图?

    提起高德地图,咱们每一个人都不会陌生,高德地图是一款非常好用的地区服务软件,很多用户在出行的时候都会使用这款软件,日程用来导航,也可以用来打车,一次呼叫多种车型,用户可以在这里获得更好的服务,随时都可 ...

  6. Python爬取高德地图各城市天气

    Python爬取高德地图各城市天气 爬虫练习项目之一.从高德地图json数据接口获取天气.可以获取某省的所有城市天气.高德地图的这个接口还能获取县城的天气,我只写到了市.有兴趣的朋友可以尝试一下. 完 ...

  7. python爬高德地图_利用Python爬取高德地图数据

    准备1.高德开放平台注册账户 https://lbs.amap.com/dev/index 验证手机号码.邮箱后进入开发者后台创建一个应用: 并为该应用添加 Key,服务平台选择 web 服务 申请完 ...

  8. python爬取高德数据_利用Python爬取高德地图数据

    准备1.高德开放平台注册账户 https://lbs.amap.com/dev/index 验证手机号码.邮箱后进入开发者后台创建一个应用: 并为该应用添加 Key,服务平台选择 web 服务 申请完 ...

  9. python输入数据爬取_利用 Python 爬取高德地图数据

    准备1.高德开放平台注册账户 https://lbs.amap.com/dev/index 验证手机号码.邮箱后进入开发者后台创建一个应用: 并为该应用添加 Key,服务平台选择 web 服务 申请完 ...

最新文章

  1. servlet必知细节(三)-- DefaultServlet
  2. 移动对meta的定义
  3. 几种网络负载均衡方法比较
  4. mvc @html.textboxfor 添加正则表示式,如何在C#/ MVC 4中的Html.TextBoxFor中输入占位符文本...
  5. lambda表达式相关
  6. 敏捷开发免费管理工具——火星人预览之七:自定义字段
  7. Python写出一个字节,一个YouTube,我用Python怎么了!
  8. webservice和restful的区别
  9. 南阳理工oj 题目26 孪生素数问题 素数筛选法
  10. delphi 简单的发送字符串消息
  11. html5dragw3c,HTML5拖拽功能drag
  12. 分享两个线+标注的SLD样式
  13. c语言 tc 编译,用Win-TC编译与用TC2.0编译的差异
  14. struts2与jasperreport整合其余问题
  15. Win10 更改不了注册表,重启之后恢复原样
  16. 扫描至计算机功能被禁用,远程访问功能已禁用怎么办_允许远程界面控制被禁用的解决方法...
  17. 面试了15位来自985/211高校的2020届研究生之后的思考
  18. android density像素密度匹配规则
  19. 推荐系统常用数据集介绍
  20. 转载:挺住,意味着一切

热门文章

  1. 你真的做好面试细节了吗?
  2. 软件体系结构4+1模型
  3. [附源码]Python计算机毕业设计Django打印助手平台
  4. 项目38.2 打豆豆
  5. 阿里高层大调整:蒋凡被调离淘宝天猫!
  6. 【算法与数据结构】——后缀数组
  7. VisualFreeBasic调用超轻量级JSON解析器cJSON库
  8. java inflater_Deflater与Inflater的压缩与解压缩
  9. 【发现】国产007里面星爷挖子弹时看的电影~~~~
  10. 【白板动画制作软件】万彩手影大师教程 | 添加声音