python folium 庫學習


一、簡介

  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

         https://pypi.org/project/folium/

         https://nbviewer.jupyter.org/github/gaonanlee/Visualization-Practice/blob/master/Folium%20Visualization%20Examples.ipynb


免責聲明!

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



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