楔子
folium是一個用來繪制地圖,並在地圖上做標記的工具。比較簡單,我們直接來看看怎么用。另外,我下面的代碼都在notebook上面演示。
創建一張地圖
先不管哪些花里胡哨的,我們先來如何創建一張地圖。
import folium
# 調用Map方法,將緯度和精度組合成一個列表傳進去即可創建出一張地圖
m = folium.Map(location=[39.9, 116.3])
m

Map方法支持的參數:
location:存儲緯度和經度的元組或列表,緯度和經度使用浮點型表示。默認為None,會創建出一張空地圖
m = folium.Map()
m

width:創建的地圖的寬度,默認是100%。可以輸入一個字符串,比如"50%"、"75%"等等改變寬度,或者輸入一個整型,表示寬多少個像素。
height:創建的地圖的高度,默認是100%。可以輸入一個字符串,比如"50%"、"75%"等等改變高度,或者輸入一個整型,表示高多少個像素。
m = folium.Map(location=[39.9, 116.3], width="75%", height="50%")
m

tiles:str型,用於控制繪圖調用的地圖樣式,默認為'OpenStreetMap',也有一些其他的內建地圖樣式,如'Stamen Terrain'、'Stamen Toner'、'Mapbox Bright'、'Mapbox Control Room'等;也可以傳入'None'來繪制一個沒有風格的朴素地圖,或傳入一個URL來使用其它的自選osm
m = folium.Map(location=[39.9, 116.3], width="75%", height="50%", tiles="Stamen Terrain")
m

m = folium.Map(location=[39.9, 116.3], width="75%", height="50%", tiles="Stamen Toner")
m

min_zoom:地圖可以縮小的上限,默認為0
max_zoom:地圖可以放大的上限,默認為18
zoom_start:地圖zoom的初始級別,默認為10。假設改成11的話,那么就相當於在默認創建的地圖的級別上放大一級。光說不練假把式,舉個例子感受一下。
m = folium.Map(location=[39.9, 116.3], width="75%", height="50%")
m

m = folium.Map(location=[39.9, 116.3], width="75%", height="50%", zoom_start=11)
m

可以看到,地圖相當於被放大了。
attr:字符串類型,只有當tile為URL內的osm時才會使用,用於給osm重命名。比較少用
control_scale:是否添加比例尺,默認為False,表示不添加
m = folium.Map(location=[39.9, 116.3], control_scale=True)
m

prefer_canvas:默認為False,如果為True,那么對於向量層將使用畫布,而不是SVG。這在某些場景下能夠提高性能,比如我們要做成百上千個標記的時候。
no_touch:是否禁止接收來自於設備的觸控事件、比如拖拽等等,默認是False表示不禁止。
disable_3d:對定位不使用硬件加速的CSS 3D轉換(因為在極少的情況下可能會導致小異常),即使它們支持。
zoom_control:是否在地圖上顯示,zoom的控制按鈕。就是生成的地圖的左上角的加號和減號,對應地圖的放大和縮小。默認是True,表示顯示,如果覺得礙眼,我們可以傳入False禁用掉。
給地圖添加一些組件
我們還可以再生成的地圖上做一些標記:
Marker
m = folium.Map(location=[39.9, 116.3])
# 調用Marker可以創建標記,傳入位置和信息,當鼠標放在標記上會顯示出信息。
# 而且支持html。最后不要忘記add_to(m),表示把標志添加到地圖上
folium.Marker(location=[39.9, 116.3], popup='<p style="color: green">this is beijing</p>').add_to(m)
m

Marker方法支持的參數:
location:同Map方法的location
popup:附加的信息,支持html。但是如果我們不希望使用html語法呢?因為< >之類的符號會被當成html解析。
m = folium.Map(location=[39.9, 116.3])
# 使用Popup進行渲染,加上parse_html=True便會把原始內容當成普通字符串來解析
# 並且還可以指定max_width,表示寬度
folium.Marker(location=[39.9, 116.3], popup=folium.Popup('<p style="color: green">this is beijing</p>',
parse_html=True, max_width=200)).add_to(m)
m

tooltip:當把鼠標移動到標記的時候顯示的信息,鼠標從標記移走的時候,信息消失。
m = folium.Map(location=[39.9, 116.3])
folium.Marker(location=[39.9, 116.3], popup="beijing", tooltip="click me").add_to(m)
m

icon:給標記添加提攜圖標,我們看到藍色的標記里面是一個白色的小圓圈,我們可以進行修改。
m = folium.Map(location=[39.9, 116.3])
# 調用Icon方法指定圖標,color指定為pink,icon指定為cloud
folium.Marker(location=[39.9, 116.3], popup="beijing", icon=folium.Icon(color="pink", icon="cloud")).add_to(m)
m

Circle
和Marker一樣,都是用來添加標記的,不過Circle添加的是圓圈。
Circle方法支持的參數:
location:同Marker的location
popup:同Marker的popup
tooltip:同Marker的tooltip
radius:Circle的半徑,單位是米,顯然是根據地圖來的。
color:圓圈的顏色,支持16進制。
m = folium.Map(location=[39.9, 116.3])
folium.Circle(location=[39.9, 116.3], radius=10000, color="green").add_to(m)
m

fill:我們看到圓圈默認是空的,如果fill為True,那么將會變成實心。
fill_color:填充是所用的顏色,默認和color保持一致
fill_opacity:填充之后的透明度,浮點型,0.到1.之間,默認為0.2
m = folium.Map(location=[39.9, 116.3])
folium.Circle(location=[39.9, 116.3], radius=10000, color="green", fill=True, fill_color="yellow").add_to(m)
m

PolyLine
上面的Marker和Circle是默認的圖形,我們可以使用PolyLine來繪制多邊形,但是前提需要知道一些點的經緯度。
m = folium.Map(location=[39.9, 116.3])
# 傳入的是多個經緯度:海淀區、石景山區、豐台區、海淀區
folium.PolyLine(locations=[
[39.95, 116.30], [39.90, 116.22], [39.85, 116.28], [39.95, 116.30]]
).add_to(m)
m

PolyLine方法支持的參數:
locations:傳入要繪制的多邊形的每一個點的坐標,所以叫locations。另外,因為要形成一個閉合圖形,所以第一個坐標和最后一個坐標應該是一樣的。
popup:同Marker和Circle。
tooltip:同Marker和Circle。
smooth_factor:簡化線段的程度,越大性能越好、線段越光滑,越小表達的越精確、多邊形的每個點在放大之后越接近真實位置。這個你可以自己嘗試一下,可以看到區別
weight:線條的寬度,默認為3
opacity:線條的透明度,默認是1.,即不透明。
m = folium.Map(location=[39.9, 116.3])
folium.PolyLine(locations=[
[39.95, 116.30], [39.90, 116.22], [39.85, 116.28], [39.95, 116.30]],
opacity=0.5, weight=5).add_to(m)
m

add_child添加附加屬性
添加經緯度
m = folium.Map(location=[39.9, 116.3])
# 添加經緯度
m.add_child(folium.LatLngPopup())
m

添加坐標點
m = folium.Map(location=[39.9, 116.3])
# 添加坐標點,這樣一點擊就會生成一個Marker
# ClickForMarker里面還可以指定一個參數popup,含義同之前的一樣
m.add_child(folium.ClickForMarker())
m

設置json
其實我們之前的操作,都可以通過設置json來實現。
