一、简介

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

  

  

  

(数据科学学习手札42)folium进阶内容介绍的更多相关文章

  1. (数据科学学习手札61)xpath进阶用法

    一.简介 xpath作为对网页.对xml文件进行定位的工具,速度快,语法简洁明了,在网络爬虫解析内容的过程中起到很大的作用,除了xpath的基础用法之外(可参考我之前写的(数据科学学习手札50)基于P ...

  2. (数据科学学习手札44)在Keras中训练多层感知机

    一.简介 Keras是有着自主的一套前端控制语法,后端基于tensorflow和theano的深度学习框架,因为其搭建神经网络简单快捷明了的语法风格,可以帮助使用者更快捷的搭建自己的神经网络,堪称深度 ...

  3. (数据科学学习手札55)利用ggthemr来美化ggplot2图像

    一.简介 R中的ggplot2是一个非常强大灵活的数据可视化包,熟悉其绘图规则后便可以自由地生成各种可视化图像,但其默认的色彩和样式在很多时候难免有些过于朴素,本文将要介绍的ggthemr包专门针对原 ...

  4. (数据科学学习手札50)基于Python的网络数据采集-selenium篇(上)

    一.简介 接着几个月之前的(数据科学学习手札31)基于Python的网络数据采集(初级篇),在那篇文章中,我们介绍了关于网络爬虫的基础知识(基本的请求库,基本的解析库,CSS,正则表达式等),在那篇文 ...

  5. (数据科学学习手札49)Scala中的模式匹配

    一.简介 Scala中的模式匹配类似Java中的switch语句,且更加稳健,本文就将针对Scala中模式匹配的一些基本实例进行介绍: 二.Scala中的模式匹配 2.1 基本格式 Scala中模式匹 ...

  6. (数据科学学习手札47)基于Python的网络数据采集实战(2)

    一.简介 马上大四了,最近在暑期实习,在数据挖掘的主业之外,也帮助同事做了很多网络数据采集的内容,接下来的数篇文章就将一一罗列出来,来续写几个月前开的这个网络数据采集实战的坑. 二.马蜂窝评论数据采集 ...

  7. (数据科学学习手札40)tensorflow实现LSTM时间序列预测

    一.简介 上一篇中我们较为详细地铺垫了关于RNN及其变种LSTM的一些基本知识,也提到了LSTM在时间序列预测上优越的性能,本篇就将对如何利用tensorflow,在实际时间序列预测任务中搭建模型来完 ...

  8. (数据科学学习手札36)tensorflow实现MLP

    一.简介 我们在前面的数据科学学习手札34中也介绍过,作为最典型的神经网络,多层感知机(MLP)结构简单且规则,并且在隐层设计的足够完善时,可以拟合任意连续函数,而除了利用前面介绍的sklearn.n ...

  9. (数据科学学习手札32)Python中re模块的详细介绍

    一.简介 关于正则表达式,我在前一篇(数据科学学习手札31)中已经做了详细介绍,本篇将对Python中自带模块re的常用功能进行总结: re作为Python中专为正则表达式相关功能做出支持的模块,提供 ...

随机推荐

  1. SVN安装操作流程

    SVN 安装操作流程 1.服务端安装流程 1.1 双击打开svn-server安装包 1.2 点击Next 1.3 勾选上“I accert the terms in the License Agre ...

  2. 解决Ubuntu启动错误——kernel panic not syncing vfs unable to mount root fs on unknown-block 0 0 – error

    最近在倒腾Ubuntu,然后想着怎么美化一下界面,于是照着网上的教程整了一下Flatabulous这个软件,然后好像/boot就满了.关机之后再开机就出现了如题所述的错误,无法开机,也无法进入reco ...

  3. 哈哈,原来IOC容器的bean是存在DefaultSingletonBeanRegistry的一个Map类型的属性当中。

    经过查看源代码发现IOC容器中的bean实例(不知道是不是所有的bean)是存储在一个DefaultSingletonBeanRegistry类实例的一个Map类型的属性当中. 下面是DefaultS ...

  4. codeforces 814E An unavoidable detour for home

    题目链接 正解:$dp$. 感觉这道题就是中国象棋的加强版..我们要发现一些性质. 首先就是这个图肯定是一个按照$bfs$序分层的图,且每个点只往自己上面那一层连了一条边,每个点不可能向自己的上面超过 ...

  5. thinkPHP输出sql语句(3.2和5.0通用)

    //5.0$qwe = db::table('think_user')->where('id',1)->fetchsql()->column('name'); dump($qwe); ...

  6. es6之数组方法

    //兼容插件 babel-polyfill values()等存在兼容问题,需要加载babel-polyfill插件 .keys()  获取数组的key值 .values()  获取数组的value值 ...

  7. 说说DBA职责和目标

    数据库管理员(Database Administrator,简称DBA),是从事管理和维护数据库管理系统(DBMS)的相关工作人员的统称,他属于运维工程师的一个分支,主要负责业务数据库从设计.测试到部 ...

  8. 手机端app开发初识

    1.所需软件说明 百度云下载链接: https://pan.baidu.com/s/1-TEQZP9QbJSlGSYedyAUFw密码: 2z8l 或者官方链接: Hbuilder:http://ww ...

  9. Java中的IO流(四)

    上一篇<Java中的IO流(三)>把IO流中的文件及目录操作的对象File类记录了一下,本篇把本不属性IO流但又和IO流有关系的一个对象作一下记录,此对象本属于集合框架里的一个子集,即Pr ...

  10. iOS:PrefixHeader / 头文件 / 宏定义(18-03-02更)

    宏定义,不一定放在PCH文件,可能放在一个.h文件,再用PCH包含进来. 1.屏幕尺寸 // 屏幕尺寸 #define kSCREEN_WIDTH [UIScreen mainScreen].boun ...