交互故事地图零基础 DIY 指南

2019 年 7 月 16 日 智能交通技术

来源:城市数据派 

说到交互故事地图,是一种全新的图文内容叙述方式,结合地理位置,不仅仅是图文并茂,还支持在线交互,非常适合做历史文化、事件发展、防灾响应的展示。比如我们分享过很多案例:


可是,怎么做呢?为什么他们能做出这么好看的交互故事啊,我是小白甚至不会编程,有希望吗?


这篇 DIY 指南就是从天而降的小天使,帮助你迈出制作可视化交互故事的第一步!学过本教程,你也可以做出这样的交互故事地图了!


光晕特效、时间线等都不在话下!


指南预期效果


🎈在此献上在线体验入口。在公众号后台回复关键词「交互故事」,即可获得项目源码!


本指南由来自旧金山的 Mapbox 创意开发与技术布道师 LO BÉNICHOU(曾任 WIRED 前端开发工程师) 在 The Craig Newmark Graduate School of Journalism 进行的校园培训翻译而来。


Mapbox 创意开发与技术布道师 LO BÉNICHOU


🚪

课程相关数据和资源准备


Mapbox GL JS 交互地图


在学习的过程中你可能需要的资源和数据 ——

🔗  源代码和英文版课程

🔗  注册登陆 Mapbox 的入口

🔗  交互故事地图制作框架 Scrollama

🔗  纽约人口统计、经济和位置数据

🔗  纽约地铁线路数据

🔗  纽约地铁站数据

注意:数据已准备好供您使用。本课程不涉及数据清理和地理处理。不要将此数据用于出版。因为它需要进行事实检查,其中一些可能会丢失或无效。此数据仅用于演示数据驱动的样式。


这些是你在学习的时候,可能会需要的更深入的知识 ——

🔗  Mapbox 名词解释

🔗 Mapbox 可视化选情数据中文教程    ,涵盖了核心的概念,比如表达式

🔗  地图设计指南 (请关注 Mapbox 公众号回复 技术 获得,中文版即将出炉)

🔗  使用 Tippercanoe 将 GeoJSON 格式转化为 MBTiles


好了,下面就一起开始正式的学习吧。


🚪

数据格式介绍

这是很重要的开始,因为交互故事的内容,数据占到了一大半。而大部分开发者遇到的问题,除了数据源(前面都告诉你啦!),还有就是从网上下载或者自行制作的数据却浑然不知应该如何去使用。



那么下面我们就一个一个介绍一下。



Tileset

Tileset 是一组 Raster Data(以像素方式存储) 或 Vector Data(以点、线、多边形存储),被分为多达 22 个预设 Zoom Level 的均匀网格。在 Mapbox 库和 SDK 中,Tilesets 是地图的核心部分,它们也是我们用于确定 Map View 数量(就是 Pay-as-you-go 付费模式中的地图调用量)的主要机制。


 Tilesets 可被高度缓存并快速加载,由矢量切片(Vector Tiles)组成,用于快速缓存,缩放和提供地图。Mapbox Web 和移动端矢量瓦片(Vector Tiles)比栅格瓦片(Raster Tiles)小 75%。这样可以快速,平滑地从地图的世界视图缩放到街道级细节。 


顾名思义,矢量切片(Vector Tiles)含有的是矢量数据,而不是渲染图像。它们以紧凑的结构化格式包含了几何形状和元素 - 如道路名称,地名,门牌号码。矢量切片(Vector Tiles)仅在客户端请求时被渲染,例如 Web 浏览器或移动应用程序的请求,且是在客户端进行渲染。


Mapbox 文件类型

1. CSV

CSV(Comma-separated Value)是一种常见的表格数据,可以在 Excel 中打开,只有在含有坐标的时候,可以被绘制在地图上,比如下面的数据。



在上传 CSV 文件时,请注意以下事项:

  • 查看 Mapbox Upload API Documentation,了解 CSV 文件的大小限制。

  • CSV 文件必须采用 UTF-8 编码。

  • 在 Mapbox Studio 或 Mapbox Studio Classic 中上传时,CSV 文件必须包含坐标(纬度和经度)。

  • CSV 文件仅适用于点数据。


2. GeoJSON

GeoJSON 是 Mapbox Web Service 和 API 支持的地图数据的文件格式。作为 JSON 格式的子集,它可以在现代软件中被解析,并且可以原生支持 JavaScript 语言。



有几种开源工具可用于将其他地理空间数据格式转换为 GeoJSON:

  • togeojson, 一个用于转换 KML 和 GPX(XML格式)的节点包

  • ogr2ogr, 无敌强大的 40-in-1 矢量数据转换工具

  • geojson.io 用来创建、 转换和编辑 GeoJSON



3. MBTiles



MBTiles 是用于存储 Tilesets 的文件格式。它可以帮助您打包组成 Tilesets 的数千个文件,并便于移动,最终上传到 Mapbox 或在 Web 和移动应用程序中使用。MBTiles 是一个开放的规范,基于 SQLite数据库。MBTiles 可以存放 Raster Tiles 或 Vector Tilesets。



4. KML

KML 是一种类似于 GeoJSON 的文件格式,但在 Google 产品中更常用。相似之处是,与 GeoJSON 一样,它可以存储点,线,多边形和其他矢量数据;与 GeoJSON 不同的是,它基于 XML 而不是 JSON。



上传 KML 时,请注意 Mapbox 不支持任何 KML 扩展件。



5. GPX

GPX 或 GPS eXchange 格式是通常由 GPS 接收器创建的数据格式。您可以将 GPX 文件上传到 Mapbox 帐户,以便在自定义地图样式中使用。



请注意,Mapbox 不支持沿线的值(例如,沿着慢跑路线的各个点的高程和时间)。可以上载沿一行的值的 GPX 文件,但 Mapbox 将忽略该行的任何数据。



6. shapefile

shapefile,也称为 ESRI shapefile,是用于存储地理矢量数据的文件格式。



上传 shapefile 时,请注意以下几点:

  • 查看 Mapbox Uploads API 文档,了解 shapefile 的当前大小限制。请注意,此限制适用于 shapefile 的未压缩大小,而不是压缩 zip 的大小。

  • Shapefile 由几个单独的文件组成,在上传之前应该将它们组合成一个 zip 文件。在这些文件中,Mapbox 可以读取 shp,shx,dbf,prj 和 index 文件。使用 zip 文件上传的任何其他文件都将被忽略。


7. TIFF

TIFF(有时是TIF)是用于保存光栅图像的文件格式。使用 Mapbox,TIFF 通常是 GeoTIFF,这意味着文件嵌入了地理配准信息。



您可以在 Mapbox Studio 中将 TIFF 文件作为 tilesets 上传,并在 Mapbox Studio 样式编辑器中使用它们。上传 TIFF 文件时,请记住 TIFF 文件的当前大小限制。


几何类型

  • 线

  • 多边形

  • 多部分集合


🚪

几个训练的例子


在了解了数据格式之后,我们就可以开始上手 Mapbox 了,Mapbox 中有一些常见的定义:

  • 数据集(Dataset):编辑数据

  • Tileset:将您的数据烘焙到矢量瓦片中,或者上传栅格

  • 样式(Styles):在 Mapbox Studio 中自定义样式

  • 库(Libraries):使用 Mapbox 库将您的样式添加到应用程序中


训练一

  • 将数据上传到 Mapbox Studio 以对其进行样式设置

  • 使用 Mapbox GL JS 添加交互


训练二

  • 使用核心地图风格(dark,light,streets)

  • 使用 Mapbox GL JS 在前端添加数据

  • 使用 Mapbox GL JS 中的表达式设置数据样式


训练三

  • 在数据集编辑器(dataset editor)中上传数据

  • 编辑您的数据

  • 在 Mapbox Studio 中设计地图风格

  • 导出高分辨率 PNG 并在 Photoshop 中完成其余工作或按原样使用


👩‍🚀

样式设计工具 - Mapbox Studio


Mapbox Studio 可以帮助你处理数据的样式化。



我们在不久前为您准备了一套入门系统中文教程:地图界的 PS — Mapbox Studio 入门指南(中英文教程合集),还有官方操作手册文档,不过我们在这里再进行一些针对课程的介绍。


Tilesets

  • 矢量数据(Vector Data)的轻量集合

  • 渲染优化

  • 不可编辑


Mapbox 自带的 6 款 Tilesets 已经有一些在设置里面了,可以直接拿来用,包括卫星数据、街道、地形等等。



Mapbox Studio 所支持的数据文件


如果想要自己上传数据要注意支持的数据类型。




Mapbox Studio 仪表板

进入 Mapbox Studio




地图样式

Mapbox Studio 中已经有一些核心样式了,你可以直接拿来使用,或者创建新的空白样式,自己发挥,也支持上传 JSON 样式文件。



Mapbox Studio 的地图图层类型


  • Fill

  • Fill-extrusion

  • Line

  • Circle

  • Symbol

  • Heatmap

  • Hillshade

  • Raster


图层(Layer)的类型必须是上面几个之一。通过 Mapbox GL JS 文档的样式规范部分,我们可以了解到这些类型的含义👇


  • Fill - 带有可选边框的多边形

  • Fill-extrusion - 具有 3D 拉伸多边形

  • Line - 线

  • Circle - 一个圆

  • Symbol - 一个标志或者文本

  • Heatmap - 热力图

  • Hillshade - 基于 DEM 数据的客户端山体阴影可视化,目前仅支持 Mapbox Terrain RGB。


数据上传、样式都搞定了以后,我们下面就要进阶交互设计了!有请 Mapbox GL JS 👏


👩‍🚀

交互设计工具 - Mapbox GL JS


Mapbox GL JS 是强大的 JavaScript 库,可以帮助你制作酷炫、高度自定义的交互地图。当你按照Mapbox 样式规范设计好地图后,Mapbox GL JS 会将它与矢量瓦片结合(符合 Mapbox 矢量瓦片规范),并用 WebGL 渲染出来。


Mapbox Studio 能做的,Mapbox GL JS 基本上都可以做,比如添加数据👇


在地图上添加矢量瓦片数据


您可以在这个 Github Repo 了解更多关于 Mapbox GL JS 的内容。


一些常见概念

  • Mapbox GL JS 使用 WebGL,允许浏览器访问您的计算机 GPU(使其更快)

  • 它使用名为 Canvas 的 HTML 元素

  • 您可以设置数据样式,添加数据,添加交互性等


第一步:在页面上显示一张地图并显示自定义图层

我们可以参考 Mapbox GL JS 的文档中 Display a map 的例子。将下面的代码复制到文本中,保存并修改后缀为.html,再用浏览器打开。



<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8' />
<title>Display a map</title>
<meta name='viewport' content='initial-scale=1,maximum-scale=1,user-scalable=no' />
<script src='https://api.tiles.mapbox.com/mapbox-gl-js/v0.54.0/mapbox-gl.js'></script>
<link href='https://api.tiles.mapbox.com/mapbox-gl-js/v0.54.0/mapbox-gl.css' rel='stylesheet' />
<style>
body { margin:0; padding:0; }
#map { position:absolute; top:0; bottom:0; width:100%; }
</style>
</head>
<body>

<div id='map'></div>
<script>
mapboxgl.accessToken = 'pk.eyJ1IjoibWFwYm94bWF4IiwiYSI6ImNqbnY4MHM3azA2ZmkzdnBnMThvNzRoZ28ifQ.IffqPZGkhcdPjnZ2dmSO6w';
var map = new mapboxgl.Map({
container: 'map', // container id
style: 'mapbox://styles/mapbox/streets-v11', // stylesheet location
center: [-74.50, 40], // starting position [lng, lat]
zoom: 9 // starting zoom
});
</script>

</body>
</html>



你可以看到地图已经显示出来了。



如果想要修改样式,可以替换 style 后边的 mapbox://styles/mapbox/streets-v11 为你设计样式的 style URL (点击 Mapbox Studio 右上角的 share  - use - Style URL 即可)



如果还是不太明白,可以参考 Mapbox GL JS 的文档中 Display a map with a custom Layer 的例子,您可以将两部分代码进行比较,找到差异,就知道什么地方变动导致了地图样式的改变。


第二步:使用 Mapbox GL JS 添加地图交互

在 Mapbox GL JS 文档中,我们提供了 26 种交互方式的源码。


部分交互案例


因为代码比较多,您可以看图片了解源码。


「打开方式」是一样的,类似于显示地图,将代码复制到文本中,保存并修改后缀为.html,再用浏览器打开。


交互1:设置图层并调整透明度


交互2:点击标签让地图居中


交互3:改变图层的颜色


交互4:用声音控制地图的律动


交互5:禁用地图旋转


交互6:创建一个可以拖拽的 Marker


交互7:创建一个可以拖拽的点


交互8: 输入文字对 Marker 过滤显示


交互9: 展示无交互的地图


交互10: 改变地图的语言


交互11: 测量地图上的距离


交互12: 查找过滤地图的 Marker


交互13: 通过点击列表过滤 Marker


交互14: 获取鼠标点击位置的坐标


交互15: 高亮显示相同数据的区域


交互16: 点击显示附近的特征


交互17: 显示光标对应的代码


交互18: 限制地图平移在某个区域


交互19: 改变地图的样式


交互20: 创建时间进度条


交互21: 在地图上启用或禁用 UI


交互22: 根据缩放尺度更新等值区


交互23: 根据国家调整边界


交互24: 按住 Shift 选择高亮区域


交互25: 快速缩放至正好包括路线


交互26: 创建光晕特效


交互27: 在不同地点间平滑飞跃


这么多种交互方式,相信你一定已经找到自己喜欢的交互方式,并且跃跃欲试了吧!


这里再奉上几个快捷入口,帮助你进阶:

  • Mapbox GL JS 图层案例

  • Mapbox GL JS 表达式(稍微有点难)

  • Mapbox GL 过滤器

    • https://docs.mapbox.com/mapbox-gl-js/api/#map#setfilter


👩‍🚀

最终的效果(你的一定会更好)


在线访问


在公众号后台回复关键词“交互故事”,即可获得项目源码!


如果你觉得本文干货满满,就请不吝分享和点“在看”哦!!


文章来自公众号:Mapbox (微信号:Mapbox_China)



登录查看更多
0

相关内容

一份简明有趣的Python学习教程,42页pdf
专知会员服务
76+阅读 · 2020年6月22日
【实用书】Python机器学习Scikit-Learn应用指南,247页pdf
专知会员服务
264+阅读 · 2020年6月10日
Python地理数据处理,362页pdf,Geoprocessing with Python
专知会员服务
113+阅读 · 2020年5月24日
【干货书】R语言书: 编程和统计的第一课程,
专知会员服务
111+阅读 · 2020年5月9日
【实用书】流数据处理,Streaming Data,219页pdf
专知会员服务
76+阅读 · 2020年4月24日
【经典书】Python数据数据分析第二版,541页pdf
专知会员服务
192+阅读 · 2020年3月12日
【电子书】C++ Primer Plus 第6版,附PDF
专知会员服务
87+阅读 · 2019年11月25日
【泡泡机器人】也来谈语义SLAM/语义地图
泡泡机器人SLAM
21+阅读 · 2019年3月12日
R_leaflet包_最易上手地图教程(一)
R语言中文社区
10+阅读 · 2019年3月6日
说说我的老同事,前端大神程劭非
余晟以为
17+阅读 · 2019年1月14日
零基础人工智能入门(附源码)
PaperWeekly
6+阅读 · 2018年12月16日
从零开始一起学习SLAM | 学习SLAM到底需要学什么?
计算机视觉life
8+阅读 · 2018年9月9日
编程和数学基础不佳如何入门人工智能?
大数据技术
6+阅读 · 2018年1月3日
使用人工智能增强人类智能(下)
论智
5+阅读 · 2017年12月9日
一张通往计算机世界的地图
中科院物理所
8+阅读 · 2017年10月12日
MATLAB人工神经网络教程
七月在线实验室
8+阅读 · 2017年9月6日
Arxiv
10+阅读 · 2019年2月19日
Relational recurrent neural networks
Arxiv
8+阅读 · 2018年6月28日
Arxiv
11+阅读 · 2018年5月21日
Arxiv
6+阅读 · 2018年3月28日
Arxiv
4+阅读 · 2018年1月29日
VIP会员
相关VIP内容
一份简明有趣的Python学习教程,42页pdf
专知会员服务
76+阅读 · 2020年6月22日
【实用书】Python机器学习Scikit-Learn应用指南,247页pdf
专知会员服务
264+阅读 · 2020年6月10日
Python地理数据处理,362页pdf,Geoprocessing with Python
专知会员服务
113+阅读 · 2020年5月24日
【干货书】R语言书: 编程和统计的第一课程,
专知会员服务
111+阅读 · 2020年5月9日
【实用书】流数据处理,Streaming Data,219页pdf
专知会员服务
76+阅读 · 2020年4月24日
【经典书】Python数据数据分析第二版,541页pdf
专知会员服务
192+阅读 · 2020年3月12日
【电子书】C++ Primer Plus 第6版,附PDF
专知会员服务
87+阅读 · 2019年11月25日
相关资讯
【泡泡机器人】也来谈语义SLAM/语义地图
泡泡机器人SLAM
21+阅读 · 2019年3月12日
R_leaflet包_最易上手地图教程(一)
R语言中文社区
10+阅读 · 2019年3月6日
说说我的老同事,前端大神程劭非
余晟以为
17+阅读 · 2019年1月14日
零基础人工智能入门(附源码)
PaperWeekly
6+阅读 · 2018年12月16日
从零开始一起学习SLAM | 学习SLAM到底需要学什么?
计算机视觉life
8+阅读 · 2018年9月9日
编程和数学基础不佳如何入门人工智能?
大数据技术
6+阅读 · 2018年1月3日
使用人工智能增强人类智能(下)
论智
5+阅读 · 2017年12月9日
一张通往计算机世界的地图
中科院物理所
8+阅读 · 2017年10月12日
MATLAB人工神经网络教程
七月在线实验室
8+阅读 · 2017年9月6日
Top
微信扫码咨询专知VIP会员