(數據科學學習手札42)folium進階內容介紹

1、簡介算法

  在上一篇(數據科學學習手札41)中咱們瞭解了folium的基礎內容,實際上folium在地理信息可視化上的真正過人之處在於其繪製圖像的高度可定製化上,本文就將基於folium官方文檔中的一些基本示例來展開說明;json

 

2、處理GeoJSON和TopoJSON數據windows

2.1 GeoJSON數據dom

  GeoJSON是語法規則符合JSON文件的,專用於表示地理信息的一種JSON文件,其在JSON語法的基礎上,內部又有着一套固定的語法規則。在folium中咱們使用folium.GeoJson()方法來爲已有的Map對象添加GeoJson圖層,其經常使用參數以下:函數

  data:傳入你想要在地圖上繪製的GeoJson數據學習

  style_function:一個自編函數,將自定義的對geojson中特徵的風格設置,映射到geojson圖層上,默認爲None編碼

  highlight_function:一個自編函數,用於映射自定義的地圖上施加的鼠標事件形式,默認爲Nonespa

  smooth_factor:float型,用於控制每一次縮放時geojson圖層元素的光滑程度,該數值越大,意味着元素越光滑;該數值越小,意味着,元素的表現越接近真實座標3d

下面是一些基本的例子:code

  一、繪製線

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

  二、繪製無孔的區域

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

  三、繪製有孔的區域

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

  四、繪製多點

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

   五、繪製多線

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

  六、繪製多面

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

  七、繪製幾何集合

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):

 

3、熱力地圖(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的一些進階內容,若有筆誤,望指出。

相關文章
相關標籤/搜索