添加行政代码,pyecharts点击省地图,下钻到该省并且显示数据
1.pyecharts点击省地图,下钻到该省并且显示数据
容易出现的问题:
1.那就是数据怎么放到图中辣。。摸索挺久的。
2.特别注意在放数据到地图中的时候,数值记得转化,卡好久没出数据就是以为没有强制转为数字类型入转为int(xxxx)
3.给地图放入数据规范为北京市,天津市,广东省,香港特别行政区
4.在生成全国的各个省份地图的时候,规范为北京,天津,广东,香港,不要加省市特别行政区自治区等后缀
5.各个省份地图代码里的列表数据是类似于 [ ['东丽区', 3], ['滨海新区', 2], ['红桥区', 2], ['宝坻区', 1], ['西青区', 1], ['保定市', 2], ['沧州市', 1], ['石家庄市', 1]]
这里面对于北京市、天津市、重庆市、上海市,是直接取到区,而对于广东省、河北省等是取到区(其他的入自治区、特别行政区我没测试)
这样子取就会出现一个问题,如果重名了他改分到哪个省中(我没解决)
6.最后附上添加行政区相关代码。
代码:
import pandas as pd import re from pyecharts import options as opts from pyecharts.charts import Geo, Map from pyecharts.globals import ChartType, SymbolType, CurrentConfig, ThemeType, GeoType # CurrentConfig.ONLINE_HOST = 'C:/python/pyecharts-assets-master/assets/' # pandas读取csv文件数据 # 全国 province = ["黑龙江省", "吉林省", "辽宁省", "河北省", "甘肃省", "青海省", "陕西省", "河南省", "山东省", "山西省", "安徽省", "湖北省", "湖南省", "江苏省", "四川省", "贵州省", "云南省", "浙江省", "江西省", "广东省", "福建省", "台湾省", "海南省", "新疆维吾尔自治区", "内蒙古自治区", "宁夏回族自治区", "广西壮族自治区", "西藏自治区", "北京市", "上海市", "天津市", "重庆市", "香港特别行政区", "澳门特别行政区", ] province_sta = [] # 去除后缀 df = pd.read_csv('alllistrs.txt', encoding='utf-8') pro = df['pro'] # 省 pro_sta = [] # 去除省、自治区、市等 shi = df['shi'] # 市 city = df['city'] # 县 hao = df['hao'] # 编号 # pro_sta = list(set(pro_sta)) # 对省去重 for i in province: # 设置要替换的字符 i = re.sub('省|市|自治区|壮族自治区|回族自治区|维吾尔自治区|特别行政区', '', i) # print(i) province_sta.append(i) print(province_sta) # 按省归类 pro_df = pd.DataFrame(pro) pro_count = pro_df.value_counts() pro_num = [] # province_list = [list(z) for z in zip(pro_count.index, pro_count.values)] for i in range(len(pro_count)): pro_num.append([pro_count.index[i][0], int(pro_count.values[i])]) print('pro_num: ', pro_num) # 注意不要漏掉强制转化为int df3 = [list(z) for z in zip(pro, shi,city)] df3 = pd.DataFrame(df3) df3_pro = df3.groupby(0).value_counts() dd = [] for i in range(len(df3_pro)): if df3_pro.index[i][1]=='北京市' or df3_pro.index[i][1]=='天津市' or df3_pro.index[i][1]=='上海市' or df3_pro.index[i][1]=='重庆市': dd.append([df3_pro.index[i][2], int(df3_pro.values[i])]) else: dd.append([df3_pro.index[i][1], int(df3_pro.values[i])]) print(dd) # 生成省地图,如江苏,北京,天津,河北,西藏(不加省/自治区) for i in province_sta: province_city = ( Map(init_opts=opts.InitOpts(width="1500px", height="800px", theme=ThemeType.VINTAGE)) .add("", dd, # 可以自己写一个字典写各个省份下的市所对应的数据,在这里只是一个range() i) .set_global_opts( title_opts=opts.TitleOpts(title=i + "地图"), visualmap_opts=opts.VisualMapOpts( min_=1, max_=17, is_piecewise=True ) ) .render(path=i + "地图.html") ) CHN = ( Map(init_opts=opts.InitOpts(width="1000px", height="600px")) # 可切换主题 .set_global_opts( title_opts=opts.TitleOpts(title="--全国项目数量分布--"), visualmap_opts=opts.VisualMapOpts( min_=0, max_=100, range_text=['项目数量区间:', ''], # 分区间 is_piecewise=True, # 定义图例为分段型,默认为连续的图例 pos_top="middle", # 分段位置 pos_left="left", orient="vertical", split_number=10 # 分成10个区间 ) ) .add("*全国项目数量分布*", pro_num, maptype="china") .render("全国项目数量分布.html") )
运行完后,找到全国项目数量分布.html,然后在<script></script>里面的最后(是最后,别放在前面会出不来)加上下面的代码,实现跳转到省地图
注意这里的 chart_后面的一大串要换成自己的全国项目数量分布.html中的<div id="">中的id
chart_f69b1139c1b64696b45586c92b5f4dc5.on('click', function (param){ var selected = param.name; if (selected) { switch(selected){ case '北京市': location.href = "./北京地图.html"; break; case '上海市': location.href = "./上海地图.html"; break; case '天津市': location.href = "./天津地图.html"; break; case '四川省': location.href = "./四川地图.html"; break; case '安徽省': location.href = "./安徽地图.html"; break; case '山东省': location.href = "./山东地图.html"; break; case '江苏省': location.href = "./江苏地图.html"; break; case '江西省': location.href = "./江西地图.html"; break; case '河北省': location.href = "./河北地图.html"; break; case '浙江省': location.href = "./浙江地图.html"; break; case '海南省': location.href = "./海南地图.html"; break; case '湖北省': location.href = "./湖北地图.html"; break; case '湖南省': location.href = "./湖南地图.html"; break; case '广东省': location.href = "./广东地图.html"; break; case '福建省': location.href = "./福建地图.html"; break; case '甘肃省': location.href = "./甘肃地图.html"; break; case '广西壮族自治区': location.href = "./广西地图.html"; break; case '贵州省': location.href = "./贵州地图.html"; break; case '河南省': location.href = "./河南地图.html"; break; case '黑龙江省': location.href = "./黑龙江地图.html"; break; case '内蒙古自治区': location.href = "./内蒙古地图.html"; break; case '吉林省': location.href = "./吉林地图.html"; break; case '辽宁省': location.href = "./辽宁地图.html"; break; case '宁夏回族自治区': location.href = "./宁夏地图.html"; break; case '青海省': location.href = "./青海地图.html"; break; case '山西省': location.href = "./山西地图.html"; break; case '陕西省': location.href = "./陕西地图.html"; break; case '台湾省': location.href = "./台湾地图.html"; break; case '西藏自治区': location.href = "./西藏地图.html"; break; case '新疆维吾尔自治区': location.href = "./新疆地图.html"; break; case '云南省': location.href = "./云南地图.html"; break; case '重庆市': location.href = "./重庆地图.html"; break; case '香港特别行政区': location.href = "./香港地图.html"; case '澳门特别行政区': location.href = "./澳门地图.html"; default: break; } } });
运行结果(地图大小不太美观,可以自行调整一下):
添加规范行政区以及行政编号代码:
只取了160条数据左右
# -*- coding: utf-8 -*- """ 整合test1test2应用于原始的大量数据 给地址添加行政编码 """ import codecs import requests """ 抽取地址,调用接口查看该地址属于哪个省市区 """ # 1.获取需要的地址数据 f = codecs.open('t1_test_test.txt', mode='r', encoding='utf-8') lines = f.readlines() lines = lines[:165] # lines = lines[:3] list = [] lnglist = [] # 经度 latlist = [] # 维度 addlist = [] # 标准地址格式省市区 alllist=[] # 将标准地址省市区组合在一起 codelist=[] # 存储行政编码 for line in lines: print(line.strip().split("|")[15]) list.append(line.strip().split("|")[15]) print(list[0]) # list=lines['16'].values.tolist() # print(list) # 2.调用百度api实现提取地点的经纬度 def getJingWei(address): url = "https://api.map.baidu.com/geocoding/v3" params = { "address": address, "output": "json", "ak": "你自己的ak密钥", } response = requests.get(url=url, params=params) result = response.json() status=result['status'] if(status!=0): addlist.append("") codelist.append("") lnglist.append("") latlist.append("") alllist.append("") else: lnglist.append(result['result']['location']['lng']) # 经度 latlist.append(result['result']['location']['lat']) # 纬度 # 3.通过经纬度获取地址信息(省市区) def getAddress(lng, lat): # response = requests.get('https://api.map.baidu.com/reverse_geocoding/v3/?ak=你自己的ak密钥&output=json&coordtype=wgs84ll&location='+str(lat)+','+str(lng)) response = requests.get('https://api.map.baidu.com/reverse_geocoding/v3/?ak=你自己的ak密钥&output=json&coordtype=wgs84ll&location='+str(lat)+','+str(lng)) # if response: # print(response.json()) result = response.json() # print(result) addlist.append(result['result']['formatted_address']) alllist.append(result['result']['addressComponent']['province']+','+result['result']['addressComponent']['city']+','+result['result']['addressComponent']['district']+','+result['result']['addressComponent']['adcode']) codelist.append(result['result']['addressComponent']['adcode']) # 测试 for i in range(len(list)): # print(len(list[i])) # 注意不能写成list[i]==""或者len(list[i])==0,通过上一条代码可以看见长度为2. print(list[i]) # getJingWei(list[i]) try: getJingWei(list[i]) except Exception: print("-----------------------异常---------------------") # 先判断一下地址编码是否成功,成功在进行下一步:获取完整的地址信息 if (len(addlist)<i+1): getAddress(lnglist[i],latlist[i]) # print("=====",addlist[i]) file_write = codecs.open('result.txt',mode='w',encoding='utf-8') # 以可写模式打开该文件 file2_write = codecs.open('alllistrs.txt',mode='w',encoding='utf-8') # 以可写模式打开该文件 file2_write.write('pro,shi,city,hao\r\n') i=0 for line in lines: # 根据实际的数据文件格式修改一下 line_new = line.strip()+ '|"' + addlist[i] + '"|"' + codelist[i]+'"|"'+alllist[i]+'"\n' file2_write.write(""+ alllist[i] +'\n') file_write.write(line_new) i=i+1 file2_write.close() file_write.close()
一些补充:
原始数据样式:
输出的 result.txt(在原始数据后添加了规范后的地址信息、行政编码以及省市区)
输出的 alllistrs.txt(省市区以及行政编码)