(數據科學學習手札41)folium基礎內容介紹


一、簡介

  folium是js上著名的地理信息可視化庫leaflet.js為Python提供的接口,通過它,我們可以通過在Python端編寫代碼操縱數據,來調用leaflet的相關功能,基於內建的osm或自行獲取的osm資源和地圖原件進行地理信息內容的可視化,以及制作優美的可交互地圖。其語法格式類似ggplot2,是通過不斷添加圖層元素來定義一個Map對象,最后以幾種方式將Map對象展現出來。

  而在Map對象的生成形式上,可以在定義所有的圖層內容之后,將其保存為html文件在瀏覽器中獨立顯示,也可以基於jupyter notebook在一個ipynb文件內部嵌入對應的交互地圖,本文即采用后者對應的方法。

 

二、創建地圖

  首先,創建一張指定中心坐標的地圖,這里指定中心坐標為重慶交通大學(注意,location的格式為[緯度,經度],zoom_start表示初始地圖的縮放尺寸,數值越大放大程度越大):

import folium
import os

'''創建Map對象'''
m = folium.Map(location=[29.488869,106.571034],
              zoom_start=14)

'''查看m的類型'''
m.__class__

可以看出,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())

  2、實現點擊地圖任意位置產生一個新的圖標

m = folium.Map(
    location=[29.488869,106.571034],
    tiles='Stamen Terrain',
    zoom_start=13
)

m.add_child(folium.ClickForMarker())

 

  以上就是關於folium的基礎內容,關於更加自定義化的內容將在下一篇中進行展示。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM