一、总体思路

1-利用arcgis创建渔网,商业网点稀疏用大矩形,商业网点密集用小矩形

2-求出矩形左下角和右上角坐标点,读取矩形表得到坐标串

maxX= !shape.extent.xmax!

minX= !shape.extent.xmin!

3-采用百度API矩形区域检索,发起GET请求,并解析json数据

4-本地存储到Excel

5-转为shp,gis可视化

二、代码实现

1、利用arcgis创建渔网,商业网点稀疏用大矩形,商业网点密集用小矩形

由于百度API限制,一个矩形范围内仅能下载400条记录(400个POI),为了减少请求次数,提高效率,对目标区域进行处理:商业网点稀疏用大矩形,商业网点密集用小矩形。这里利用ArcGIS渔网工具,最小网格为2KM*2KM。类似如下图:

2、求出矩形左下角和右上角坐标点,读取矩形表得到坐标串

1-新建左下角X,左下角Y,右上角X,右上角Y,bsm字段

2-利用arcmap字段计算器工具计算每个矩形的左下角和右上角坐标点,表达式为:

左下角X,Y:                  右上角X,Y:

minX= !shape.extent.xmin!            maxX= !shape.extent.xmax!

minY= !shape.extent.ymin!            maxY= !shape.extent.ymax!

3-代码读取坐标串

1 importpandas as pd2 def get_bounds(self,path,sheet_name): #1读取矩形表

3 bounds={}4 df = pd.read_excel(io = path, sheet_name=sheet_name)5 for index indf.index:6 bsm = df.at[index, 'bsm']7 ymin = df.at[index, '左下角Y']8 xmin = df.at[index, '左下角X']9 ymax = df.at[index, '右上角Y']10 xmax = df.at[index, '右上角X']11 coord = str(ymin) + ',' + str(xmin) + ',' + str(ymax) + ',' +str(xmax)12 bounds[bsm] = coord #一个标识码对应一个坐标串,方便后续查看每个矩形框下载完成情况

13 return bounds

3、采用矩形区域检索,发起GET请求,并解析json数据

4、本地存储到Excel

百度API文档示例:http://api.map.baidu.com/place/v2/search?query=银行&bounds=39.915,116.404,39.975,116.414&output=json&ak={您的密钥} //GET请求

百度POI分类:http://lbsyun.baidu.com/index.php?title=lbscloud/poitags

1 def get_poi(self,query,bound,bsm,path): #2发起请求

2 wb = openpyxl.load_workbook(path) #打开工作簿

3 ws1 = wb['POI'] #选取表单,为了写入POI信息

4 ws2 = wb['Summary'] #为了记录每个矩形框下载情况是否超400条记录,如果有超过,就得重新分成小矩形

5 for page_num in range(20): #请求页面循环,返回的poi是百度坐标需要坐标转换

6 print('正在爬取矩形框bsm为{0}的第{1}页数据...'.format(bsm,page_num+1))7 url = 'http://api.map.baidu.com/place/v2/search'

8 params ={9 'query': query, #示例,;分开

10 'bounds': bound, #1:检索矩形区域,多组坐标间以","分隔 # 38.76623,116.43213,39.54321,116.46773 lat,lng(左下角坐标),lat,lng(右上角坐标)

11 'output': 'json',12 'coord_type': '1', #1(wgs84ll即GPS经纬度) 表示输入的是wgs坐标

13 'page_size': '20',14 'page_num': page_num, #0代表第一页

15 'ak': '你的ak'

16 }17 #拿到一页详情

18 detail_page = requests.get(url=url,params=params,headers=self.headers).json()19 if len(detail_page['results']) == 0 and detail_page['status'] == 0: #判断如果请求页面没有数据,就爬取下一页

20 print('请求成功,但是没有记录,开始下一页爬取。')21 break

22 #解析

23 for dic_result in detail_page['results']:24 total = detail_page['total'] #后续查看爬取情况是否满400条记录

25 #基本信息,做判断相应的关键字中是否都有结果,没有赋值为‘’

26 if 'name' indic_result.keys():27 name = dic_result['name']28 else:29 name = ''

30 if 'location' indic_result.keys():31 lng, lat = cc.bd09_to_wgs84(dic_result['location']['lng'], dic_result['location']['lat']) #百度坐标转gps

32 else:33 lng, lat = '',''

34 if 'address' indic_result.keys():35 address = dic_result['address']36 else:37 address=''

38 #详情信息

39 #if dic_result['detail_info'].key():

40 #price = dic_result['detail_info']['price'] #均价

41 #overall_rating = dic_result['detail_info']['overall_rating'] #总体评分

42 #comment_num = dic_result['detail_info']['comment_num'] #评论数

43 #return [name,lng,lat,address,bsm],[bsm,total]

44 ws1.append([name,lng,lat,address,bsm])45 ws2.append([bsm,total])46 print('矩形框bsm为{0}的第{1}页数据下载成功!'.format(bsm,page_num+1))47 time.sleep(0.5) #防止访问过快,百度服务求拒绝请求

48 wb.save(path)49 print('-------矩形框bsm为{0}数据下载完成-------'.format(bsm))

5、GIS可视化

利用GIS的核密度工具,生成商业网点热力图。population字段为权重字段,不同商业网点不同的规模,这里不做设置,仅仅体现数量的密集度。也可以结合arcScene做3D效果。

    

附完整代码

这里没必要用类编程,只是现学现用了,直接函数式编程即可

12 importrequests,time,openpyxl,os13 importpandas as pd14 importcoordconversion as cc15 classBaiduSpider():16 def __init__(self):17 self.headers={18 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36'

19 }20

21 def get_bounds(self,path,sheet_name): #1读取矩形表

22 bounds={}23 df = pd.read_excel(io = path, sheet_name=sheet_name)24 for index indf.index:25 bsm = df.at[index, 'bsm']26 ymin = df.at[index, '左下角Y']27 xmin = df.at[index, '左下角X']28 ymax = df.at[index, '右上角Y']29 xmax = df.at[index, '右上角X']30 coord = str(ymin) + ',' + str(xmin) + ',' + str(ymax) + ',' +str(xmax)31 bounds[bsm] =coord32 returnbounds33

34 def get_poi(self,query,bound,bsm,path): #2发起请求

35 wb = openpyxl.load_workbook(path) #打开工作簿

36 ws1 = wb['POI'] #选取表单,为了写入POI信息

37 ws2 = wb['Summary'] #为了记录每个矩形框下载情况是否超400条记录,如果有超过,就得重新分成小矩形

38 for page_num in range(20): #请求页面循环,返回的poi是百度坐标需要坐标转换

39 print('正在爬取矩形框bsm为{0}的第{1}页数据...'.format(bsm,page_num+1))40 url = 'http://api.map.baidu.com/place/v2/search'

41 params ={42 'query': query, #示例,;分开

43 'bounds': bound, #1:检索矩形区域,多组坐标间以","分隔 # 38.76623,116.43213,39.54321,116.46773 lat,lng(左下角坐标),lat,lng(右上角坐标)

44 'output': 'json',45 'coord_type': '1', #1(wgs84ll即GPS经纬度) 表示输入的是wgs坐标

46 'page_size': '20',47 'page_num': page_num, #0代表第一页

48 'ak': '你的ak'

49 }50 #拿到一页详情

51 detail_page = requests.get(url=url,params=params,headers=self.headers).json()52 if len(detail_page['results']) == 0 and detail_page['status'] == 0: #判断如果请求页面没有数据,就爬取下一页

53 print('请求成功,但是没有记录,开始下一页爬取。')54 break

55 #解析

56 for dic_result in detail_page['results']:57 total = detail_page['total'] #后续查看爬取情况是否满400条记录

58 #基本信息,做判断相应的关键字中是否都有结果,没有赋值为‘’

59 if 'name' indic_result.keys():60 name = dic_result['name']61 else:62 name = ''

63 if 'location' indic_result.keys():64 lng, lat = cc.bd09_to_wgs84(dic_result['location']['lng'], dic_result['location']['lat']) #百度坐标转gps

65 else:66 lng, lat = '',''

67 if 'address' indic_result.keys():68 address = dic_result['address']69 else:70 address=''

71 #详情信息

72 #if dic_result['detail_info'].key():

73 #price = dic_result['detail_info']['price'] #均价

74 #overall_rating = dic_result['detail_info']['overall_rating'] #总体评分

75 #comment_num = dic_result['detail_info']['comment_num'] #评论数

76 #return [name,lng,lat,address,bsm],[bsm,total]

77 ws1.append([name,lng,lat,address,bsm])78 ws2.append([bsm,total])79 print('矩形框bsm为{0}的第{1}页数据下载成功!'.format(bsm,page_num+1))80 time.sleep(0.5) #防止访问过快,百度服务求拒绝请求

81 wb.save(path)82 print('-------矩形框bsm为{0}数据下载完成-------'.format(bsm))83

84 def creat_excel(self,path): #写

85 if notos.path.exists(path):86 wb = openpyxl.Workbook() #创建工作簿

87 ws1=wb.create_sheet('POI') #新增一个POI表单

88 ws1.append(['name', 'lng', 'lat', 'address', 'bsm'])89 ws2=wb.create_sheet('Summary') #新增一个汇总表单

90 ws2.append(['bsm','total'])91 wb.save(path) #保存

92

93 if __name__=='__main__':94 query = '休闲娱乐'

95 bs =BaiduSpider()96 bs.creat_excel(path = query + '商业网点POI.xlsx')97 bounds=bs.get_bounds(path = r'F:\商业网点规划\矩形表.xlsx', sheet_name = 'Sheet1') #读取矩形表

98 for bsm, bound in bounds.items(): #矩形框循环,bsm用于记录哪些矩形框已经爬取过了

99 bs.get_poi(query = query,bound = bound,bsm = bsm,path = query + '商业网点POI.xlsx')100 #print(bsm,bound)

101 print('---------------程序结束!--------------')

arcgis与python的结合_结合GIS与Python,爬取百度商业POI相关推荐

  1. Python爬虫:运用多线程、IP代理模块爬取百度图片上小姐姐的图片

    Python爬虫:运用多线程.IP代理模块爬取百度图片上小姐姐的图片 1.爬取输入类型的图片数量(用于给用户提示) 使用过百度图片的读者会发现,在搜索栏上输入关键词之后,会显示出搜索的结果,小编想大多 ...

  2. python爬取地图地址_Python爬取百度地图poi数据 !

    锵锵锵,我来啦.10天过的好快呀,4月份都已经过了三分之一,我的体重还居高不下,qwq.今天给大家分享python爬取百度地图小区的数据,希望大家看后,可以尝试自己编写爬取自己所在市的中学,公园,银行 ...

  3. arcgis公里坐标转经纬度_高德api交通态势爬取及可视化利用 python+arcgis

    近日做项目,有一部分要分析研究范围内的交通运行情况.传统的方法是要去现场调研数车,通过交通量和道路通行能力来计算道路的服务水平.但是因为疫情原因,不想外出,想要利用其它方法来获得区域的交通运行水平.首 ...

  4. python 游戏大作_使用requests和beautifulsoup爬取3DM单机大作排行榜

    支持正版,从我做起! 最近发售的游戏不少,刚好又在学习爬虫,于是就灵光一闪去3DM爬了个单机大作排行榜TOP200,过程代码结果如下. 首先,我们需要知道我们要爬取哪些信息,看到排行榜里的游戏项可以确 ...

  5. python入门爬虫之爬取百度首页的热搜榜

    博主的公众号:Java4y <<<<<<<<< 一个努力提高工作效率(增加摸鱼时间)的小白博主 >>>>>>& ...

  6. Python之爬取百度地图兴趣点(POI)数据

    关于爬虫系列,前三篇文章分别讲了三个简单案例,分别爬取了<你好,李焕英>电影豆瓣热门短评.58同城在售楼盘房源信息以及安居客网二手房小区详情页数据.通过前三个案例,相信大家都对爬虫有了简单 ...

  7. python编程基础_月隐学python第2课

    python编程基础_月隐学python第2课 学习目标 掌握变量的输入和输出 掌握数据类型的基本概念 掌握算数运算 1.变量的输入和输出 1.1 变量输入 使用input输入 input用于输入数据 ...

  8. 查看Python的版本_查看当前安装Python的版本

    一.查看Python的版本_查看当前安装Python的版本 具体方法: 首先按[win+r]组合键打开运行: 然后输入cmd,点击[确定]: 最后执行[python --version]命令即可. 特 ...

  9. python 百度百科 爬虫_爬虫爬取百度百科数据

    以前段时间<青春有你2>为例,我们使用Python来爬取百度百科中<青春有你2>所有参赛选手的信息. 什么是爬虫? 为了获取大量的互联网数据,我们自然想到使用爬虫代替我们完成这 ...

最新文章

  1. python 串口上位机_如何使用Python开发串口通讯上位机(二)
  2. 算法基础:常用的排序算法知识笔记
  3. JavaOne 2014 –有关提交的一些初步分析
  4. invalid use of incomplete type struct 或者是class的解决办法
  5. django-关闭调试模式-保护网站安全
  6. sql server 2005技术大全_3年2.16~3.2万吨!上机数控子公司与新疆大全签订多晶硅采购长单...
  7. 直连AIX服务器,对接AIX链路问题
  8. 如何理解java抽象类,我是如何理解Java抽象类和接口的
  9. php禁止外部域名请求,php-阻止来自其他域的请求
  10. springboot+pageoffice实现Word在线编辑
  11. 如何控制局域网网速_无线路由器如何限制局域网网速 无线路由器限制局域网网速方法【介绍】...
  12. QQ空间快速登录地址
  13. Linux系统安装,教你安装一个属于自己的Linux系统
  14. Interface接口自动化登录图文验证码问题的解决办法
  15. 博客导航——一站式搜索(所有博客的汇总帖)
  16. mysql修改列明sql语句_sqlserver 修改列名及表名的sql语句
  17. web前端入门到实战:web前端开发好学吗?
  18. 日记侠:普通人如何玩转精准引流?
  19. 基于sklearn实现LDA主题模型(附实战案例)
  20. tommy_guolin JavaFX 2 初探----Eclipse下运行Ensemble程序

热门文章

  1. 大学毕业后,留在北京的人,要坚强!
  2. 上百件 Cocos 周边好礼,五一 7 天送!送!送!
  3. python制作表格处理_使用python处理excel表格——pandas(1)
  4. Python之生成器表达式
  5. unity键盘手柄控制
  6. taro-dva-template 集成dvajs数据管理框架的taro小程序模板,即拿即用,提高开发效率
  7. 如何选择黑盒测试工具
  8. jor oracle,[整理]sql语句一些实用技巧for oracle
  9. 米奇之家网站正式开张营业了
  10. python3小项目2-基于autopy的游戏脚本