面对这样的需求
从下面地址详情中提取其所在行政区域(省、市、县/区 ),切分为右边表格的形式。
地址详情 | 映射后地址信息 | |||
详细地址 | 省 | 市 | 县/区 | 详细地址 |
平罗县御景安家25-1-102 | 宁夏回族自治区 | 石嘴山市 | 平罗县 | 御景安家25-1-102 |
达州渠县渠江镇珠山村一组57号 | 四川省 | 达州市 | 渠县 | 渠江镇珠山村一组57号 |
兴庆区在水一方C区5-3-101 | 宁夏回族自治区 | 银川市 | 兴庆区 | 在水一方C区5-3-101 |
成都市武侯区佳灵路九峰家园2栋 | 四川省 | 成都市 | 武侯区 | 佳灵路九峰家园2栋 |
大田县集美路21号 | 福建省 | 三明市 | 大田县 | 集美路21号 |
邢台桥东区高开东汪镇西静庵村 | 河北省 | 邢台市 | 桥东区 | 高开东汪镇西静庵村 |
方法一
pip install cpca
原理是通过jieba工具先对详细地址做分词,再将结果分段对比行政地区域地址库,代码如下:
import cpca
area_str = ["平罗县御景安家25-1-102"]
df_str = cpca.transform(area_str )
df_str
结果展示:
省 | 市 | 区 | 地址 |
宁夏回族自治区 | 石嘴山市 | 平罗县 | 御景安家25-1-102 |
经纬度解析
cpca.latlng 以字典的形式将全国的行政区域经纬度保存(如下图:)
我们直接从该字典中查询行政区域对应的经纬度即可(如下:)
cpca.latlng['北京市', '北京市', '西城区']
结果:('39.93428014370851', '116.37319010401802')
另一种类似的方法也可以解析地址经纬度(如下:)
方法二
pip install chinese_province_city_area_mapper
原理与方法相似,但在使用过程要比方法一更上手,很多拼写不全的地址用方法二都可以映射正确的省市县。实验以下地址的时候使用方法一解析失败,使用方法二解析成功,如下:
from chinese_province_city_area_mapper.transformer import CPCATransformer
Ca = CPCATransformer()
Ca.transform(['湖南省株洲县朱亭镇水口村跃进组12号',
'青海省海东地区乐都县高庙镇白崖子村42号',
'湖南省株洲县渌口镇凯裕名城B栋4单元301
'])
使用chinese_province_city_area_mapper解析结果:
使用cpca解析结果:
只有市级和市级以下的行政区域存在重名的情况,例如中国有很多城市的区叫“朝阳区” ,如果详细地址中没有别的地址描述的话系统是不知道应该映射到哪个“朝阳区”,所以我们需要为一些市区指定默认所属省。
有两种方式指定默认值:
# 方法一:直接通过 CPCATransformer 指定
cpca = CPCATransformer({"朝阳区":"北京市"})
df = cpca.transform(location_str)
# 方法二:通过内置模块 umap 调用默认地址字典
from chinese_province_city_area_mapper import myumap
cpca = CPCATransformer(myumap.umap)
df = cpca.transform(location_str)
打印myumap.umap ,结果如下 :
{'南关区': '长春市', '南山区': '深圳市', '宝山区': '上海市', '市辖区': '东莞市',
'普陀区': '上海市', '朝阳区': '北京市', '河东区': '天津市', '白云区': '广州市',
'西湖区': '杭州市', '铁西区': '沈阳市'}
对经纬度的解析结果大体相当,代码如下:
from chinese_province_city_area_mapper.infrastructure import SuperMap
SuperMap.lat_lon_mapper.get("北京市,北京市,朝阳区")
结果:(39.92, 116.43)
绘图功能,两行代码完成:
# 绘制城市热力地图
from chinese_province_city_area_mapper import drawers
drawers.draw_locations(DF, "df.html")
chinese_province_city_area_mapper 模块还有其他功能模块,例如 SuperMap模块简要介绍如下:
from chinese_province_city_area_mapper.infrastructure import SuperMap
#地区到市的映射数据库,是一个字典类型(key为区名,value为其所属的市名),注意其中包含重复的区名
SuperMap.area_city_mapper
#重复的区名列表,列表类型,如果区名在这个列表中,则area_city_mapper的映射是不准确的
SuperMap.rep_areas
#市到省的映射数据库,字典类型(key为市的名称,value为省的名称)
SuperMap.city_province_mapper
#全国省市区的经纬度数据库,字典类型(key为"省,市,区",value为(维度,经度))
SuperMap.lat_lon_mapper
#获取北京市朝阳区的经纬度
SuperMap.lat_lon_mapper.get("北京市,北京市,朝阳区")