(数据科学学习手札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的一些进阶内容,若有笔误,望指出。

相关文章
相关标签/搜索