(數據科學學習手札130)利用geopandas快捷繪製在線地圖

本文示例程式碼及文件已上傳至我的Github倉庫//github.com/CNFeffery/DataScienceStudyNotes

1 簡介

  在上一篇文章中,我為大家介紹了不久前發布的geopandas 0.10版本的諸多新特性,而其中介紹到的地圖可視化新方法explore()只是一帶而過,沒有仔細為大家介紹其功能用法。今天的文章我就將為大家詳細介紹新版geopandas中,利用explore()製作在線地圖可視化的方法:

2 在geopandas中製作在線地圖可視化

  explore()方法類似我們熟悉的plot()方法,是GeoSeriesGeoDataFrame對象皆有的方法,下面我們遞進式地介紹:

2.1 GeoSeries.explore()方法的使用

  GeoSeries.explore()的主要參數如下:

color:str或數組,用於設置所繪製矢量的顏色,當傳入數組時可一一對應按順序設置每個矢量的顏色

m:類似plot()方法中的ax參數,用於傳入已存在的地圖對象,從而實現多圖層疊加

tiles:str型,用於設置底圖來源,默認為'OpenStreetMap',其他可用的有'Stamen Terrain''Stamen Toner''Stamen Watercolor''CartoDB positron''CartoDB dark_matter',亦可傳入格式類似//{s}.yourtiles.com/{z}/{x}/{y}.png的自定義地圖服務,注意,當自定義tiles時,必須設置attr參數

attr:str型,用於設置底圖對應的attribution資訊

highlight:bool型,用於設置是否在滑鼠懸浮於矢量上時展示高亮效果,默認為True

width:int或str型,int型時用於設置地影像素寬度,字元型時用於設置地圖相對於容器的百分比寬度,此參數在參數m設置時會失效

height:int或str型,int型時用於設置地影像素高度,字元型時用於設置地圖相對於容器的百分比高度,此參數在參數m設置時會失效

control_scale:bool型,用於設置是否展示比例尺,默認為True

zoom_control:bool型,用於設置是否展示縮放組件,默認為True

marker_type:str型,用於設置點要素的樣式類型,可選的有'marker''circle''circle_marker'

marker_kwds:dict型,用於設置點要素的更多細節參數,常用的有:

  • radius:float型,用於設置點要素的半徑,當marker_type='circle'時單位為米,當marker_type='circle_marker'時單位為像素
  • icon:folium.map.Icon型,當marker_type='marker'時,用於自定義點圖標,詳細用法參考://python-visualization.github.io/folium/modules.html#folium.map.Icon
  • draggable:bool型,用於設置點圖標是否可自由拖拽,默認為False

style_kwds:dict型,用於設置矢量的樣式細節參數,常用的參數有:

  • stroke:bool型,設置是否繪製矢量輪廓,默認為True
  • color:str型,用於設置輪廓顏色
  • weight:int型,用於設置輪廓像素寬度
  • opacity:float型,取值0~1之間,用於設置輪廓透明度,默認為1.0
  • fill:bool型,用於設置是否繪製矢量填充,默認為True
  • fillColor:str型,用於設置矢量填充色
  • fillOpacity:float型,用於設置填充色透明度,默認為0.5

highlight_kwds:dict型,參數結構同style_kwds,用於設置滑鼠懸浮高亮狀態下的各樣式參數

min_zoom、max_zoom、zoom_start:int型,分別用於設置地圖的最小、最大及初始化縮放層級,默認值分別為0、18、10

location:元組或列表,用於設置地圖初始化時的中心坐標,格式為[緯度, 經度]

  get到這些參數之後,我們就可以非常快捷地製作在線可視化作品,以環渝地區為例:

m = shp.geometry.explore(
    color='#40a9ff',
    tiles='//server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}',
    attr=' ',
    width='80%',
    tooltip=False, # 關閉滑鼠懸浮時的空白tooltip
    style_kwds={
        'color': 'white',
        'fillOpacity': 0.4
    },
    highlight_kwds={
        'fillColor': 'white',
        'fillOpacity': 0.6
    }
)
m

  疊加多個圖層:

import folium

m = shp.geometry.explore(
    color='#40a9ff',
    tiles='//server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}',
    attr=' ',
    width='80%',
    tooltip=False, # 關閉滑鼠懸浮時的空白tooltip
    style_kwds={
        'color': 'white',
        'fillOpacity': 0.4
    },
    highlight_kwds={
        'fillColor': 'white',
        'fillOpacity': 0.6
    }
)

shp.representative_point().explore(
    color='red',
    tooltip=False, # 關閉滑鼠懸浮時的空白tooltip
    m=m, # 疊加已有地圖
    marker_type='marker',
    marker_kwds={
        'icon': folium.map.Icon(icon='beer', prefix='fa')
    }
)

2.2 GeoDataFrame.explore()方法的使用

  與GeoSeries.explore()相比,GeoDataFrame除了矢量欄位之外,還可以快捷地利用數據框中其他欄位的資訊,來輔助視覺元素的映射,因此在GeoSeries.explore()的參數體系基礎上,GeoDataFrame.explore()新增了如下參數,與plot()方法非常相似:

column:str型或數組,用於指定繪圖映射基於的欄位名,亦或是額外傳入的與矢量一一對應的數組

cmap:str型或matplotlib中的colormap對象,用於設置色彩映射方案

tooltip:bool、str或list型,用於自定義滑鼠懸浮時提示框內顯示的欄位資訊,True表示展示全部欄位,False表示關閉提示框,str型時可指定單個要展示的欄位名,list型時指定多個要展示的欄位

popup:用於設置滑鼠點擊觸發展示的資訊框內容,格式同tooltip

categorical:bool型,用於設置是否開啟類別映射模式,默認為False

legend:bool型,設置是否顯示圖例,默認為True

scheme:字元型,同plot()中的同名參數,用於設定分層設色規則,參考我的過往文章://www.cnblogs.com/feffery/p/12381322.html

k:int型,用於設置分層設色分段數量,默認為5

vmin:float型,用於手動設置色彩映射最小值

vmax:float型,用於手動設置色彩映射最大值

categories:list型,用於傳入順序類別列表

tooltip_kwds:dict型,用於自定義設置tooltip樣式,詳細參考://python-visualization.github.io/folium/modules.html#folium.features.GeoJsonTooltip

popup_kwds:dict型,用於自定義設置popup樣式,詳細參考://python-visualization.github.io/folium/modules.html#folium.features.GeoJsonPopup

legend_kwds:dict型,用於自定義設置圖例,主要的參數有:

  • caption:str型,自定義圖例標題,默認為映射欄位名
  • colorbar:bool型,用於設置是否開啟colorbar模式,設置為False時會開啟分段模式
  • fmt:str型,用於自定義圖例項數值格式,默認為'{:.2f}'
  • labels:list型,自定義圖例項標籤文字,來覆蓋原始自動生成內容
  • max_labels:int型,設置colorbar圖例中刻度數量
  • scale:bool型,設置是否以真實尺度來渲染每段分層設色區間,False時每段色階長度會強制相同

  下面我們來基於這些實用的參數,繪製幾個示例:

m = shp.explore(
    column='area',
    cmap='Blues',
    tiles='//server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}',
    attr=' ',
    scheme='NaturalBreaks',
    k=3,
    vmin=0,
    legend_kwds={
        'caption': '面積(平方千米)',
        'scale': False,
        'colorbar': False
    },
    style_kwds={
        'color': 'white',
        'weight': 1,
        'fillOpacity': 0.8
    }
)
m

m = shp.explore(
    column='area',
    cmap='Reds',
    tiles='//server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/{z}/{y}/{x}',
    attr=' ',
    scheme='NaturalBreaks',
    k=3,
    vmin=0,
    legend_kwds={
        'caption': '面積(平方千米)',
        'scale': False
    },
    style_kwds={
        'color': 'white',
        'weight': 1,
        'fillOpacity': 0.7
    }
)
m

2.3 保存在線底圖

  如果我們想要持久化保存繪製好的在線地圖作品,可以利用地圖對象的save()方法,將其保存為離線html文件:

m.save('demo.html')

  瀏覽器中查看已保存的html文件:


  以上就是本文的全部內容,歡迎在評論區與我進行討論~