记录:
- 使用百度地图api进行各类兴趣点的划分
- 将研究区域利用arcgismap进行网格的划分和渔网经纬度范围的导出
- 将网格的范围与兴趣点坐标进行匹配与计算.
- 利用所获得的区域的兴趣点的频率进行方格区域功能的判定
百度地图提取兴趣点信息
首先,在百度地图开放平台获取百度地图JavaScript API.这部分可以参考这里
获取到百度地图的唯一服务密钥AK之后,根据百度地图的官方文档,
https://api.map.baidu.com/place/v2/suggestion?query=天安门®ion=北京&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.099151las = 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=餐饮店®ion=南京&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 = totalprint(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+1nums.append(num)
df = pd.DataFrame(nums)
df.to_csv(r'C:\Users\HP\Desktop\hope.csv')