d3、Leaflet初步学习总结(附带d3代码示例)

以 netvrk map为例,在其官网中有大量地块信息汇聚成了所呈现给我们的地图,因此,我们在寻找一种方法能够将这些数据信息更加直观清晰的展示出来。以下是地图展示方式的选择过程:

D3.js(Data-Driven Documents)和Leaflet.js是两个流行的JavaScript库,用于创建可视化和地图应用。下面是对它们的简介:

D3.js:

D3.js是一个强大的数据可视化库,它提供了一系列用于处理和展示数据的功能和API。 D3.js使用Web标准(HTML、SVG和CSS)来创建动态、交互式和可定制的数据可视化。 它允许我们使用数据绑定和操作DOM元素的能力来创建各种图表、图形和数据驱动的可视化。 D3.js的核心理念是将数据和可视化元素进行关联,并通过数据的更新来实现动态更新和交互。

Leaflet.js:

Leaflet.js是一个开源的JavaScript库,用于在Web上创建交互式地图应用。 它提供了一组简单而强大的API,用于添加、显示和操作地图、标记、图层和交互元素。 Leaflet.js支持各种地图提供商(如OpenStreetMap、Mapbox等)以及自定义瓦片地图的集成。 它具有丰富的功能,例如交互式缩放和拖拽、标记和弹出框、图层管理和地理坐标系转换等。 Leaflet.js易于学习和使用,并且有一个活跃的开发社区,提供了广泛的插件和扩展功能。

总结来说,D3.js主要专注于数据可视化,提供了丰富的API和功能来创建各种类型的图表和可视化效果。而Leaflet.js则专注于地图应用,提供了简单而强大的API来创建交互式地图,并支持与各种地图提供商集成。我们可以根据具体的需求,可以选择使用D3.js和Leaflet.js来创建适合项目的数据可视化和地图应用。

在探究两种地图构造方式的过程中,他们的优缺点也是不容忽略的:

d3地图:

d3地图是基于JavaScript的数据驱动文档(Data-Driven Documents)库,主要用于创建动态、交互式和可定制化的数据可视化地图。其特点包括:

强大的可编程性:d3提供了丰富的API和组件,允许我们通过代码灵活地控制地图的各个方面,包括地理投影、数据绑定、样式设置等。

大量社区支持:d3地图拥有庞大的社区,可以找到疑难问题解答,帮助我们更好地理解和使用该工具。

数据驱动的可视化:D3.js 强调数据驱动的可视化,通过数据绑定和操作 DOM 元素,能够直接控制和定制地图元素,从而实现高度个性化的地图可视化。

然而,d3地图也存在一些缺点:

上手难度较高:学习和使用d3地图可能需要较长的时间和深入的JavaScript编程知识。

所需代码较多:相比其他地图库,d3地图需要编写更多的代码来创建和定制化地图,这可能增加开发和维护成本。

性能问题:由于d3地图将数据驱动的思想贯穿于整个可视化过程中,当处理大规模数据时,性能可能成为一个挑战。

Leaflet地图:

Leaflet是一个开源的JavaScript库,专注于友好的交互式地图。它具有以下特点:

简单易用:Leaflet提供了简单的API和丰富的功能,使得创建交互式地图变得更加容易。

轻量级和快速:Leaflet的文件体积较小,加载和渲染地图非常迅速,适合在移动设备上使用。

插件丰富:Leaflet拥有大量的插件和扩展,可以满足各种不同地图需求,例如标记、导航控制、地理编码等。

跨平台兼容性:Leaflet可以在各种现代浏览器和平台上运行,并且与其他地图服务商(如OpenStreetMap、Google Maps)兼容。

然而,Leaflet地图也有一些限制:

定制化能力相对较弱:与d3地图相比,Leaflet地图的可定制性较低,有时可能需要依赖额外的插件来实现高级定制需求。

功能相对简化:尽管Leaflet提供了许多功能,但与一些更复杂的地图库相比,它的功能集可能相对较简单。

数据驱动的可视化功能有限:Leaflet.js 旨在提供地图交互和显示功能,对于复杂的数据绑定和动态更新方面,不如 D3.js 强大。

我们的需求是实现数据量较多的netvrk,需要选择一个强大的数据可视化库,能够自定义和控制地图的每个方面的一个方式。结合上述两个库的特点,因此,我们决定使用d3地图。

接下来让我们来看一下在实现过程中遇到的问题和解决方法。

实现过程

先要加载数据,scale决定了地图投影的大小,transform决定了旋转缩放以后点的坐标,matrix获取一个元素的当前变换矩阵,可用于读取当前的平移、缩放、旋转等属性值。transform属性通常更直观和易读,而 matrix 属性则更适用于在复杂的变换操作中精确控制元素。

Svg中的形状有:circle(圆形)、rect(矩形)、ellipse(椭圆),line,polyline(折线),poltgon(多边形)和path(路径),其他的还有g元素(用来标记一组svg元素)和text

创建地理投影首选无论使用GeoJSON还是TopoJSON,都需要先定义地图的投影和地理路径生成器

// // 创建地理投影

const projection = d3.geoMercator();

3.d3.json()或者d3.csv()

通过d3.json或者d3.csv请求文件https://nft.netvrk.co/data/data.csv,并添加足够数量的rect,每一个rect都是用于绘制一个每一个地块的路径。

4.绘制图形,生成svg容器,生成地图路径并添加交互事件,其中d3.json()和d3.csv()用法是一样的,可以接收两个参数,第一个是要加载的文件的路径,第二个是加载并且解析完json文件以后执行的回调函数。它们都是异步加载的,换句话来说,浏览器在加载或者等待外部数据加载的时候,其他代码照样执行,而且不会受到影响,因此,回调函数后面的代码执行内容有可能先于回调函数本身。

5.可视化效果(鼠标移到某区域上会出现text,点击某区域会显示详情内容)

①svg.selectAll('rect')来获取到整个页面中的数据,.on可以实现鼠标移入和鼠标点击事件

②tooltip = svg.append('g')

里面可以添加一个弹框用来显示鼠标移入,其中,.attr用来设置样式,包括自定义符号、标记、颜色等内容

.attr('width', 180)

.attr('height',  20)

③tooltip.append('text')

用来显示鼠标移入框内展示的内容.style用来设置样式,包括自定义符号、标记、颜色等

.attr('x', 90) // 将文本的 x 坐标设置为矩形的一半,使其居中

.attr('y', 20)

④matrix 数据是一个元素的当前变换矩阵,可用于读取当前的平移、缩放、旋转等属性值,不可以直接使用,一共有六个值,

matrix(0.0211314 -0.9997767 0.9997767 0.0211314 4024.940918 5788.4077148)中间需要用空格隔开,

第一个值代表 x 方向的缩放因子。第二个值代表 x 方向的旋转和倾斜。第三个值代表 y 方向的旋转和倾斜。第四个值代表 y 方向的缩放因子。第五个值代表 x 方向的平移量。第六个值代表 y 方向的平移量。将每组数据的值注入rect中,可以得到数据的平移旋转等功能

⑤在点击放大和缩小按钮时,控制的是由id获取到的整个svg,CSS样式植入transform:scale()来控制具体的大小

6.不同区域的内容填充了不同的颜色来反应数据关联值

在定义的色值数组中,匹配到对应的时间区域和区域内同等级别的数据值来返回对应的色值,并且渲染页面

7.在渲染中,SVG 适用于需要精确控制、交互和大量图形元素的场景,而 Canvas 则更适用于需要高性能绘制和动画的情况。可以在不同的元素或视图上选择合适的渲染技术。

总结

综上所述,选择使用 D3.js 地图还是 Leaflet.js 地图取决于我们的具体需求和项目特点。如果需要高度个性化和自定义的地图可视化,以及与其他数据可视化的整合,D3.js 可能是更好的选择。而如果需要快速创建交互式地图,并与地图提供商集成,Leaflet.js 可能更适合我们的需求。在某些情况下,也可以结合使用这两个库,根据具体的需求选择合适的技术和功能。

代码示例:


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

推荐阅读更多精彩内容