数据来源:Map POI (Point of Interest) data - Official data of the contest (pku.edu.cn)
windows 下载方法:数据集笔记:windows系统下载北大开放数据研究平台的POI数据-CSDN博客
1 读取数据
1.1 列出所有的文件
dir1='D:/data/PKU POI/2018-POICSV-1'
dir2='D:/data/PKU POI/2018-POICSV-2'
dir3='D:/data/PKU POI/2018-POICSV-3'import pandas as pd
import osfile_lst1=os.listdir(dir1)
file_lst2=os.listdir(dir2)
file_lst3=os.listdir(dir3)
1.2 只读取cityname是北京的那些POI记录
for i in range(len(file_lst1)):try:tmp=pd.read_csv(dir1+'/'+file_lst1[i], encoding='gbk')df=pd.concat([df,tmp[tmp['cityname']=='北京市']])except:print(i)for i in range(len(file_lst2)):try:tmp=pd.read_csv(dir2+'/'+file_lst2[i], encoding='gbk')df=pd.concat([df,tmp[tmp['cityname']=='北京市']])except:print(i)for i in range(len(file_lst3)):try:tmp=pd.read_csv(dir3+'/'+file_lst3[i], encoding='gbk')df=pd.concat([df,tmp[tmp['cityname']=='北京市']])except:print(i)df
一共1233502行
2 筛选在五环内的记录
from shapely import Polygonfive_ring=Polygon([(116.549478,40.004123),(116.207786,40.004123),(116.207786,39.75835),(116.549478,39.75835)])
#假设五环是一个长方形,这是五环对角线两个顶点# 使用空间索引快速筛选在多边形内的点
sindex = gdf.sindex
'''
从GeoDataFrame gdf中生成一个空间索引
空间索引允许快速的空间查询,如确定某个点是否在特定区域内。
'''possible_matches_index = list(sindex.intersection(five_ring.bounds))
'''
five_ring.bounds 返回多边形的边界框(一个矩形,可以完全包含这个多边形)
sindex.intersection() 方法找出所有在这个边界框内的地理对象的索引
这一步不完全精确,因为它基于边界框而非多边形精确形状
【其实对于我们现在这个问题来说,因为五环已经简化成了长方形,这一步就够了】'''possible_matches = gdf.iloc[possible_matches_index]
'''
使用前一步获取的索引从gdf中选出可能在多边形内的地理对象,这些是possible_matches
'''precise_matches = possible_matches[possible_matches.intersects(five_ring)]
'''
进一步使用intersects方法筛选出真正与five_ring多边形相交的地理对象,这些是precise_matches
'''# 将结果添加到原始GeoDataFrame
gdf['is_in_five_ring'] = gdf.index.isin(precise_matches.index)gdf_bj=gdf[gdf['is_in_five_ring']==True]
gdf_bj
还剩887416条记录
3 提取有用的列
gdf_bj.columns
'''
Index(['address', 'adname', 'page_publish_time', 'adcode', 'pname', 'cityname','name', 'location', '_id', 'type', 'Unnamed: 10', 'geometry','is_in_five_ring'],dtype='object')
'''gdf_bj=gdf_bj[['address', 'adname', 'name', 'type', 'geometry']]
gdf_bj