一、簡介
在上一篇(數據科學學習手札41)中我們了解了folium的基礎內容,實際上folium在地理信息可視化上的真正過人之處在於其繪制圖像的高度可定制化上,本文就將基於folium官方文檔中的一些基本示例來展開說明;
二、處理GeoJSON和TopoJSON數據
2.1 GeoJSON數據
GeoJSON是語法規則符合JSON文件的,專用於表示地理信息的一種JSON文件,其在JSON語法的基礎上,內部又有着一套固定的語法規則。在folium中我們使用folium.GeoJson()方法來為已有的Map對象添加GeoJson圖層,其常用參數如下:
data:傳入你想要在地圖上繪制的GeoJson數據
style_function:一個自編函數,將自定義的對geojson中特征的風格設置,映射到geojson圖層上,默認為None
highlight_function:一個自編函數,用於映射自定義的地圖上施加的鼠標事件形式,默認為None
smooth_factor:float型,用於控制每一次縮放時geojson圖層元素的光滑程度,該數值越大,意味着元素越光滑;該數值越小,意味着,元素的表現越接近真實坐標
下面是一些基本的例子:
1、繪制線
import folium '''創建底層Map對象''' m = folium.Map(location=[0.5,100.5], zoom_start=8, control_scale=True) '''定義geojson圖層''' gj = folium.GeoJson(data={ "type": "LineString", "coordinates": [ [100.0, 0.0], [101.0, 1.0] ] }) '''為m添加geojson層''' gj.add_to(m) '''顯示m''' m
2、繪制無孔的區域
import folium '''創建底層Map對象''' m = folium.Map(location=[0.5,100.5], zoom_start=8, control_scale=True) '''定義geojson圖層''' gj = folium.GeoJson(data={ "type": "Polygon", "coordinates": [ [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ] ] }) '''為m添加geojson層''' gj.add_to(m) '''顯示m''' m
3、繪制有孔的區域
import folium '''創建底層Map對象''' m = folium.Map(location=[0.5,100.5], zoom_start=8, control_scale=True) '''定義geojson圖層''' gj = folium.GeoJson(data={ "type": "Polygon", "coordinates": [ [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ], [ [100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2] ] ] }) '''為m添加geojson層''' gj.add_to(m) '''顯示m''' m
4、繪制多點
import folium '''創建底層Map對象''' m = folium.Map(location=[0.5,100.5], zoom_start=8, control_scale=True) '''定義geojson圖層''' gj = folium.GeoJson(data={ "type": "MultiPoint", "coordinates": [ [100.0, 0.0], [101.0, 1.0] ] }) '''為m添加geojson層''' gj.add_to(m) '''顯示m''' m
5、繪制多線
import folium '''創建底層Map對象''' m = folium.Map(location=[0.5,100.5], zoom_start=6, control_scale=True) '''創建geojson層''' gj = folium.GeoJson(data={ "type": "MultiLineString", "coordinates": [ [ [100.0, 0.0], [101.0, 1.0] ], [ [102.0, 2.0], [103.0, 3.0] ] ] }) '''將gj添加到m上''' gj.add_to(m) '''顯示m''' m
6、繪制多面
import folium '''創建底層Map對象''' m = folium.Map(location=[0.0,100.0], zoom_start=6, control_scale=True) '''創建geojson層''' gj = folium.GeoJson(data={ "type": "MultiPolygon", "coordinates": [ [[[102.0, 2.0], [103.0, 2.0], [103.0, 3.0], [102.0, 3.0], [102.0, 2.0]]], [[[100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]], [[100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2]]] ] }) '''將gj添加到m上''' gj.add_to(m) '''顯示m''' m
7、繪制幾何集合
import folium '''創建底層Map對象''' m = folium.Map(location=[0.0,100.0], zoom_start=6, control_scale=True) '''創建geojson層''' gj = folium.GeoJson(data={ "type": "GeometryCollection", "geometries": [ { "type": "Point", "coordinates": [100.0, 0.0] }, { "type": "LineString", "coordinates": [ [101.0, 0.0], [102.0, 1.0] ] } ] }) '''將gj添加到m上''' gj.add_to(m) '''顯示m''' m
2.2 TopoJSON數據
TopoJSON是GeoJSON按照拓撲學編碼之后的擴展形式,相比GeoJSON直接使用Polygon、Point之類的幾何體來表示圖形,TopoJSON中的每一個幾何體都是通過將共享邊整合后組成的,這使得TopoJSON相較於GeoJSON,大大地減少了數據冗余,節省存儲空間,在folium中,我們使用folium.TopoJson()方法,通過與folium.GeoJson()相似的方法,為地圖添加TopoJSON層對象,因此其常用參數同folium.GeoJson(),但沒有highlight_function選項,下面是參照folium官方手冊的一個簡單的例子:
import folium import os import json '''將工作目錄轉至目標文件所在目錄''' os.chdir(r'C:\Users\windows\Desktop\folium') '''讀取目標json文件''' with open('南極冰蓋_topo.json') as to: s = to.readline() data = json.loads(s) '''創建底層地圖對象''' m = folium.Map( location=[-59.1759, -11.6016], tiles='Mapbox Bright', zoom_start=1 ) '''創建TopoJson層對象''' tj = folium.TopoJson(data,'objects.antarctic_ice_shelf',name='topojson') '''將topojson對象添加到底層地圖上''' tj.add_to(m) '''顯示m''' m
2.3 style_function 在folium.GeoJson()和folium.TopoJson()方法中,都有參數style_function,該參數傳入一個自編函數用於控制GeoJson及TopoJson層中的對象視覺參數,自編函數style_function通過返回一個字典類型的變量,來完成上述控制過程,這個字典中常用的鍵有'color',用於控制邊點線的顏色,'weight'用於控制邊點線的大小或粗細,'fillOpacity'用於控制面對象中的填充顏色的透明度,'fillColor'用於控制面對象中填充顏色的色彩,建議使用十六進制字符型色彩輸入來控制,下面通過一個簡單的例子來了解一下style_function的用法:
import folium import numpy as np '''創建底層地圖''' m = folium.Map(location=[0.0,180.0], zoom_start=3, control_scale=True) '''自定義style_function函數''' def style_function(feature): return {'fillOpacity': 0.4, 'weight': 2, 'fillColor': '#FFFF33', 'color':'#FFFF33' } '''創建GeoJson層對象''' gj = folium.GeoJson(data={ "type": "Polygon", "coordinates": [[[160,30],[160,-30],[180,-30],[180,30]]]},style_function=style_function) '''將GeoJson層對象添加到底層地圖資源上''' gj.add_to(m) '''顯示m''' m
實際中,可以根據與面對象關聯的指標數字,來控制不同水平對應的面對象的顏色,譬如在繪制中國各省經濟發展水平的示意圖時,就可以將每個省的某個經濟指標如人均GDP作為指標數字,在style_function中設置相應的算法來控制面各省面對象的填充顏色以達到類似下圖的效果(下圖來自folium官方演示demo):
三、熱力地圖(heatmap)
我們利用folium.plugins.HeatMap()來繪制我們的熱力地圖,該方法較為簡單,主要的傳入參數僅有一個data,其格式為[[緯度,經度,數值],[緯度,經度,數值],...,[緯度,經度,數值]],其中每一個單獨的點的坐標由嵌套的內層每一個列表的前兩個元素來確定,控制熱力程度的值由上述列表的第三個值表示,下面是一個簡單的例子:
import folium import numpy as np from folium.plugins import HeatMap data = (np.random.normal(size=(100, 3)) * np.array([[1, 1, 1]]) + np.array([[48, 5, 1]])).tolist()
data
可以看出,data的格式如我們介紹的那樣
m = folium.Map([48., 5.], tiles='stamentoner', zoom_start=6) HeatMap(data).add_to(m) m
以上就是關於folium的一些進階內容,如有筆誤,望指出。