Geographies
地理空间坐标通常用于天气或人口数据。 D3.js为我们提供了三种地理数据工具 -
Paths - 它们产生最终像素。
Projections - 它们将球体坐标转换为笛卡尔坐标和
Streams - 他们加快了速度。
在了解D3.js中的地理位置之前,我们应该了解以下两个术语 -
- D3地理路径和
- Projections
让我们详细讨论这两个术语。
D3地理路径
它是一个地理路径生成器。 GeoJSON生成SVG路径数据字符串或呈现Canvas的路径。 建议使用Canvas进行动态或交互式投影以提高性能。 要生成D3地理路径数据生成器,您可以调用以下函数。
d3.geo.path()
这里, d3.geo.path()路径生成器函数允许我们选择我们想要用于从地理坐标到笛卡尔坐标的平移的地图投影。
例如,如果我们想要显示印度的地图细节,我们可以定义如下所示的路径。
var path = d3.geo.path()
svg.append("path")
.attr("d", path(states))
预测(Projections)
投影将球面多边形几何转换为平面多边形几何。 D3提供以下投影实现。
Azimuthal - Azimuthal投影将球体直接投射到平面上。
Composite - Composite由多个投影组成,这些投影组成一个显示。
Conic - 将球体投影到圆锥体上,然后将圆锥体展开到平面上。
Cylindrical - 圆柱形投影将球体投射到容纳圆柱体上,然后将圆柱体展开到平面上。
要创建新投影,可以使用以下功能。
d3.geoProjection(project)
它从指定的原始投影项目构建新投影。 项目函数以弧度为单位获取给定点的经度和纬度。 您可以在代码中应用以下投影。
var width = 400
var height = 400
var 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() - d3.geo.equirectangular()是最简单的地理投影。 身份功能。 它既不是等面积也不是保形,但有时用于栅格数据。
d3.geo.mercator() - 球形墨卡托投影通常由平铺映射库使用。
d3.geo.transverseMercator() - 横向墨卡托投影。
工作示例 (Working Example)
让我们在这个例子中创建印度地图。 为此,我们应该遵循以下步骤。
Step 1 - Apply styles - 让我们使用下面的代码在地图中添加样式。
<style>
path {
stroke: white;
stroke-width: 0.5px;
fill: grey;
}
.stateTN { fill: red; }
.stateAP { fill: blue; }
.stateMP{ fill: green; }
</style>
在这里,我们为状态TN,AP和MP应用了特定的颜色。
Step 2 - Include topojson script - TopoJSON是GeoJSON的扩展,它对拓扑进行编码,如下所述。
<script src = "http://d3js.org/topojson.v0.min.js"></script>
我们可以在编码中包含此脚本。
Step 3 - Define variables - 使用下面的代码在脚本中添加变量。
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度。
比例指定为680,这将投影的比例因子设置为指定值。 如果未指定比例,则返回当前比例因子,默认为150.重要的是要注意比例因子在投影之间不一致。
Step 4 - Append SVG - 现在,附加SVG属性。
var svg = d3.select("body").append("svg")
.attr("width", width)
.attr("height", height);
Step 5 - Create path - 以下代码部分创建了一个新的地理路径生成器。
var path = d3.geo.path()
.projection(projection);
这里,路径生成器(d3.geo.path())用于指定投影类型(.projection),之前使用变量投影定义为墨卡托投影。
Step 6 - Generate data - indiatopo.json - 此文件包含许多记录,我们可以从以下附件轻松下载。
下载indiatopo.json file
下载文件后,我们可以添加我们的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]]], ......
........................................
Step 7 - Draw map - 现在,从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”)方法将该数据作为路径元素追加。
<!--Step 8 − Working Example − The complete code listing is given in the following code block. Create a webpage called geomap.html and add the following changes to it.
<!DOCTYPE html> <html> <head> <meta charset = "UTF-8"> <title>D3 India Map</title> <style> path { stroke: white; stroke-width: 0.5px; fill: grey; } .stateTN { fill: red; } .stateAP { fill: blue; } .stateMP{ fill: green; } </style> <script src = "http://d3js.org/d3.v3.min.js"></script> <script src = "http://d3js.org/topojson.v0.min.js"></script> </head> <body> <script type = "text/javascript"> var width = 600; var height = 400; var projection = d3.geo.mercator() .center([78, 22]) .scale(680) .translate([width/2, height/2]); var svg = d3.select("body") .append("svg") .attr("width", width) .attr("height", height); var path = d3.geo.path().projection(projection); var g = svg.append("g"); 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) }); </script> </body> </html>-->