背景

想实现动态地图展示留言板数据量的视觉效果。

基本原理

  • 城市地图基础:使用 folium.Map() 创建了一个基础的地图,并设置了初始的中心点为北京的经纬度。
  • 利用 folium叠加数据,用了高德地图的api瓦片图层
  • 叠加数据

实现代码

import folium
import pandas as pd
from folium.plugins import MarkerCluster

# 数据加载到 pandas DataFrame
data = {
    '区域': ['河南省', '广东省', '山东省', '河北省', '陕西省', '甘肃省', '四川省', '江苏省', '安徽省', '辽宁省', '山西省', 
            '北京市', '云南省', '浙江省', '湖北省', '吉林省', '内蒙古自治区', '广西壮族自治区', '天津市', '黑龙江省', 
            '福建省', '重庆市', '贵州省', '江西省', '新疆维吾尔自治区', '湖南省', '上海市', '海南省', '宁夏回族自治区', 
            '青海省', '西藏自治区', '新疆生产建设兵团', '澳门特别行政区', '香港特别行政区'],
    '2023年': [40820, 31782, 30893, 27178, 27060, 25571, 25492, 25031, 24651, 23895, 19100, 18985, 17142, 13570, 12415, 
              11411, 11205, 11144, 10947, 10542, 8666, 8018, 7060, 6915, 6124, 6018, 4982, 4721, 4688, 2741, 2192, 141, 3, 2],
    '2024年': [57347, 54486, 43321, 41798, 31529, 32813, 24862, 30919, 33657, 32280, 22215, 18030, 15469, 13543, 12278, 
              12305, 9317, 12505, 9845, 11710, 9478, 8077, 7143, 8220, 5530, 7395, 4847, 4221, 4092, 2705, 1788, 104, 3, 2]
}

df = pd.DataFrame(data)

# 省会城市的大致经纬度
city_coordinates = {
    '河南省': [34.7466, 113.6254],  # 郑州
    '广东省': [23.1291, 113.2644],  # 广州
    '山东省': [36.6512, 117.1201],  # 济南
    '河北省': [38.0428, 114.5149],  # 石家庄
    '陕西省': [34.2583, 108.9280],  # 西安
    '甘肃省': [36.0611, 103.8343],  # 兰州
    '四川省': [30.5728, 104.0668],  # 成都
    '江苏省': [32.0603, 118.7969],  # 南京
    '安徽省': [31.8206, 117.2272],  # 合肥
    '辽宁省': [41.8057, 123.4315],  # 沈阳
    '山西省': [37.8696, 112.5489],  # 太原
    '北京市': [39.9042, 116.4074],  # 北京
    '云南省': [25.0446, 102.7103],  # 昆明
    '浙江省': [30.2741, 120.1551],  # 杭州
    '湖北省': [30.5928, 114.3055],  # 武汉
    '吉林省': [43.8868, 125.3245],  # 长春
    '内蒙古自治区': [40.8173, 111.7652],  # 呼和浩特
    '广西壮族自治区': [22.8196, 108.3113],  # 南宁
    '天津市': [39.0851, 117.2009],  # 天津
    '黑龙江省': [45.7423, 126.6367],  # 哈尔滨
    '福建省': [26.0793, 119.2965],  # 福州
    '重庆市': [29.5630, 106.5516],  # 重庆
    '贵州省': [26.6476, 106.6302],  # 贵阳
    '江西省': [28.6747, 115.9329],  # 南昌
    '新疆维吾尔自治区': [43.8256, 87.6168],  # 乌鲁木齐
    '湖南省': [28.2282, 112.9388],  # 长沙
    '上海市': [31.2304, 121.4737],  # 上海
    '海南省': [20.0319, 110.3312],  # 海口
    '宁夏回族自治区': [38.4714, 106.2782],  # 银川
    '青海省': [36.6171, 101.7789],  # 西宁
    '西藏自治区': [29.6525, 91.1721],  # 拉萨
    '新疆生产建设兵团': [42.7598, 85.2405],  # 基地位置
    '澳门特别行政区': [22.1987, 113.5439],  # 澳门
    '香港特别行政区': [22.3193, 114.1694]   # 香港
}

# 根据 value 映射颜色和字体大小
def get_marker_style(value):
    # 字体大小的映射范围
    font_size = 4 + (value / 1000)  # 根据 value 映射字体大小
    # 根据 value 映射颜色
    if value > 20000:
        color = 'red'
    elif value > 10000:
        color = 'orange'
    else:
        color = 'green'
    return color, font_size

import folium
from folium import plugins
# 创建基础地图函数,带有直接显示数字的标记
def create_map(year, data):
    city_map = folium.Map(location=[35.8617, 104.1954], zoom_start=5)


    # 添加百度地图瓦片图层
    folium.TileLayer(
        tiles="https://webrd04.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}",
        attr="百度地图",
        name="百度地图",
        overlay=True,
        control=True
    ).add_to(city_map)



    # 设置MarkerCluster不在所有缩放级别下都聚集
    marker_cluster = MarkerCluster(
        disableClusteringAtZoom=5  # 设定当地图缩放达到10时,停止聚集
    ).add_to(city_map)
    
    for index, row in data.iterrows():
        coordinates = city_coordinates.get(row['区域'])
        if coordinates:
            value = row[f'{year}年']  # 获取指定年份的数据
            color, font_size = get_marker_style(value)  # 获取动态的颜色和字体大小
            folium.Marker(
                location=coordinates,
                popup=None,
                tooltip=f"{row['区域']}: {value}",
                icon=folium.DivIcon(
                    html=f'<div style="font-size: {font_size}px; color: {color}; font-weight: bold;">{value}</div>'
                )
            ).add_to(marker_cluster)
    city_map.save(f'city_message_board_{year}_no_clustering.html')
    print(f"地图已保存为 'city_message_board_{year}_no_clustering.html'。")

# 分别创建2023年和2024年的地图
create_map(2023, df)
create_map(2024, df)

效果

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐