使用Python获取高德POI数据,并使用MySQL建立本地空间数据库(一)

  • 关于高德POI
  • 高德地图搜索POI的接口
  • 抓取高德POI的思路
  • 高德POI抓取的Python实现

本方法仅供参考和学习交流使用,切勿用于商业用途

关于高德POI

在常用的互联网地图中,POI代表兴趣点,可以是楼宇、小区、商店、银行、学校等等,其提供的附带信息较为丰富,常有的有“地址”、“经纬度”、“POI类型”等。互联网地图强大的POI数据库,为互联网地图应用提供强大的使用空间。高德提供了千万级别的POI,通过POI搜索,可以完成找银行,找餐馆、找景点等等的功能,包含了关键字搜索、周边搜索、多边形搜索等等。这些功能依托于强大的数据库和空间数据引擎实现,本文将以高德POI为例,以Python为开发语言,以MySQL为数据库,阐述如何大范围获取详细的高德地图POI数据,并建立MySQL空间数据库,完成简单应用。

高德地图搜索POI的接口

高德地图的POI搜索依托于高德地图的搜索服务,搜索服务API是一类简单的HTTP接口,提供多种查询POI信息的能力,其中包括关键字搜索、周边搜索、多边形搜索、ID查询四种筛选机制。

  • 使用API前您需先申请Key,申请时选择web服务,将会获取用于搜索的key,具体内容详见高德开发文档。
  • 搜索API服务地址:https://restapi.amap.com/v3/place/text?parameters 请求方式为GET,parameters代表的参数包括必填参数和可选参数。所有参数均使用和号字符(&)进行分隔。
  • 例如:https://restapi.amap.com/v3/place/text?keywords=北京大学&city=beijing&output=xml&offset=20&page=1&key=<用户的key>&extensions=all 代表了一个完整的POI请求。
  • 关于接口的使用和参数的详细情况,请详见开发API文档。

抓取高德POI的思路

总体来讲,高德POI的搜索分为两类,第一种是按照城市和POI类型来检索,比如搜索北京市的购物类POI;另一种是按照区域(指定的矩形范围,按照经纬度坐标划分)和类型来检索。这两检索方式的选择直接决定了能否完整检索出想要的所有POI数据。
高德对搜索服务做了限制,无论指定多少个类型,每次请求最多返回1000个POI信息,若场景需要获取更可能多的POI;建议不要指定过多的类别,而是分多次请求从而得到更加准确的结果。
所以想要完整抓取POI数据,必须保证以下三个方面:

  • 按照指定区域来搜索
  • 保证每次搜索的数据返回量少于1000条
  • 搜索类型不要太多,建议单类型循环搜索

因此,POI检索核心是针对检索区域,构建若干个矩形格网,格网的构建没有具体要求,只要保证单个格网POI检索的数据量少于1000即可,主城区核心地带格网可以小一些,郊区或者山区等格网可以大一些。
本文采用ArcGIS构建了矩形格网,包括了整个下载区域。

如果觉得手动创建格网很麻烦,可以直接采用一个大的矩形,然后不断进行22的分割,递归进行,创建四叉树,保证最小分割格网的搜索返回数小于1000即可。具体实现这里不在赘述,我采用的是手动创建格网的方法,格网大小约2km2km。

高德POI抓取的Python实现

代码实现的基本思路是按照格网分割得到的矩形坐标,循环请求不同区域、不同类型的POI数据,然后进行合并处理。废话不说,上代码先

import xlrd # 读xlsx
import xlsxwriter # 写xlsx
import urllib.request # url请求,Python3自带
import os # 创建output文件夹
import glob # 获取文件夹下文件名称
import time # 记录时间
import json # 读取json格式文件def xlsx_merge(folder,header,filename):fileList = []for fileName in glob.glob(folder + "*.xlsx"):fileList.append(fileName)fileNum = len(fileList)matrix = [None] * fileNumfor i in range(fileNum):fileName = fileList[i]workBook = xlrd.open_workbook(fileName)try:sheet = workBook.sheet_by_index(0)except Exception as e:print(e)nRows = sheet.nrowsmatrix[i] = [0]*(nRows - 1)nCols = sheet.ncolsfor m in range(nRows - 1):matrix[i][m] = ["0"]* nColsfor j in range(1,nRows):for k in range(nCols):matrix[i][j-1][k] = sheet.cell(j,k).valuefileName = xlsxwriter.Workbook(folder + filename + ".xlsx")sheet = fileName.add_worksheet("merged")for i in range(len(header)):sheet.write(0,i,header[i])rowIndex = 1for fileIndex in range(fileNum):for j in range(len(matrix[fileIndex])):for colIndex in range (len(matrix[fileIndex][j])):sheet.write(rowIndex,colIndex,matrix[fileIndex][j][colIndex])rowIndex += 1print("已完成%d个文件的合并"%fileNum)fileName.close()# 本函数完成获取POI
def poi_by_adcode_poicode(folder,city_file = "polygon",poi_file = "poi",result_file = "result",merge_or_not = 1):key="这里输入你的key"count=0city_file = city_filepoi_file = poi_filemerge_or_not = merge_or_notheader_full = ["id","name","type","typecode","biz_type","address","location","tel","pname","cityname","adname","rating","cost"]header = ["id","name","type","typecode","biz_type","address","location","tel","pname","cityname","adname"]offset = 25 # 实例设置每页展示10条POI(官方限定25条)output_folder = folder + "output/"# 创建输出路径if os.path.isdir(output_folder):passelse:os.makedirs(output_folder)# 读取列表city_sheet =  xlrd.open_workbook(folder+ "input/" + city_file + ".xlsx").sheet_by_index(0)poi_type_sheet = xlrd.open_workbook(folder+ "input/" + poi_file + ".xlsx").sheet_by_index(0)city_list =city_sheet.col_values(0)city_code_list = city_sheet.col_values(1)upleftjd=city_sheet.col_values(1)upleftwd=city_sheet.col_values(2)rightbottomjd=city_sheet.col_values(3)rightbottomwd=city_sheet.col_values(4)jd = city_sheet.col_values(6)wd = city_sheet.col_values(7)poi_type_list = poi_type_sheet.col_values(1)poi_type_name=poi_type_sheet.col_values(0)result_file = result_file+str(poi_type_name[1])# 指示工作完成量total_work = (city_sheet.nrows - 1)  * (poi_type_sheet.nrows - 1)work_index = 1print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) + ":抓取开始!")for city_index in range(1,len(city_list)):for poi_type_index in range(1,len(poi_type_list)):workbook =xlsxwriter.Workbook(output_folder + str(city_list[city_index]) +"_"+ str(poi_type_list[poi_type_index])+"_"+ str(jd[city_index])+"_"+str(wd[city_index])+ ".xlsx") # 新建工作簿sheet = workbook.add_worksheet("result") # 新建“poiResult”的工作表for col_index in range(len(header_full)):sheet.write(0,col_index,header_full[col_index]) # 写表头row_index = 1for page_index in range(1, 101):try:#以下是请求POIurl = "http://restapi.amap.com/v3/place/polygon?types=" + str(poi_type_list[poi_type_index]) + "&polygon=" + str(round(upleftjd[city_index],6))+","+ str(round(upleftwd[city_index],6))+"|"+ str(round(rightbottomjd[city_index],6))+","+ str(round(rightbottomwd[city_index],6))+"&offset=" + str(offset) + "&page="+ str(page_index) +"&key="+str(key)+"&extensions=all&output=json"                   data = json.load(urllib.request.urlopen(url))["pois"]count=count+1for i in range(offset):for col_index in range(len(header)):sheet.write(row_index, col_index, str(data[i][header[col_index]]))sheet.write(row_index,len(header),str(data[i]["biz_ext"]["rating"]))sheet.write(row_index,len(header) + 1,str(data[i]["biz_ext"]["cost"]))row_index += 1 except:breakprint("已完成:" + str(poi_type_list[poi_type_index]))workbook.close()   print(str(city_list[city_index]) + " " + str(poi_type_list[poi_type_index] )+ " 已获取!进度:%.2f%%"  %(work_index / total_work *100))work_index += 1print( "所有地区各类别POI获取完毕")print("搜索次数:"+str(count))if merge_or_not == 1:xlsx_merge(output_folder, header_full, result_file)print("已对文件进行合并!")else:print("未进行合并!")print("所有工作完成!")poi_by_adcode_poicode("E:/poi/","中部", "poi中部", "中部", 1)

程序input:

  • 1、poi的格网划分文件
    在这里主要使用表格的第2、3、4、5列,分别标示了左上角和右下角的经纬度坐标,用来确定单个格网的位置。
  • 2、poi分类文件
    name表示搜索的poi类型,code代表了该类型的代码分类

    程序output:


代码部分的内容很简单,提供源码和相关输入格式的下载

本部分主要是如何抓取poi数据,下一篇将以poi数据为例,创建空间数据库,完成基本的数据操作和空间分析。

抓取高德POI数据,并使用MySQL建立本地空间数据库(一)相关推荐

  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. FME爬取高德POI数据

    参考https://blog.csdn.net/qq_28148071/article/details/85837919?utm_medium=distribute.pc_relevant.none- ...

  4. php curl_setopt抓取内容,PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)

    通过curl_setopt()函数可以方便快捷的抓取网页(采集很方便),curl_setopt 是php的一个扩展库 使用条件:需要在php.ini 中配置开启.(PHP 4 >= 4.0.2) ...

  5. Python爬虫:抓取多级页面数据

    前面讲解的爬虫案例都是单级页面数据抓取,但有些时候,只抓取一个单级页面是无法完成数据提取的.本节讲解如何使用爬虫抓取多级页面的数据. 在爬虫的过程中,多级页面抓取是经常遇见的.下面以抓取二级页面为例, ...

  6. FME爬取百度POI数据

    FME爬取百度POI数据 背景 学习准备 百度API接口学习 FME学习 思路 操作截图 结果展示 注意点 背景 百度提供了丰富的POI数据,有些场景下我们需要把这些数据放到内网环境下,这个时候就要想 ...

  7. Python爬虫+夜神模拟器+Fiddler抓取手机APP数据接口 -- 图文教程(霸霸看了都说好)

    Fiddler的抓包原理 Fiddler是强大的抓包工具,它的原理是以web代理服务器的形式进行工作的,使用的代理地址是:127.0.0.1,端口默认为8888,我们也可以通过设置进行修改. 代理就是 ...

  8. Java版 QQ空间自动登录无需拷贝cookie一天抓取30WQQ说说数据流程分析【转】

    Java版 QQ空间自动登录无需拷贝cookie一天抓取30WQQ说说数据&流程分析 QQ空间说说抓取难度比较大,花了一个星期才研究清楚! 代码请移步到GitHub GitHub地址:http ...

  9. 微信好友大揭秘,使用Python抓取朋友圈数据,通过人脸识别全面分析好友,一起看透你的“朋友圈”...

    微信:一个提供即时通讯服务的应用程序,更是一种生活方式,超过数十亿的使用者,越来越多的人选择使用它来沟通交流. 不知从何时起,我们的生活离不开微信,每天睁开眼的第一件事就是打开微信,关注着朋友圈里好友 ...

最新文章

  1. 【干货书】数据科学家统计学基础:R和Python实战
  2. PyQt5 技术篇-QComboBox下拉框绑定监听事件实例演示
  3. 事件 ID 3001错误的解决方法
  4. Abp vnext Web应用程序开发教程 8 —— 作者:应用程序层
  5. 零基础转行学习前端,需要学习哪些技术才可以找到工作吗?
  6. 字符串%百分号 和 format 格式化
  7. discard python_Python学习第三天
  8. html代码不安全,安全 – HTML编码是否会阻止各种XSS攻击?
  9. CondaHTTPError: HTTP 000 CONNECTION FAILED for url ...... 解决过程
  10. 常用开发软件下载网站集合
  11. Julia 终于正式发布了
  12. Vue中:error ‘XXXXX‘ is not defined no-undef解决办法
  13. moonseo小夜:作为一个seo伴随着技术的学习与提升
  14. 随机取样已死,蓄水池抽样称王
  15. 树莓派 可用于播放音频的三个软件
  16. 2021年度总结 | 葡萄城软件开发技术回顾(下)
  17. 今年9月开学!香港科技大学(广州)人工智能专业已开始招生!
  18. [转载] 全本张广泰——第十二回 广泰退贼寇 技惊哈大人
  19. C++新手入门学习教程
  20. div背景透明度动态改变的效果

热门文章

  1. $.ajax({});的各个参数的理解
  2. 804.唯一摩尔斯密码词
  3. 数据库----------唯一约束、默认约束、零填充约束
  4. c语言倍增算法,用倍增公式选股
  5. VMwareWorkstationPro16的下载与安装,以及vm账号注册的问题
  6. Bootstrap学习笔记——菜单、按钮及导航
  7. windows 文件在linux下运行显示no such file or directory
  8. AtCoder Regular Contest 084
  9. ip-guard产品功能介绍
  10. 一位算法工程师对自己工作的反思,写得挺实在的