• Folium 笔记:使用PopUp突出subzone的空间分布


    0 效果图

    点开某一个区域后,内容是这个区域的用地类型分布

    1 读取数据

    1. import folium
    2. import matplotlib.pyplot as plt
    3. import re
    4. import geopandas as gpd
    1. subzone=gpd.read_file('MasterPlan2019PlanningAreaBoundaryNoSea.geojson')
    2. subzone

    2 提取subzone 信息

    对description列进行正则表达式操作,提取subzone信息

    1. def extract_name_from_description(description):
    2. match = re.search(r"PLN_AREA_N (.*?)", description)
    3. #使用正则表达式查找subzone的名字
    4. #查找的是' PLN_AREA_N BUKIT BATOK'这一部分内容
    5. #BUKIT BATOK 是第一个group
    6. return match.group(1) if match else None
    7. #返回对应的subzone的名字
    8. subzone['subzone_name']=subzone['Description'].apply(extract_name_from_description)
    9. subzone=subzone[['subzone_name','geometry']]
    10. subzone

    3 找到地图的中心点,并绘制subzone图

    1. center_sg=subzone.geometry.unary_union.centroid
    2. print(center_sg)
    3. #POINT (103.82073869660411 1.3524404921177333)
    4. m = folium.Map(location=(list(center_sg.coords)[0][1],list(center_sg.coords)[0][0]), zoom_start=11)
    5. #绘制地图
    6. folium.GeoJson(subzone,
    7. style_function=lambda x: {"fillColor": "lightgrey", "color": "blue", "weight": 0.5},).add_to(m)
    8. m
    9. #将subzone数据作为GeoJson添加到map中

    4 制造伪数据,四个区域的用地类型分布

    1. data={'JURONG WEST':{'industry':12.1,
    2. 'residential':20.4,
    3. 'comercial':1.5,
    4. 'open space':36.3,
    5. 'others':100-12.1-20.4-1.5-36.3},
    6. 'ORCHARD':{'industry':0,
    7. 'residential':49.1,
    8. 'comercial':20.2,
    9. 'open space':20.9,
    10. 'others':100-0-49.1-20.2-20.9},
    11. 'BISHAN':{'industry':0,
    12. 'residential':48.2,
    13. 'comercial':3.1,
    14. 'open space':22.4,
    15. 'others':100-0-48.2-3.1-22.4},
    16. 'TUAS':{'industry':62.7,
    17. 'residential':0,
    18. 'comercial':0,
    19. 'open space':19.8,
    20. 'others':100-62.7-0-0-19.8}}

    5 绘制饼图

    1. def pie_chart_popup(area_name, data):
    2. plt.figure(figsize=(5, 4))
    3. plt.pie([data[area_name]['industry'],data[area_name]['residential'],data[area_name]['comercial'],data[area_name]['open space'],data[area_name]['others']],
    4. labels=['industry', 'residential','comercial','open space','others'],
    5. autopct='%1.1f%%')
    6. plt.title('Land use of '+f"{area_name}")
    7. #绘制饼图
    8. plt.savefig(f'{area_name}'+'.png')
    9. return folium.Popup(f'{area_name}.png">', max_width=265)
    10. #Popup就是点这块区域,就会弹出后面的这个html,也就是我们所画的饼图

    6 将饼图和folium图结合

    1. for subzone_name in data.keys():
    2. row=subzone[subzone['subzone_name']==subzone_name]
    3. #找到subzone对应的行
    4. folium.GeoJson(
    5. row,
    6. style_function=lambda x: {"fillColor": "green", "color": "#000000", "weight": 0.5},
    7. tooltip=subzone_name,
    8. popup=pie_chart_popup(subzone_name, data)
    9. ).add_to(m)
    10. #在地图中画出这个subzone
    11. #tooltip就是鼠标滑过这片区域,就会显示的字
    12. #popup就是点击后弹出对应的饼图
    13. m.save('subzone_proportion.html')
    14. #保存html

  • 相关阅读:
    代码随想录算法公开课!
    开源贴片机OpenPnp使用体验
    mongoDB mapreduce使用总结
    数组中出现次数超过一半的数字、替换空格、重建二叉树
    html中如何给input输入框这个一个默认值
    算法笔记 图论和优先级队列的笔记
    聊聊Tomcat架构和生命周期
    【没用的小知识又增加了--CCS】
    AQS解读
    基于JavaWeb的失物招领平台设计与实现
  • 原文地址:https://blog.csdn.net/qq_40206371/article/details/133825084