一、简介
在上一篇(数据科学学习手札41)中我们了解了folium的基础内容,实际上folium在地理信息可视化上的真正过人之处在于其绘制图像的高度可定制化上,本文就将基于folium官方文档中的一些基本示例来展开说明;
二、处理GeoJSON和TopoJSON数据
2.1 GeoJSON数据
GeoJSON是语法规则符合JSON文件的,专用于表示地理信息的一种JSON文件,其在JSON语法的基础上,内部又有着一套固定的语法规则。在folium中我们使用folium.GeoJson()方法来为已有的Map对象添加GeoJson图层,其常用参数如下:
data:传入你想要在地图上绘制的GeoJson数据
style_function:一个自编函数,将自定义的对geojson中特征的风格设置,映射到geojson图层上,默认为None
highlight_function:一个自编函数,用于映射自定义的地图上施加的鼠标事件形式,默认为None
smooth_factor:float型,用于控制每一次缩放时geojson图层元素的光滑程度,该数值越大,意味着元素越光滑;该数值越小,意味着,元素的表现越接近真实坐标
下面是一些基本的例子:
1、绘制线
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
2、绘制无孔的区域
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
3、绘制有孔的区域
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
4、绘制多点
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
5、绘制多线
import folium '''创建底层Map对象''' m = folium.Map(location=[100.0, 0.0], 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
6、绘制多面
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
7、绘制几何集合
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):
三、热力地图(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的一些进阶内容,如有笔误,望指出。