folium进阶内容介绍

一、简言

​ 上一篇中我们学习了folium的基础内容,从创建folium地图开始,通过主要参数修饰地图,尝试绘制Marker来标记特定地点等,实际上folium在地理信息可视化过程中重点在于绘制图像的高度可定制化。

二、处理GeoJSON和TopoJSON数据

  1. GeoJSON数据

    GeoJSON是语法规则符合JSON文件的,专用于表示地理信息的一种JSON文件,其在JSON语法的基础上,内部又有着一套固定的语法规则。在folium中我们使用folium.GeoJson()方法来为已有的Map对象添加GeoJson图层,其常用参数如下:

    • data:传入你想要在地图上绘制的GeoJson数据。
    • highlight_function:一个自编函数,用于映射自定义的地图上施加的鼠标事件形式,默认为None。
    • style_function:一个自编函数,将自定义的对GeoJSON中特征的风格设置,映射到GeoJSON图层上,默认为None。
    • smooth_factorfloat型,用于控制每一次缩放时GeoJSON图层元素的光滑程度,该数值越大,意味着元素越光滑;该数值越小,意味着,元素的表现越接近真实坐标。

    示例1:通过GeoJSON绘制直线

   m = folium.Map(location=[38.85,115.48],
                 zoom_start=12,control_scale=True)
   gj = folium.GeoJson(data={
    
    "type":"LineString",
                      "coordinates":[[115.46, 38.80], [115.49, 38.88]]})
   gj.add_to(m)
   m

img

示例2:通过GeoJSON格式数据绘制交汇矩形

   m = folium.Map(location=[38.85,115.48],
                 zoom_start=12,control_scale=True)
   gj = folium.GeoJson(data={
    
     "type": "Polygon",
     "coordinates": [
       [ [115.46, 38.80], [115.56, 38.80], [115.56, 38.90], [115.46, 38.90], [115.46, 38.80] ],
       [ [115.48, 38.82], [115.54, 38.82], [115.54, 38.88], [115.48, 38.88], [115.48, 38.82] ]
       ]
    })
   
   gj.add_to(m)
   m

在这里插入图片描述

示例3:通过GeoJSON格式数据绘制多点

   route_map = folium.Map(location=[39.092310, 116.372313], zoom_start=10)
   
   data_list = [
       [116.862607,39.158962], 
       [116.853341,39.151323], 
       [116.730813,39.126518], 
       [116.388731,39.086568], 
       [116.240831,39.09431], 
       [116.071493,39.053133], 
       [115.895746,39.045938], 
               ]
   
   for lng, lat in data_list:
       folium.Marker(
           [lat, lng],
           icon=folium.Icon(color="green")
       ).add_to(route_map)
       
   route_map

在这里插入图片描述

示例4: 通过get请求获取GeoJSON格式数据绘制冰川线

   url = 'https://raw.githubusercontent.com/python-visualization/folium/master/examples/data'
   antarctic_ice_edge = f'{url}/antarctic_ice_edge.json'
   antarctic_ice_shelf_topo = f'{url}/antarctic_ice_shelf_topo.json'
   
   
   m = folium.Map(
       location=[-59.1759, -11.6016],
       tiles='Mapbox Bright',
       zoom_start=2  # Limited levels of zoom for free Mapbox tiles.
   )
   ## 绘制冰川线
   folium.GeoJson(
       antarctic_ice_edge,
       name='geojson'
   ).add_to(m)
   
   folium.LayerControl().add_to(m)

在这里插入图片描述

  1. TopoJSON数据

    TopoJSONGeoJSON按照拓扑学编码之后的扩展形式,相比GeoJSON直接使用PolygonPoint之类的几何体来表示图形,TopoJSON中的每一个几何体都是通过将共享边整合后组成的,这使得TopoJSON相较于GeoJSON,大大地减少了数据冗余,节省存储空间,在folium中,我们使用folium.TopoJson()方法,通过与folium.GeoJson()相似的方法,为地图添加TopoJSON层对象,

    常用参数如下:

    • data:传入你想要在地图上绘制的TopoJSON数据。
    • style_function:一个自编函数,将自定义的对TopoJSON中特征的风格设置,映射到TopoJSON图层上,默认为None。
    • smooth_factorfloat型,用于控制每一次缩放时TopoJSON图层元素的光滑程度,该数值越大,意味着元素越光滑;该数值越小,意味着,元素的表现越接近真实坐标。

    其常用参数同folium.GeoJson(),但没有highlight_function选项,

    示例:通过get请求获取TopoJSON格式数据绘制冰表层

   url = 'https://raw.githubusercontent.com/python-visualization/folium/master/examples/data'
   antarctic_ice_edge = f'{url}/antarctic_ice_edge.json'
   antarctic_ice_shelf_topo = f'{url}/antarctic_ice_shelf_topo.json'
   
   
   m = folium.Map(
       location=[-59.1759, -11.6016],
       tiles='Mapbox Bright',
       zoom_start=2  # Limited levels of zoom for free Mapbox tiles.
   )
   
   # 绘制冰表层
   folium.TopoJson(
       json.loads(requests.get(antarctic_ice_shelf_topo).text),
       'objects.antarctic_ice_shelf',
       name='topojson'
   ).add_to(m)
   
   folium.LayerControl().add_to(m)
   
   
   m

在这里插入图片描述

style_function参数

folium.GeoJson()和folium.TopoJson()方法中,都有参数style_function,该参数传入一个自编函数用于控制GeoJson及TopoJson层中的对象视觉参数,自编函数style_function通过返回一个字典类型的变量,来完成上述控制过程,这个字典中常用的键有'color',用于控制边点线的颜色,'weight'用于控制边点线的大小或粗细,'fillOpacity'用于控制面对象中的填充颜色的透明度,'fillColor'用于控制面对象中填充颜色的色彩,建议使用十六进制字符型色彩输入来控制。

示例:


import branca


url = 'https://raw.githubusercontent.com/python-visualization/folium/master/examples/data'
county_data = f'{url}/us_county_data.csv'
county_geo = f'{url}/us_counties_20m_topo.json'


df = pd.read_csv(county_data, na_values=[' '])

colorscale = branca.colormap.linear.YlOrRd_09.scale(0, 50e3)
employed_series = df.set_index('FIPS_Code')['Employed_2011']


def style_function(feature):
    employed = employed_series.get(int(feature['id'][-5:]), None)
    return {
    
    
        'fillOpacity': 0.5,
        'weight': 0,
        'fillColor': '#black' if employed is None else colorscale(employed)
    }


m = folium.Map(
    location=[48, -102],
    tiles='cartodbpositron',
    zoom_start=3
)

folium.TopoJson(
    json.loads(requests.get(county_geo).text),
    'objects.us_counties_20m',
    style_function=style_function
).add_to(m)


m

在这里插入图片描述

colorscale = branca.colormap.linear.PuRd_09.scale(0, 100000)

employed_series = df.set_index('FIPS_Code')['Median_Household_Income_2011'].dropna()


def style_function(feature):
    employed = employed_series.get(int(feature['id'][-5:]), None)
    return {
    
    
        'fillOpacity': 0.5,
        'weight': 0,
        'fillColor': '#black' if employed is None else colorscale(employed)
    }


m = folium.Map(
    location=[48, -102],
    tiles='cartodbpositron',
    zoom_start=3
)

folium.TopoJson(
    json.loads(requests.get(county_geo).text),
    'objects.us_counties_20m',
    style_function=style_function
).add_to(m)


m

在这里插入图片描述

三、Choropleth分级着色图

通过在Pandas DataFrames / SeriesGeoJSON / TopoJSON数据可以轻松创建Choropleth地图

常用参数如下:

  • geo_data: 指定GeoJSON,可以是JsonURLfile path或其他类型 (json、dict等)的GeoJSON几何数据。
  • data:需要绑定的GeoJSON的数据,默认为空。传入的数据可以是PandasDataFrameSeries
  • columns:当数据传入的时Pandas DataFrame设定想要的值,第一列需要与GeoJSON匹配的列,第二列为具体的值。
  • key_onGeoJSON中需要绑定的列,默认为空。格式中需要以feature对象开头,如id或 feature.properties.statename。
  • bins:设定对值要划分的数量,默认为6,如果传入的是数值,则传入数字时,会使用data中的最大值和最小值进行平均划分。如果传入的是一个序列,则会按序列定义边界。同时也可以传入字符串,可传入的字符串可以从histogram的文档中找到。
  • fill_color:区域需要填充的颜色,默认为blue,可以传入16进制的颜色代码或颜色名称,如果绑定了数据,则可以传入“颜色地图”,
  • nan_fill_color:NaN区域填充的颜色,默认为**’black’,即GeoJSON**中没有匹配到的图形填充的颜色。
  • fill_opacity :填充颜色的透明度,默认为6,可选值为0-1
  • nan_fill_opacity:NaN区域填充颜色透明度,默认取fill_opacity的值。
  • line_color:区域边框颜色,默认为’black’
  • line_weight:区域边框款对,默认为1
  • line_opacity:区域边框透明度,默认为1
  • highlight:当鼠标悬停在区域上时是否要突出显示,默认为False
  • name:层的名字,可选。如果设置了可以在LayerControls中出现。
  • overlay:添加层的设置,默认为True(覆盖层),如果传False则为基础层。
  • control:是否将图层包含到LayerControls中,默认为True
  • show:是否在地图打开时就显示层,默认为True

示例:

url = 'https://raw.githubusercontent.com/python-visualization/folium/master/examples/data'
state_geo = f'{url}/us-states.json'
state_unemployment = f'{url}/US_Unemployment_Oct2012.csv'
state_data = pd.read_csv(state_unemployment)

m = folium.Map(location=[48, -102], zoom_start=3)

folium.Choropleth(
    geo_data=state_geo,
    name='choropleth',
    data=state_data,
    columns=['State', 'Unemployment'],
    key_on='feature.id',
    fill_color='YlGn',
    fill_opacity=0.7,
    line_opacity=0.2,
    legend_name='Unemployment Rate (%)'
).add_to(m)

folium.LayerControl().add_to(m)

m

在这里插入图片描述

bins = list(state_data['Unemployment'].quantile([0, 0.25, 0.5, 0.75, 1]))

m = folium.Map(location=[48, -102], zoom_start=3)

folium.Choropleth(
    geo_data=state_geo,
    data=state_data,
    columns=['State', 'Unemployment'],
    key_on='feature.id',
    fill_color='BuPu',
    fill_opacity=0.7,
    line_opacity=0.5,
    legend_name='Unemployment Rate (%)',
    bins=bins,
    reset=True
).add_to(m)

m

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_45019698/article/details/108837730