Baidu_POI数据爬取与分析

1、百度POI数据爬取

1、网格大小尺寸相关知识

在这里插入图片描述

2、矩形区域POI检索

在这里插入图片描述
在这里插入图片描述

class localDiv():
    
    def __init__(self,loc,div):
        self.loc=loc
        self.div=div #网格划分的间隔
    #1、纬度划分    
    def lat_div(self):
        lat_sm=float(self.loc.split(',')[0]) 
        lat_ne=float(self.loc.split(',')[2])
        lat_list=[str(lat_ne)]
        while lat_ne-lat_sm>0:
            m=lat_ne-self.div
            lat_ne=lat_ne-self.div
            lat_list.append('%.2f'%m)
        return sorted(lat_list)
    
    #2 经度划分
    def lng_div(self):
        lng_sm=float(self.loc.split(',')[1])
        lng_ne=float(self.loc.split(',')[3])
        lng_list=[str(lng_ne)]
        while lng_ne-lng_sm>0:
            m=lng_ne-self.div
            lng_ne=lng_ne-self.div
            lng_list.append('%.2f'%m)
        return sorted(lng_list)
    
     #经纬度组合
    def ls_com(self):
        lat=self.lat_div()
        lng=self.lng_div()
        latlnglist=[]
        for i in range(len(lat)):
            a=lat[i]
            for j in range(len(lng)):
                b=lng[j]
                ab=a+','+b
                latlnglist.append(ab)
        return latlnglist
    
            
    def ls_REG(self):
        ##划分矩形网格
        lat=self.lat_div()
        lng=self.lng_div()
        latlnglist=self.ls_com()
        ls=[]
        for n in range(0,len(lat)-1):
            for i in range(len(lng)*n,len(lng)*(n+1)-1):
                coor_a=latlnglist[i]
                coor_b=latlnglist[i+len(lng)+1]
                coor=coor_a+','+coor_b
                ls.append(coor)
        return ls
if __name__=='__main__':
    
    loc=localDiv('39.05,114.98,39.15,115.15',0.02)
    lat=loc.lat_div()
    lng=loc.lat_div()
    ls=loc.ls_REG()
    print(ls)

3、百度POI数据下载

import pandas as pd
import numpy as np
import requests as re
import json
import time

#def get_jsondata(json_obj):
#    for item in url1_json['results']:
#        result={}
#        result["name"]=item["name"]
#        result["lat"]=item["location"]["lat"]
#        result["lng"]=item["location"]["lng"]
#        yield result  #生成器让我们一次执行一条记录
##        print(result)

class BaiduPOI(object):
    def __init__(self,query,loc):
        self.query=query #查询的地名
        self.loc=loc#查询的经纬度
    #获取数据的全部网页
    def get_url(self):
        urls=[]
        for i in range(20): #百度最多能下载20页
            url='http://api.map.baidu.com/place/v2/search?query='+self.query\
            +'&bounds='+self.loc+'&page_size=20&page_num='+str(i)+'&output=json&ak=mu49L02KGmvERpLIGQHEkmI9IAuHmKCH'
            urls.append(url)
        return urls
    #获取POI详情数据
    def get_data(self):
        urls=self.get_url()
        for i,url in enumerate(urls):
            #异常处理
            try:
                print(i,url)
                url=re.get(url).text #网页版的内容
                url_json=json.loads(url)#转换为可以识别的Json数据,数据是一个字典形式
                if url_json["total"] !=0:
                    for item in url_json['results']:
                        result={}
                        result["name"]=item["name"]
                        result["lat"]=item["location"]["lat"]
                        result["lng"]=item["location"]["lng"]
                        yield result  #生成器让我们一次执行一条记录
                else:
                    print("本页及以后无数据!")
                    break
            
            except:
                print("error")
                with open("log.txt",'a') as f:
                    f.write(url+'\n')
                        
if __name__=="__main__":
    poi=BaiduPOI("银行",'39.615,116.404,39.975,116.414')
    data=poi.get_data()
    print(pd.DataFrame(data))

4、按分块矩形区域下载数据


在这里插入图片描述

import pandas as pd
import numpy as np
import requests as re
import json
import time
#def get_jsondata(json_obj):
#    for item in url1_json['results']:
#        result={}
#        result["name"]=item["name"]
#        result["lat"]=item["location"]["lat"]
#        result["lng"]=item["location"]["lng"]
#        yield result  #生成器让我们一次执行一条记录
##        print(result)

class BaiduPOI(object):
    def __init__(self,query,loc):
        self.query=query
        self.loc=loc
    #获取数据的全部网页
    def get_url(self):
        urls=[]
        for i in range(20):
            url='http://api.map.baidu.com/place/v2/search?query='+self.query\
            +'&bounds='+self.loc+'&page_size=20&page_num='+str(i)+'&output=json&ak=mu49L02KGmvERpLIGQHEkmI9IAuHmKCH'
#            url='http://api.map.baidu.com/place/v2/search?query='+self.query\
#            +'&bounds='+self.loc+'&page_size=20&page_num='+str(i)+'&output=json&ak=LQ1CU3gi0FZZBQQl8LOIOOOYK4n3g654'
            urls.append(url)
        return urls
    #获取POI详情数据mu49L02KGmvERpLIGQHEkmI9IAuHmKCH
    def get_data(self):
        urls=self.get_url()
        for i,url in enumerate(urls):
            #异常处理
            try:
                print(i,url)
                url=re.get(url).text #网页版的内容
                url_json=json.loads(url)#转换为可以识别的Json数据,数据是一个字典形式
                if url_json["total"] !=0:
                    for item in url_json['results']:
                        result={}
                        result["sort1"]=item["id"]
                        result["sort2"]=item["v"]
                        result["name"]=item["name"]
                        result["name"]=item["name"]
                        result["lat"]=item["location"]["lat"]
                        result["lng"]=item["location"]["lng"]
                        yield result  #生成器让我们一次执行一条记录
                else:
                    print("本页及以后无数据!")
                    break
            except:
                print("error")
                with open("./log.txt",'a') as f1:
                    f1.write(url+'\n')

class localDiv():
    def __init__(self,loc,div):
        self.loc=loc
        self.div=div
        
    def lat_div(self):
        lat_sm=float(self.loc.split(',')[0])
        lat_ne=float(self.loc.split(',')[2])
        lat_list=[str(lat_ne)]
        while lat_ne-lat_sm>0:
            m=lat_ne-self.div
            lat_ne=lat_ne-self.div
            lat_list.append('%.2f'%m)
        return sorted(lat_list)
   
    def lng_div(self):
        lng_sm=float(self.loc.split(',')[1])
        lng_ne=float(self.loc.split(',')[3])
        lng_list=[str(lng_ne)]
        while lng_ne-lng_sm>0:
            m=lng_ne-self.div
            lng_ne=lng_ne-self.div
            lng_list.append('%.2f'%m)
        return sorted(lng_list)
    
     #经纬度组合
    def ls_com(self):
        lat=self.lat_div()
        lng=self.lng_div()
        latlnglist=[]
        for i in range(len(lat)):
            a=lat[i]
            for j in range(len(lng)):
                b=lng[j]
                ab=a+','+b
                latlnglist.append(ab)
        return latlnglist
    
            
    def ls_REG(self):
        ##划分矩形网格
        lat=self.lat_div()
        lng=self.lng_div()
        latlnglist=self.ls_com()
        ls=[]
        for n in range(0,len(lat)-1):
            for i in range(len(lng)*n,len(lng)*(n+1)-1):
                coor_a=latlnglist[i]
                coor_b=latlnglist[i+len(lng)+1]
                coor=coor_a+','+coor_b
                ls.append(coor)
        return ls
        

if __name__=='__main__':
    pois={"商业":["酒店","购物","金融"],
          "公共服务":["生活服务","丽人","运动健身","留学中介机构","培训机构","汽车销售",
                  "汽车维修","汽车美容","汽车配件","汽车租赁","汽车检测场"],
                  "行政机构":["政府机构"]
            }

    print("......开始爬取数据.....................")
    
    loc=localDiv('39.615,116.404,39.975,116.414',0.06)
#    loc=localDiv('31.61,118.46,32.29,119.24',0.02)
    loc_to_use=loc.ls_REG()
    print(loc_to_use)
    for id,vl in pois.items():
        print("爬取",id)
        file_name="Baidu_poi_{}.csv".format(id)
        print(file_name)
        for l in loc_to_use:
            for v in vl:
                poi_data=BaiduPOI(v,l)
                data=poi_data.get_data()
                data=pd.DataFrame(data)
                print(data)
                if len(data) !=0:
                    data.to_csv(file_name)
                else:
                    pass

5、坐标系转换

坐标转换模块
采用博客里面的bd09_to_wgs84(lng, lat) # 百度坐标系->WGS84坐标系

6、ArcGIS数据平台数据分析

6.1创建渔网,0.002像元大小,1度是111km,添加一个字段In_Check。

在这里插入图片描述

6.2 将渔网和poi进行空间连接

目标是渔网、源是POI,采用一对多。
在这里插入图片描述
在这里插入图片描述

6.3 属性表连接(相同的字段)

在这里插入图片描述

6.4 计算出来的每个渔网的熵

在这里插入图片描述

6.5 出租车司机的数据分析

在这里插入图片描述

利用arcgis中的工具xy to line工具,可以轻松实现径向流量图
ArcGIS10 XY To Line工具介绍与使用
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值