D3.js 生成地图
地理空间坐标通常用于天气或人口数据。D3.js 为我们提供了三种地理数据工具 -
Paths- 它们产生最终像素。
Projections- 他们将球体坐标转换为笛卡尔坐标和
Streams- 他们加快了速度。
在了解 D3.js 中的地理是什么之前,我们应该了解以下两个术语 -
D3 地理路径和
预测
让我们详细讨论这两个术语。
D3 地理路径
它是一个地理路径生成器。GeoJSON 生成 SVG 路径数据字符串或将路径呈现到 Canvas。建议将 Canvas 用于动态或交互式投影以提高性能。要生成 D3 地理路径数据生成器,您可以调用以下函数。
d3.geo.path()
在这里,d3.geo.path()路径生成器函数允许我们选择要使用哪个地图投影来将地理坐标转换为笛卡尔坐标。
例如,如果我们要显示印度的地图详细信息,我们可以定义如下所示的路径。
var path = d3.geo.path()svg.append("path") .attr("d", path(states))
预测
投影将球面多边形几何体转换为平面多边形几何体。D3 提供了以下投影实现。
方位角- 方位角投影将球体直接投影到平面上。
复合- 复合由多个投影组成,这些投影组合成一个显示器。
圆锥- 将球体投影到圆锥上,然后将圆锥展开到平面上。
圆柱- 圆柱投影将球体投影到包含圆柱体上,然后将圆柱体展开到平面上。
要创建新投影,您可以使用以下函数。
d3.geoProjection(project)
它从指定的原始投影项目构造一个新的投影。项目函数以弧度为单位获取给定点的经度和纬度。您可以在代码中应用以下投影。
var width = 400var height = 400var projection = d3.geo.orthographic() var projections = d3.geo.equirectangular()var project = d3.geo.gnomonic()var p = d3.geo.mercator()var pro = d3.geo.transverseMercator() .scale(100) .rotate([100,0,0]) .translate([width/2, height/2]) .clipAngle(45);
在这里,我们可以应用上述任何一种预测。让我们简要讨论这些预测中的每一个。
d3.geo.orthographic() - 正交投影是一种适合显示单个半球的方位投影;视角在无穷远处。
d3.geo.gnomonic() - gnomonic 投影是一种方位投影,将大圆投影为直线。
d3.geo.equirectangular() - equirectangular是最简单的地理投影。身份函数。它既不是等面积的也不是等角的,但有时用于栅格数据。
d3.geo.mercator() - 平铺映射库通常使用球面墨卡托投影。
d3.geo.transverseMercator() - 横轴墨卡托投影。
工作示例
让我们在此示例中创建印度地图。为此,我们应该坚持以下步骤。
步骤 1 -应用样式- 让我们使用下面的代码在地图中添加样式。
<style> path { stroke: white; stroke-width: 0.5px; fill: grey; } .stateTN { fill: red; } .stateAP { fill: blue; } .stateMP{ fill: green; }</style>
在这里,我们为状态 TN、AP 和 MP 应用了特定的颜色。
第 2 步-包含 topojson 脚本- TopoJSON 是 GeoJSON 的扩展,它对拓扑进行了编码,定义如下。
<script src = "http://d3js.org/topojson.v0.min.js"></script>
我们可以在我们的编码中包含这个脚本。
第 3 步-定义变量- 使用以下代码在脚本中添加变量。
var width = 600;var height = 400;var projection = d3.geo.mercator() .center([78, 22]) .scale(680) .translate([width / 2, height / 2]);
这里,SVG 宽度为 600,高度为 400。屏幕是一个二维空间,我们试图呈现一个三维对象。因此,我们可以使用d3.geo.mercator()函数严重扭曲土地大小/形状。
中心被指定为 [78, 22],这将投影的中心设置为指定的位置作为经度和纬度的二元素数组,以度为单位,并返回投影。
在这里,地图以西经 78 度和北纬 22 度为中心。
Scale 指定为 680,这会将投影的比例因子设置为指定值。如果未指定比例,则返回当前比例因子,默认为 150。请务必注意比例因子在投影之间不一致。
第 4 步-附加 SVG - 现在,附加 SVG 属性。
var svg = d3.select("body").append("svg") .attr("width", width) .attr("height", height);
第 5 步-创建路径- 以下代码部分创建了一个新的地理路径生成器。
var path = d3.geo.path() .projection(projection);
此处,路径生成器 (d3.geo.path()) 用于指定投影类型 (.projection),该类型之前定义为使用变量投影的墨卡托投影。
第 6 步-生成数据- indiatopo.json - 该文件包含很多记录,我们可以从以下附件中轻松下载。
下载indiatopo.json 文件
下载文件后,我们可以将其添加到我们的 D3 位置。示例格式如下所示。
{"type":"Topology","transform":{"scale":[0.002923182318231823,0.0027427542754275428],"translate":[68.1862,8.0765]},"objects":{"states":{"type":"GeometryCollection","geometries":[{"type":"MultiPolygon","id":"AP","arcs":[[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34]],[[35,36,37,38,39,40,41]],[[42]],[[43,44,45]],[[46]],[[47]],[[48]],[[49]],[[50]],[[51]],[[52,53]],[[54]],[[55]],[[56]],[[57,58]],[[59]],[[60]],[[61,62,63]],[[64]],[[65]],[[66]],[[67]],[[68]],[[69]],[[-41,70]],[[71]],[[72]],[[73]],[[74]],[[75]]],"properties":{"name":"Andhra Pradesh"}},{"type":"MultiPolygon","id":"AR","arcs":[[[76,77,78,79,80,81,82]]],"properties":{"name":"Arunachal Pradesh"}},{"type":"MultiPolygon","id":"AS","arcs":[[[83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103]],[[104,105,106,107]],[[108,109]]], ..............................................
第 7 步-绘制地图- 现在,从indiatopo.json文件中读取数据并绘制地图。
d3.json("indiatopo.json", function(error, topology) { g.selectAll("path") .data(topojson.object(topology, topology.objects.states) .geometries) .enter() .append("path") .attr("class", function(d) { return "state" + d.id; }) .attr("d", path)});
在这里,我们将加载带有印度地图 (indiatopo.json) 坐标的 TopoJSON 文件。然后我们声明我们将对图形中的所有路径元素进行操作。它被定义为,g.selectAll(“path”)。然后,我们将从 TopoJSON 文件中提取定义国家/地区的数据。
.data(topojson.object(topology, topology.objects.states) .geometries)
最后,我们将使用.enter()方法将其添加到我们将要显示的数据中,然后使用.append(“path”)方法将该数据附加为路径元素。