一、簡介
folium是js上著名的地理信息可視化庫leaflet.js為Python提供的接口,通過它,我們可以通過在Python端編寫代碼操縱數據,來調用leaflet的相關功能,基於內建的osm或自行獲取的osm資源和地圖原件進行地理信息內容的可視化,以及制作優美的可交互地圖。其語法格式類似ggplot2,是通過不斷添加圖層元素來定義一個Map對象,最后以幾種方式將Map對象展現出來。
而在Map對象的生成形式上,可以在定義所有的圖層內容之后,將其保存為html文件在瀏覽器中獨立顯示,也可以基於jupyter notebook在一個ipynb文件內部嵌入對應的交互地圖,本文即采用后者對應的方法。
二、創建地圖
首先,創建一張指定中心坐標的地圖,這里指定中心坐標為上海市(注意,location的格式為[緯度,經度],zoom_start表示初始地圖的縮放尺寸,數值越大放大程度越大):
import folium # 上海地圖 m = folium.Map(location=[31.22, 121.48]) m.save('index.html') #顯示黑白的街道 b = folium.Map( location=[31.22, 121.48], tiles='Stamen Toner', zoom_start=10 ) b.save('index_test1.html')
mar = folium.Map( location=[33.41, 115.06], tiles='Stamen Terrain', zoom_start=13 ) folium.Marker( [33.41, 115.06], popup='Camp Muir' ).add_to(mar) mar.add_child(folium.ClickForMarker(popup='Waypoint')) mar.save('mar.html')
可以看出,m的類型為folium中的Map,類似ggplot2中顯示圖形的方式,接下來直接在jupyter notebook調用m即可顯示地圖(默認的osm資源地址在國外,需要稍許等待):
'''顯示m''' m

通過這樣一個簡單的例子,可以了解到,folium.Map()即為folium中繪制地圖圖層的基本函數,其主要參數如下:
location:tuple或list類型輸入,用於控制初始地圖中心點的坐標,格式為(緯度,經度)或[緯度,經度],默認為None
width:int型或str型,int型時,傳入的是地圖寬度的像素值;str型時,傳入的是地圖寬度的百分比,形式為'xx%'。默認為'100%'
height:控制地圖的高度,格式同width
tiles:str型,用於控制繪圖調用的地圖樣式,默認為'OpenStreetMap',也有一些其他的內建地圖樣式,如'Stamen Terrain'、'Stamen Toner'、'Mapbox Bright'、'Mapbox Control Room'等;也可以傳入'None'來繪制一個沒有風格的朴素地圖,或傳入一個URL來使用其它的自選osm
max_zoom:int型,控制地圖可以放大程度的上限,默認為18
attr:str型,當在tiles中使用自選URL內的osm時使用,用於給自選osm命名
control_scale:bool型,控制是否在地圖上添加比例尺,默認為False即不添加
no_touch:bool型,控制地圖是否禁止接受來自設備的觸控事件譬如拖拽等,默認為False,即不禁止
下面針對上述各參數進行調整演示:
下面是一個width調整為50%,並施加比例尺的地圖:
'''創建Map對象''' m = folium.Map(location=[29.488869,106.571034], zoom_start=16, control_scale=True, width='50%') '''顯示m''' m

如我們設置的一樣,視圖只有左半邊被地圖填充,且在地圖的左下角施加了比例尺,標記出了公里和英里的比例尺。
下面是一個tiles設置為'Stamen Terrain'的地圖:
'''創建Map對象''' m = folium.Map(location=[29.488869,106.571034], zoom_start=15, tiles='Stamen Terrain') '''顯示m''' m

tiles為'Stamen Toner'的地圖:
'''創建Map對象''' m = folium.Map(location=[29.488869,106.571034], zoom_start=15, tiles='Stamen Toner') '''顯示m''' m

三、在圖層上添加各種內建的部件
3.1 為地圖添加標記部件
有了最底層的地圖,接下來我們就可以利用手里掌握的地理信息數據,根據需要將其展現在地圖圖層之上,下面是一個簡單的示范:
import folium import os '''創建Map對象''' m = folium.Map(location=[29.488869,106.571034], zoom_start=15) '''為m添加標記部件''' folium.Marker([29.488869,106.571034], popup='<i>Mt. Hood Meadows</i>').add_to(m) '''顯示m''' m

我們通過folium.Marker()方法,創建了一個簡單的標記小部件,並通過add_to()將定義好的部件施加於先前創建的Map對象m之上,下面我們對folium.Marker()的常用參數進行介紹:
location:同folium.Map()中的同名參數,用於確定標記部件的經緯位置
popup:str型或folium.Popup()對象輸入,用於控制標記部件的具體樣式(folium內部自建了許多樣式),默認為None,即不顯示部件
icon:folium.Icon()對象,用於設置popup定義的部件的具體顏色、圖標內容等
下面是幾個簡單的例子:
'''創建Map對象''' m = folium.Map(location=[29.488869,106.571034], zoom_start=15) '''為m添加標記部件,並將部件上的圖形設置為雲朵''' folium.Marker([29.488869,106.571034], popup='Mt. Hood Meadows', icon=folium.Icon(icon='cloud')).add_to(m) '''顯示m''' m

'''創建Map對象''' m = folium.Map(location=[29.488869,106.571034], zoom_start=15) '''為m添加標記部件''' folium.Marker([29.488869,106.571034], popup='Timberline Lodge', icon=folium.Icon(color='green')).add_to(m) '''顯示m''' m

'''創建Map對象''' m = folium.Map(location=[29.488869,106.571034], zoom_start=15) '''為m添加標記部件''' folium.Marker( location=[29.488869,106.571034], popup='Some Other Location', icon=folium.Icon(color='red', icon='info-sign') ).add_to(m) '''顯示m''' m

3.2 在地圖上添加圓圈
除了單點類型的圖形部件,我們還可以在地圖上施加指定范圍的幾何圖像,例如圓圈:
'''創建Map對象''' m = folium.Map(location=[29.488869,106.571034], zoom_start=15, control_scale=True) '''為m添加標記部件''' folium.Circle( radius=100, location=[29.488869,106.571034], popup='The Waterfront', color='crimson', fill=False, ).add_to(m) '''顯示m''' m

在folium中我們使用folium.Circle()來繪制指定圓心和半徑的圓圈,其主要參數如下:
location:同folium.Map()中的location,用於控制圓圈的圓心坐標
radius:int型,用於控制圓圈的半徑,單位米,注意,在folium.Circle()中,radius因為半徑的單位是米,所以其大小隨着我們對地圖的縮放程度而進行相應的變化,但在與folium.CircleMarker()方法中的radius參數單位為像素,即其為屏幕上大小固定的一個圓圈,隨着地圖的縮放,其大小也不會發生變化
color:str型,用於控制圓圈的顏色,默認為十六進制顏色'#3388ff',即一種藍色
fill:bool型,當為True時,圓圈內部將被填充上色彩,默認不填充
fill_color:str型,控制圓圈內部填充的色彩,默認與color參數一致
fill_opacity:float型,用於控制圓圈內部填充顏色的透明度,從0.到1.之間,默認為0.2
popup:str型或folium.Popup()對象,用於控制圓圈的樣式,默認為None,即無樣式
下面針對上述的主要參數進行演示:
將fill參數設置為True:
'''創建Map對象''' m = folium.Map(location=[29.488869,106.571034], zoom_start=15, control_scale=True) '''為m添加標記部件''' folium.Circle( radius=100, location=[29.488869,106.571034], color='#3388ff', fill=True, ).add_to(m) '''顯示m''' m

將圓圈內部填充顏色設置為粉色:
'''創建Map對象''' m = folium.Map(location=[29.488869,106.571034], zoom_start=15, control_scale=True) '''為m添加標記部件''' folium.Circle( radius=100, location=[29.488869,106.571034], color='#3388ff', fill=True, fill_color='#FF66CC' ).add_to(m) '''顯示m''' m

3.3 在地圖上繪制任意幾何圖形
很多時候我們希望在地圖上呈現不規則的幾何區域,folium.PolyLine()就可以實現這個功能,下面是一個簡單的演示:
import folium m = folium.Map(location=[29.488869,106.571034], zoom_start=7, control_scale=True) ls = folium.PolyLine(locations=[[30.588869,105.671034],[29.488869,106.571034],[31.888869,104.971034],[30.588869,105.671034]], color='blue') ls.add_to(m) m

folium.PolyLine()的常用參數如下:
locations:二級嵌套的list,用於指定需要按順序連接的坐標點,若要繪制閉合的幾何圖像,需要在傳入列表的首尾傳入同樣的坐標
color:str型,傳入十六進制的顏色,用於控制線條的顏色,默認為'#03f'
weight:float型,用於控制線條的寬度,默認為5
opacity:float型,用於控制線條的透明度,默認為0.5
popup:str型或folium.Popup()對象,用於控制線條樣式
3.4 在地圖上添加點擊觸發事件
有些時候我們希望我們的地圖不光是死板的展示信息,還能根據鼠標的點擊事件,來喚起更多的信息展示內容,即為地圖添加更多的子內容,我們使用add_child()來完成各種子內容的添加,例如:
1、實現點擊地圖任意位置獲取經緯度信息提示
'''創建Map對象''' m = folium.Map( location=[29.488869,106.571034], tiles='Stamen Terrain', zoom_start=13 ) '''為地圖對象添加點擊顯示經緯度的子功能''' m.add_child(folium.LatLngPopup())

轉自:https://cloud.tencent.com/developer/article/1157955
文檔:https://python-visualization.github.io/folium/quickstart.html#Getting-Started