d3-geo

https://github.com/d3/d3-geo

仅作阅读理解API文档时的参考,如有错误麻烦指正,多谢~

Map projections are sometimes implemented as point transformations.
地图投影有时会由点转换实现。

This is a reasonable mathematical approach if your geometry consists of continuous, infinite point sets. Yet computers do not have infinite memory, so we must instead work with discrete geometry such as polygons and polylines!
如果你的球面几何由连续的无限点集合组成,这是一个合理的数学方法。 由于计算机没有无限的内存,因此我们必须使用离散的几何图形,如多边形和折线!

Discrete geometry makes the challenge of projecting from the sphere to the plane much harder. The edges of a spherical polygon are geodesics (segments of great circles), not straight lines. Projected to the plane, geodesics are curves in all map projections except gnomonic, and thus accurate projection requires interpolation along each arc. D3 uses adaptive sampling inspired by a popular line simplification method to balance accuracy and performance.
使用离散的几何图形进行球面投影到平面是非常困难的。球形的多边形的边缘是测地线,而不是直线。投影到平面,测地线是所有地图投影(除了点切投影)的曲线,因此准确的投影需要沿着每个弧线进行插值。D3使用自适应采样(受一种流行的线简化方法而启发得到的)方法来平衡精准度和性能。

The projection of polygons and polylines must also deal with the topological differences between the sphere and the plane. Some projections require cutting geometry that crosses the antimeridian, while others require clipping geometry to a great circle. Furthermore, spherical polygons require a winding order convention to determine which side of the polygon is the inside: D3 and TopoJSON use clockwise winding. (Spherical polygons can be larger than a hemisphere! See also ST_ForceRHR in PostGIS.)
多边形和折线的投影还必须处理球体与平面之间的拓扑差异。一些投影需要穿过对向子午线切割球体,另一些投影需要将球体裁剪成一个大圆。此外,球形多边形需要一个环绕的顺序约定来决定多边形的哪边是内侧:D3和TopoJSON采用的是顺时针顺序。(球面多边形可以大于半球!另请参见PostGIS中的ST_ForceRHR。)

D3’s approach affords great expressiveness: you can choose the right projection, and the right aspect, for your data. D3 supports a wide variety of common and unusual map projections. For more, see Part 2 of The Toolmaker’s Guide.
D3提供了丰富的表现力:您可以为您的数据选择正确的投影和正确的方面。D3提供多种常见和不常见的地图投影。有关更多信息,请参阅 The Toolmarker's Guide的Part2 。

D3 uses GeoJSON to represent geographic features in JavaScript. (See also TopoJSON, an extension of GeoJSON that is significantly more compact and encodes topology.) To convert shapefiles to GeoJSON, use ogr2ogr, part of the GDAL package. In addition to map projections, D3 includes useful spherical shape generators and spherical math utilities.
D3使用GeoJSON来展示JavaScript中的地理要素。(另请参阅TopoJSON,它是GeoJSON的扩展,它大大的压缩和编码了拓扑布局。)要将shapefiles转换为GeoJSON,请使用ogr2ogr,它是GDAL软件包的一部分。 除了地图投影,D3包括有用的球形生成器和球面数学实用工具。

安装

<script src="https://d3js.org/d3-array.v1.min.js"></script>
<script src="https://d3js.org/d3-geo.v1.min.js"></script>
<script>
var projection = d3.geoAlbers(), 
    path = d3.geoPath(projection);
</script>

地图数据

如何获取中国地图的 GeoJSON 文件呢,真的有点麻烦,可以参照: https://github.com/clemsos/d3-china-map 进行制作。

Mark

  • 中国地图的 GeoJSON 文件: china.geojson
  • 各县的JSON地图文件:mapdata.zip
    解压缩后有两个文件夹和一个 JSON 文件:
    geometryCouties:各市~县的数据
    geometryProvince:各省~市的数据
    china.json:中国~省的数据
  • 【 地图系列 】 世界地图和主要国家的 JSON 文件:
    http://www.ourd3js.com/wordpress/668/

API

Paths

地理路径生成器d3.geoPath类似于d3-shape中的形状生成器:给定GeoJSON几何结构或特征对象,它生成SVG path数据字符串或渲染到Canvas的path。 动态或交互式投影中推荐使用Canvas,以提高性能。 Path数据可以在投影或变换一起使用,也可用于将平面几何直接渲染成Canvas或SVG。

var path = d3.geoPath(projection); //创建一个新的地理路径生成器。
path(object); //返回对象的路径;
path.area(object) //计算给定要素的投影面积;
path.bounds(object) //计算给定要素的投影边界。
path.centroid(object) //计算给定要素的投影中心。
path.context(context) //设置渲染上下文,可设置canvas的context。
path.context() //取得渲染上下文。
path.pointRadius(radius) //设置点要素的半径。
path.pointRadius() //取得点要素的半径。
path.projection(projection) //设置地理投影。
path.projection() //设置地理投影。

Projections(投影)

投影将球形多边形转换为平面多边形。 D3提供了几类标准投影的实现:

var projection = d3.geoMercator();
projection(point) // 投影指定的位置,参数为经纬度[longitude,latitude],获得指定位置的坐标[x,y]。
projection.invert(point) // 为指定的位置反转投影,参数为[x,y],获得指定坐标的经纬度[longitude,latitude]。
projection.stream(stream) // 包装指定的流监听器,投影输入的几何图形。
projection.clipAngle(angle) //设置投影的裁剪圆半径,指定角度并返回投影。如果角度为null,切换到子午线切割,而不是小圈的裁剪。
projection.clipAngle() //返回当前裁剪的角度,默认为空。小圈裁剪是独立于通过clipExtent的视窗裁剪。
projection.clipExtent(extent) // 设置投影的剪辑视窗范围为指定的边界(以像素为单位)。extent 范围边界被指定为一个数组[[x0, y0], [x1,y1]],其中x0 是视窗的左侧,y0 是顶部,x1 为右侧和y1 是底部。如果范围为null,则视窗裁剪不执行。
projection.clipExtent() // 返回当前视窗裁剪的范围,默认为null。视窗裁剪是独立于通过clipAngle的小圈剪裁。
projection.scale(scale) // 设置投影的比例尺为特定的值,并返回投影。
projection.scale() // 返回投影的比例尺。
projection.translate(point) // 如果point 点指定了,则设置投影转变的位移为指定的二元数组[x, y]并返回的投影。如果未指定点,则返回当前变换的位移,默认为[480, 250]。变换的位移确定投影的中心像素坐标。默认转换位移的位置是⟨0°,0°⟩,在一个960×500区域的中心。
projection.center(location) //如果center 重心指定了,则设置投影中心为指定的位置,经度和纬度度数的两元数组,并返回投影。如果没有指定中心,则返回当前的中心,默认为⟨0°,0°⟩。
projection.rotate(rotation) // 如果rotation 旋转指定了,设置投影的三轴旋转为指定的角度λ,φ和γ(偏航角,倾斜角和滚动角,或等效地经度,纬度和滚动),以度并返回投影。如果rotation 未指定,返回当前缺省的转动值[0, 0, 0]。如果rotation 指定且只有两个值,而不是3个值,那么滚动的角度被假设为0°。
projection.precision(precision) // 如果precision 精度指定了,则设置投影自适应重采样的临界值为指定的值,以像素为单位,并返回投影。此值对应于Douglas–Peucker 距离。如果precision 精度没有指定,则返回投影当前重采样的精度,其精度默认为Math.SQRT(1/2)。0的精密度禁止自适应重采样。
projection.fitExtend(extend,object) // 设置给定范围,对投影进行缩放和平移,以适合给定的范围并居中。 范围指定为数组[[x 0,y 0],[x 1,y 1]],其中x 0是边界框的左边,y 0是顶部,x 1是右边,y 1是底部。 返回投影。
projection.fitSize(size,object) // fitExtend的简单写法,左上角为[0,0]。

antimeridian cutting:http://bl.ocks.org/mbostock/3788999

示例

<!doctype html>
<html>
<head>    
<meta charset="utf-8">   
 <title></title>   
 <style>        
body{   background: #21395b;        }    
</style>
</head>
<body>
<svg></svg>
<script src="/bower_components/d3/d3.js"></script>
<script> 
   var width = 1300; 
   var height = 1000;  
   var padding = 20;
   var g = d3.select('svg')
           .attr('width',width) 
           .attr('height',height) 
           .append('g'); 
   var root; 
   var projection,path;
   function color(i) {  return '#0e2338';    } 

   d3.json('china.json',function (data) { 
       root = data; 
       //设置投影 
       projection = d3.geoMercator()
       projection.fitExtent([[padding,padding],[width-padding*2,height-padding*2]],root);
       //projection.fitSize([width,height],root);
       //生成地理路径
       path = d3.geoPath(projection);
       update();
   }); 

   function update() { 
       g.selectAll("path") 
               .data(root.features)
               .enter() 
               .append("path")
               .attr("stroke","#234060") 
               .attr("stroke-width",1)
               .attr("fill", function(d,i){ 
                   return color(i);  
               })
              .attr("d", path )   //使用地理路径生成器
              .on("mouseover",function(d,i){
                    d3.select(this) 
                           .attr("fill","green");  
              }) 
              .on("mouseout",function(d,i){ 
                   d3.select(this)
                            .attr("fill",color(i));  
              }); 
       g.selectAll("text") 
               .data(root.features)
               .enter()
               .append("text")
               .attr("text-anchor","middle") 
               .attr("dy",".3em") 
               .attr("fill", "#eee") 
               .style("font-size", "10px") 
               .text(function (d) { 
                   return d.properties.name; 
               })
               .attr("transform", function (d) { 
                   return "translate("+projection(d.properties.cp).join(',')+")"; 
               }); 
   }
</script>
</body>
</html>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 儿子:“妈妈我作业写玩了可以出去玩吗?” 妈妈不可置信的说:“你都写完了?我看看” 检查后妈妈说:“语文的练习资料...
    何金霖阅读 141评论 0 0
  • 让心灵宁静根本不是佛教的目的。佛教的目的是了解实相。这才是最重要的。一个佛教老师宁可你有一个动荡但看到实相的心,而...
    Zhenzen阅读 278评论 0 0
  • 晨昏里 颠倒里 影子说 他知道 所有秘密 往昔里 岁月里 影子说 没忘记 所有回忆 未来里 我们里 原来只剩 我自...
    云低月垂阅读 202评论 0 1
  • 张恨水的《秦淮世家》是我偶然在图书馆闲逛的时候遇到的,以前则从没有接触过张恨水的作品,我之所以选择看它最初也是为了...
    涼之阅读 726评论 0 0
  • 我喜欢听故事,尤其是行走在山山水水之间,听谙熟此地的人娓娓道来一个关乎脚下这方土地的浪漫传奇,这山,这水,这我不曾...
    濯明月于涟漪阅读 408评论 3 7