需要的数据:
数据集笔记:geolife staypoint聚合的location 最近的10个其他location-CSDN博客的location数据
数据集笔记:处理北大POI 数据:保留北京POI-CSDN博客的北京POI数据
1 读取POI数据
python
import pandas as pd
dir1='D:/data/PKU POI/2018-POICSV-1'
gdf_bj=pd.read_csv(dir1+'/beijing_poi_in_five_ring.csv')
gdf_bj
2 poi类型提取
这边POI数据的类型是三级类型,我们逐级提取出来
python
try:
gdf_bj['type_lst_layer0']=pd.DataFrame(gdf_bj['type'].apply(lambda x:x.split(';')[0]))
gdf_bj['type_lst_layer1']=pd.DataFrame(gdf_bj['type'].apply(lambda x:x.split(';')[1]))
gdf_bj['type_lst_layer2']=pd.DataFrame(gdf_bj['type'].apply(lambda x:x.split(';')[2]))
except:
pass
gdf_bj
2.1 过滤不需要的POI类型
这个是自定义的,可要可不要
python
skip_poi=['道路附属设施','事件活动','摩托车服务','地名地址信息','汽车维修','通行设施','汽车销售','室内设施']
gdf_bj=gdf_bj[~gdf_bj['type_lst_layer0'].isin(skip_poi)]
gdf_bj
2.2 每种POI类型的数量
python
poi_type=set(gdf_bj['type_lst_layer0'].values.tolist())
poi_type
'''
{'交通设施服务',
'住宿服务',
'体育休闲服务',
'公共设施',
'公司企业',
'医疗保健服务',
'商务住宅',
'政府机构及社会团体',
'汽车服务',
'生活服务',
'科教文化服务',
'购物服务',
'金融保险服务',
'风景名胜',
'餐饮服务'}
'''
python
poi_num=dict()
for i in poi_type:
poi_num[i]=gdf_bj[gdf_bj['type_lst_layer0']==i].shape[0]
for i in poi_type:
print(i,' ',poi_num[i],' ',set(gdf_bj[gdf_bj['type_lst_layer0']==i]['type_lst_layer1'].values))
'''
风景名胜 11095 {'风景名胜', '风景名胜相关', '公园广场'}
公司企业 61176 {'公司', '公司企业', '知名企业', '工厂', '农林牧渔基地'}
金融保险服务 26527 {'保险公司', '金融保险服务机构', '自动提款机', '银行', '财务公司', '银行相关', '证券公司'}
科教文化服务 56953 {'科研机构', '科教文化场所', '传媒机构', '会展中心', '学校', '科技馆', '培训机构', '博物馆', '天文馆', '图书馆', '文艺团体', '文化宫', '展览馆', '档案馆', '驾校', '美术馆'}
体育休闲服务 24476 {'体育休闲服务场所', '休闲场所', '度假疗养场所', '高尔夫相关', '运动场馆', '影剧院', '娱乐场所'}
政府机构及社会团体 55626 {'外国机构', '交通车辆管理', '民主党派', '政府及社会团体相关', '公检法机构', '政府机关', '工商税务机构', '社会团体'}
商务住宅 38761 {'商务住宅相关', '住宅区', '产业园区', '楼宇'}
住宿服务 25879 {'旅馆招待所', '宾馆酒店', '住宿服务相关'}
汽车服务 12476 {'汽车服务相关', '加气站', '充电站', '加油站', '其它能源站', '汽车俱乐部', '汽车配件销售', '汽车救援', '汽车租赁', '洗车场', '汽车养护/装饰', '二手车交易'}
生活服务 78873 {'电力营业厅', '自来水营业厅', '洗浴推拿场所', '生活服务场所', '美容美发店', '婴儿服务场所', '丧葬设施', '邮局', '售票处', '中介机构', '物流速递', '摄影冲印店', '旅行社', '洗衣店', '信息咨询中心', '搬家公司', '事务所', '彩票彩券销售点', '维修站点', '电讯营业厅', '人才市场'}
医疗保健服务 20296 {'疾病预防机构', '急救中心', '专科医院', '诊所', '动物医疗场所', '医药保健销售店', '综合医院', '医疗保健服务场所'}
交通设施服务 81364 {'长途汽车站', '过境口岸', '交通服务相关', '班车站', '机场相关', '港口码头', '出租车', '停车场', '地铁站', '火车站', '公交车站'}
购物服务 135395 {'商场', '便民商店/便利店', '家居建材市场', '特色商业街', '购物相关场所', '综合市场', '个人用品/化妆品店', '特殊买卖场所', '文化用品店', '专卖店', '服装鞋帽皮具店', '花鸟鱼虫市场', '家电电子卖场', '体育用品店', '超级市场'}
餐饮服务 64958 {'外国餐厅', '甜品店', '冷饮店', '快餐厅', '中餐厅', '糕饼店', '餐饮相关场所', '咖啡厅', '休闲餐饮场所', '茶艺馆'}
公共设施 23300 {'报刊亭', '公用电话', '公共厕所', '紧急避难场所', '公共设施'}
'''
3 poi DataFrame转GeoDataFrame
python
import geopandas as gpd
from shapely import wkt
gdf_bj['geometry'] = gdf_bj['geometry'].apply(wkt.loads)
gdf_bj=gpd.GeoDataFrame(gdf_bj,geometry='geometry')
gdf_bj
4读取location数据
python
location=pd.read_csv(dir1+'/location_with_neighbor.csv')
location
4.1 location数据转GeoDataFrame
python
location['extent']=location['extent'].apply(wkt.loads)
location=gpd.GeoDataFrame(location,geometry='extent')
5 空间连接location和POI数据
python
gdf_bj_with_location = gpd.sjoin(gdf_bj, location, how="left", op='within')
gdf_bj_with_location
"left"
表示左连接,意味着结果中将包含左侧数据框(gdf_bj
)的所有记录,即使某些记录在右侧数据框(location
)中没有匹配的记录。op='within'
:这个参数定义了用于连接的地理关系操作。'within'
意味着函数会检查location
中的地理位置点是否位于gdf_bj
中定义的区域内部。
718931条数据
6 过滤未匹配到location的POI
python
gdf_bj_with_location_matched=gdf_bj_with_location[~gdf_bj_with_location['id'].isnull()]
gdf_bj_with_location_matched
还剩35378条POI
python
len(set(gdf_bj_with_location_matched['id'].values))
#806
#匹配到806个location,也就是说有100个左右的location是没有POI的
7 location添加表示各个poi数量的列
python
for i in poi_num.keys():
location[i]=0
location
7.1 每一个location 添加对应poi数量
python
for _,row in gdf_bj_with_location_matched.iterrows():
location.loc[int(row['id']),row['type_lst_layer0']]+=1
location
8 重命名中文列为对应的英文名称
python
location.rename(columns={
'风景名胜': 'Scenic Spots',
'公司企业': 'Companies and Enterprises',
'金融保险服务': 'Financial and Insurance Services',
'科教文化服务': 'Science, Education, and Cultural Services',
'体育休闲服务': 'Sports and Recreation Services',
'政府机构及社会团体': 'Government Agencies and Social Organizations',
'商务住宅': 'Commercial and Residential Areas',
'住宿服务': 'Accommodation Services',
'汽车服务': 'Automotive Services',
'生活服务': 'Daily Services',
'医疗保健服务': 'Medical and Health Services',
'交通设施服务': 'Transportation Services',
'购物服务': 'Shopping Services',
'餐饮服务': 'Dining Services',
'公共设施': 'Public Facilities'
}, inplace=True)
location