(数据科学学习手札42)folium进阶内容介绍
一、简介
在上一篇(数据科学学习手札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=[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
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的一些进阶内容,如有笔误,望指出。
相关文章
- linux shell 脚本攻略学习14--head命令详解,tail命令详解
- Scala - 快速学习01 - Scala简介
- python操作docx学习资料
- H3CNE学习---PPP、三层链路聚合、VRRP
- Python视觉深度学习系列教程 第一卷 - 第8章 参数化学习
- Flutter学习 — 添加Material触摸水波效果
- ML之DataScience:基于机器学习处理数据科学(DataScience)任务(数据分析、特征工程、科学预测等)的简介、流程、案例应用执行详细攻略
- ML之分类预测:机器学习中多分类预测数据集可视化(不同类别赋予不同颜色)设计思路及代码实现
- ML之RL:基于MovieLens电影评分数据集利用强化学习算法(多臂老虎机+EpsilonGreedy策略)实现对用户进行Top电影推荐案例
- DL:关于深度学习常用数据集中训练好的权重文件(Deeplab v3、MobileNet、InceptionV3、VGG系列、ResNet、Mask R-CNN )下载地址集合(持续更新)
- DL之DNN优化技术:自定义MultiLayerNetExtend算法(BN层使用/不使用+权重初始值不同)对Mnist数据集训练评估学习过程
- 数学建模学习(4):数据统计与分析之假设检验
- Python Flask框架学习14:Flask 会话
- 学习Spring Boot:(六) 集成Swagger2
- guava学习--AsyncFunction
- 【Struts2学习笔记(2)】Action默认值和配置Action于result各种转发类型
- 一篇入门深度学习OCR:数据集和算法合集
- 强化学习(Reinforcement learning)是什么?
- QPS/接口容量如何评估学习
- 判别式模型和生成式模型区别——生成式是直接对数据本身的概率分布建模,判别式就是学习一个分类边界将不同类别区分开,前者是单刀直入、后者是曲线救国
- NASNet学习笔记—— 核心一:延续NAS论文的核心机制使得能够自动产生网络结构; 核心二:采用resnet和Inception重复使用block结构思想; 核心三:利用迁移学习将生成的网络迁移到大数据集上提出一个new search space。
- HarmonyOS鸿蒙学习笔记(18)类似Android SharedPreferences保存数据
- 【文献学习】Sparse Channel Estimation for OFDM-BasedUnderwater Acoustic Systems in Rician Fadingwith a New
- 最常用的Python库--机器学习和数据科学必备神器
- OpenCV-Python学习(20)—— OpenCV 图像几何变换之图像旋转(cv.warpAffine、cv.getRotationMatrix2D、cv.rotate、np.rot90)
- 快速入门大数据与机器学习基础专栏
- 【Xilinx AX7103 MicroBalze学习笔记5】MicroBlaze 串口中断实验