利用百度地图进行城市功能区域划分

  • Post author:
  • Post category:其他

记录:

  • 使用百度地图api进行各类兴趣点的划分
  • 将研究区域利用arcgismap进行网格的划分和渔网经纬度范围的导出
  • 将网格的范围与兴趣点坐标进行匹配与计算.
  • 利用所获得的区域的兴趣点的频率进行方格区域功能的判定

百度地图提取兴趣点信息

首先,在百度地图开放平台获取百度地图JavaScript API.这部分可以参考这里

获取到百度地图的唯一服务密钥AK之后,根据百度地图的官方文档,

https://api.map.baidu.com/place/v2/suggestion?query=天安门&region=北京&city_limit=true&output=json&ak=你的ak 

下面是部分参数的解释与属性值:

参数 格式 备注
query 超市 搜索兴趣点的关键词
region 南京 地区范围
coord_type WGS84 采用的坐标的类型
ak E4805d16**********707cdc962045 开发者访问密钥

下面是使用返回的json文件来获取的自动化脚本

import sys
import requests  #导入requests库,这是一个第三方库,把网页上的内容爬下来用的
import time
ty=sys.getfilesystemencoding()  #这个可以获取文件系统的编码形式
 
## 1. 基本参数设置:
 
lat_1 = 32.010402 # 南京市左下纬度118.711692,32.010402
lon_1 = 118.711692 # 南京市左下经度
lat_2 = 32.099151 # 南京市右上纬度
lon_2 = 118.834149 # 南京市右上经度118.834149,32.099151
 
las = 0.01  # 爬取时划分网格的经纬度间隔
ak='yourak' # 根据自己在百度地图注册平台上申请的AK
place = r'公园' # 爬取的POI类型,可以是学校、政府、超市、商场、小区、餐饮店等等,这里以政府为例
 
 

## 2. POI区域划分,按照经纬度间隔0.01度,将不同URL存入一个列表中
 
print ('*******************{}POI开始获取****************'.format(place))
urls=[] #声明一个数组列表
lat_count=int((lat_2-lat_1)/las+1)
lon_count=int((lon_2-lon_1)/las+1)
for lat_c in range(0,lat_count):
    for lon_c in range(0,lon_count):
        for i in range(0,20):
            page_num=str(i)
            url = 'https://api.map.baidu.com/place/v2/search?query=餐饮店&region=南京&page_size=20&page_num='+str(page_num)+'&output=json&ak=yourak'
            urls.append(url)
print ('url列表读取完成')
 
 
## 3. 为了方便看结果,这里设置了些参数
 
total_before = 0 
total = 0 # 获取总条数
label = 0 # 查看是否获取到数据的标志
count_20 = 0 # 查看每页超过20条的页数
K = 0 # 运行出错的断点数,代表第多少次循环
 
urls = urls[K:] # 防止出现意外,比如在百度地图获取的数据达到上限,就会终止服务,这里的K主要是为了从当前断点处继续爬取,所以需要根据自己程序终止断点设置;
count_xunhuan = len(urls) # 循环次数
count_xunhuan2 = count_xunhuan # 还剩循环次数,主要让自己知道大概有多少循环,每次都打印下,对程序运行时间有个大致了解;
 
 
# 4. 创建文件以及将爬取到的数据读入文件
 
f=open(r'C:\Users\HP\Desktop\result6.csv','a',encoding='gbk') # 根据爬取的POI类型创建文件
print("+++++++++++爬取需循环{}次++++++++++++".format(count_xunhuan))
for url in urls:
    time.sleep(1) # 为了防止并发量报警,设置了一个10秒的休眠。认证后就不需要了
    html = requests.get(url) # 获取网页信息
    data = html.json() # 获取网页信息的json格式数据
    total_before = total
    print(data)
    for item in data['results']: 
        jname = item['name'] # 获取名称
        jlat = item['location']['lat'] # 获取纬度
        jlon = item['location']['lng'] # 获取经度
        jadd = item['address'] # 获取详细地址
        jarea = item['area'] # 获取所在区或县
        j_str = jname + ',' + str(jlat) + ',' + str(jlon) + ',' + jadd + ',' + jarea + '\n' # 以逗号格式,将数据存入一个字符串
        print(j_str)
        f.write(j_str) # 将数据以行的形式写入CSV文件中
        total = total + 1 # 获取的数据记录数
        label = 1 # 表示每个小网格是否爬取到数据,如果为1,则表示获取到数据,执行下面的if语句,如果为0,则表示没有获取到数据;
    count_xunhuan2 = count_xunhuan2 - 1 # 循环次数减一,方便查看了解循环进度
    if label == 1:
        print("需循环{}次, 已循环{}次, 还剩{}次循环结束".format(count_xunhuan, count_xunhuan-count_xunhuan2, count_xunhuan2))
        print('新增{}条数据'.format(total-total_before))
        if total-total_before == 20:
                count_20 = count_20 + 1 # 查看获取到20条数据的页数,因为百度地图限制每页获取20条数据,如果该网格区域超过的话,也是爬取到20条,所以这里设置count_20查看下没有爬取完整的网格数,如果过多,则最好修改las经纬度间隔;
        print("---------已获取{}条数据----------".format(total))
    label = 0
print("每页新增超过20条的页数:{}".format(count_20))
f.close()

利用arcgis进行区域的方格划分

地图要素的采集,使用bbbike的OpenStreet Map划分地图范围,提取范围内的土地利用数据.
使用折线划分所要研究的区域的范围,进行区域的划分,这里使用渔网的功能参考这篇博文

获取的网格经纬度范围与兴趣点坐标进行匹配计算

利用区域划分方格的经纬度范围比较获取的兴趣点的范围,进行区域的功能判定,这里使用的标准是:

注意兴趣点与方格的坐标系相统一.百度api获取的是WGSA-84坐标系.

论文出处见下方
出自:基于空间格网的城市功能区定量识别_骆少华.
使用的自动化脚本如下:

# Package
import numpy as np
import pandas as pd
import csv
Div = pd.read_csv(r'C:\Users\HP\Desktop\grid.csv',encoding='gbk')
Data = pd.read_csv(r'C:\Users\HP\Desktop\result1.csv',encoding='gbk')# Defineing
x_max = Div['Longitude_min']
x_min = Div['Longitude_max']
y_up = Div['Latitude_up']
y_down = Div['Latitude_down']
x = Data['WGS_long']
y = Data['WGS_lat']
# main
num=0
nums=[]
for i in range(420):
    for j in range(3948):
        df = (x[j]>x_min[i])&(x[j]<x_max[i])&(y[j]>y_down[i])&(y[j]<y_up[i])
        if df == True:
            num = num+1
    nums.append(num)
df = pd.DataFrame(nums)
df.to_csv(r'C:\Users\HP\Desktop\hope.csv')

版权声明:本文为lan4_原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。