地图投影有时用点转换实现。例如,球形墨卡托(译者注:球形墨卡托是将地球模拟为球形进行投影,常用于Web):
function mercator(x, y) {
return [x, Math.log(Math.tan(Math.PI / 4 + y / 2))];
}
如果几何体由无限个连续的点表示,这将是一种合理的数学方法。然而,计算机没有无限的内存,所以我们必须使用离散的几何体,如多边形和折线!
离散几何体使得从球体投影到平面变得更加困难。球面上的多边形的边缘是测地线(大圆的一段圆弧),而不是直线。除了gnomonic之外的所有地图投影中测地线投影到平面都是曲线,因此精确投影需要沿每个弧插值。D3使用受矢量曲线数据压缩算法启发的自适应采样来平衡准确性和性能。
多边形和折线的投影还必须处理球体和平面之间的拓扑差异。一些投影需要切割几何体穿过反面子午线的部分,其他的需要剪切几何体到大圆。
球面多边形还需要一个绕序约定来确定多边形的哪一边是内部:小于半球的多边形的外环必须是顺时针的,而大于半球的多边形的外环必须是逆时针的。代表孔的内圈必须使用其外圈的相反的绕序。此卷绕顺序约定TopoJSON和ESRI shapefiles也在使用;但是,它与GeoJSON的RFC 7946相反。(另请注意,标准GeoJSON WGS84使用平面等距(equirectangular)坐标,而不是球面坐标,因此可能需要拼接去除反面子午线切口。)
D3的方法提供了极好的表现力:您可以为数据选择想要的投影和外观。D3支持各种常见和不常见的地图投影。更多有关信息,请参阅The Toolmaker’s Guide的第2部分。
D3使用GeoJSON在JavaScript中表示地理要素。(另请参阅可以显著压缩并按拓扑结构编码GeoJSON的扩展TopoJSON,它更加紧凑并对拓扑进行编码。)要将shapefile转换为GeoJSON,请使用shp2geo,它是shapefile package的一部分。有关d3-geo和相关工具的介绍,请参阅命令行地图制图。
NPM安装, npm install d3-geo
,或者下载最新版本。您也可以直接从d3js.org,或着作为独立库,或者D3 4.0的一部分加载。d3-geo支持AMD、CommonJS、和原生(vanilla)环境。原生环境中使用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.geoEqualEarth(),
path = d3.geoPath(projection);
</script>
d3.geoPath是一个类似形状生成器d3-shape的地理路径生成器:它可以由指定GeoJSON几何体或要素对象生成SVG路径数据字符串或渲染Canvas的路径。动态或交互的投影建议使用Canvas以提高性能。路径可以与projections或者transforms一起使用,也可以将平面几何体直接渲染到Canvas或SVG。
# d3.geoPath([projection[, context]]) <>
使用默认设置创建新的地理路径生成器。指定projection将调用projection设置当前投影,指定context将调用context设置当前上下文。
# path(object[, arguments…]) <>
渲染指定object,可以是任何GeoJSON要素或几何对象:(译者注:参看http://geojson.org/geojson-spec.html#geometry-objects)
- Point - 单个点。
- MultiPoint - 点数组。
- LineString - 组成线的点的数组。
- MultiLineString - LineString的数组。
- Polygon - 组成多边形点的二维数组 (也许有岛)。
- MultiPolygon - Polygon的数组。
- GeometryCollection - 几何对象的数组。
- Feature - 要素是上面任意一种几何对象。
- FeatureCollection - 要素的数组。
用于渲染球体轮廓的Sphere类型也支持,sphere没有坐标。调用path携带的参数将传递给pointRadius。(原文:Any additional arguments are passed along to the pointRadius accessor.)
将多个要素打包到要素集生成一个path进行展示:
svg.append("path")
.datum({type: "FeatureCollection", features: features})
.attr("d", d3.geoPath());
或者每个要素单独生成path进行展示:
svg.selectAll("path")
.data(features)
.enter().append("path")
.attr("d", d3.geoPath());
每个要素单独生成路径通常比将要素组合慢。然而,每个要素独立对于添加样式和交互(例如,点击或鼠标悬停)是非常有用的。Canvas渲染(请参阅path.context)通常比SVG更快,但添加样式和交互比SVG费劲。
返回指定GeoJSON object的平面投影区域(通常以正方形像素为单位)。Point,MultiPoint,LineString和MultiLineString这些几何体的区域为零。对于Polygon和MultiPolygon几何体,此方法首先计算外环的面积,然后减去岛的面积。该方法遵守projection提供的任何裁剪(原文:This method observes any clipping performed by the projection),参见projection.clipAngle和projection.clipExtent。这是d3.geoArea的平面等价方法。
返回指定GeoJSON object的平面投影边界(通常以像素为单位)。边界框由二维数组表示:[[x₀, y₀], [x₁, y₁]],其中x₀是最小x坐标,y₀是最小y坐标,x₁是最大x坐标,y₁是最大y坐标。这对于缩放至一个特定要素非常方便。(注意,在投影平面坐标中,最小纬度通常是最大y值,最大纬度通常是最小y值。)该方法遵守projection提供的任何裁剪(原文:This method observes any clipping performed by the projection),参见projection.clipAngle和projection.clipExtent。这是d3.geoBounds的平面等价方法。
返回指定GeoJSON object的平面投影质心(通常以像素为单位)。这对于给省或市添加边界或地图符号化非常方便。例如,非连续地图需要围绕其质心缩放每个状态。该方法遵守projection提供的任何裁剪(原文:This method observes any clipping performed by the projection),参见projection.clipAngle和projection.clipExtent,这是d3.geoCentroid的平面等价方法。
返回指定GeoJSON object的平面投影返回指定GeoJSON 对象的投影平面长度(通常以像素为单位)。Point和MultiPoint几何体长度为零。对于Polygon和MultiPolygon几何体,此方法计算所有环的总长度。该方法遵守projection提供的任何裁剪(原文:This method observes any clipping performed by the projection),参见projection.clipAngle和projection.clipExtent。这是d3.geoLength的平面等价方法。
# path.projection([projection]) <>
如果指定了projection,设置当前投影为指定的投影。如果未指定projection,则返回当前投影,默认为null。投影为空表示一种特定的转换( The null projection represents the identity transformation):输入几何不进行投影直接按其原始坐标渲染。这种投影可以用于快速渲染已经投影过的几何体或快速渲染等距(equirectangular)投影。
指定的投影通常是D3的内置geographic projections之一;但是,任何对象暴露的projection.stream都可以使用,从而可以使用自定义投影。参见D3的transforms,获取更多任意几何变换的更多的例子。
如果指定了context,则设置当前渲染的context(译者注:以下context都是指Canvas调用getContext方法获取到的context)并返回路径生成器。如果context为null,则路径生成器将返回SVG路径字符串;如果context为非null,则路径生成器将调用指定context中的方法来渲染几何体。context必须实现CanvasRenderingContext2D API的子集:
- context.beginPath()
- context.moveTo(x, y)
- context.lineTo(x, y)
- context.arc(x, y, radius, startAngle, endAngle)
- context.closePath()
如果未指定context,则返回当前渲染的context,它的默认值为null。
# path.pointRadius([radius]) <>
如果radius指定,设置用于显示Point和MultiPoint半径为指定值。如果未指定radius,则返回当前半径访问器,默认值为4.5。虽然半径通常被指定为数字常量,但它也可以被指定为为每个要素进行计算的函数,这个函数可以获取到path generator的全部参数(原文:being passed the any arguments passed to the path generator)。例如,如果您的GeoJSON数据具有附加属性,则可以访问这些属性在pointRadius指定的函数中来改变点大小;或者,您可以使用d3.symbol和projection这两种更加灵活的方式。
投影将球面多边形几何体转换为平面多边形几何体。D3提供了如下几类标准投影的实现:
有关更多投影,请参阅d3-geo-projection。您可以使用custom projections或d3.geoProjectionMutator实现自定义投影。
返回表示指定point的投影后的点的新数组[x, y](通常以像素为单位)。指定point必须为以度为单位的双元素数组[longitude, latitude]。如果指定的point没有定义的投影位置,例如当该点位于该投影的剪切边界之外时,将返回null 。
返回一个以度为单位的新数组[longitude, latitude],表示指定已投影point的未投影点。该点必须指定为双元素数组[x, y](通常以像素为单位)。如果指定的point没有定义的投影位置,例如当该点位于该投影的剪切边界之外时,将返回null 。
该方法仅定义在可逆投影上。
# projection.stream(stream) <>
返回指定输出stream的projection stream。任何输入的几何体都是先投影然后成为输出流。(原文:Any input geometry is projected before being streamed to the output stream.)典型的投影涉及多个几何变换:输入几何体首先转换为弧度,在三个轴上旋转,剪切到小圆或沿着反面子午线,最后通过自适应重采样、缩放和平移投影到平面。
# projection.preclip([preclip])
如果指定了preclip,则将投影的球面剪裁设置为指定的函数并返回投影。如果未指定preclip,则返回当前的球面剪裁函数(请参阅preclip)。
# projection.postclip([postclip])
如果指定了postclip,则将投影的平面剪裁设置为指定的函数并返回投影。如果未指定postclip,则返回当前的平面剪切函数(请参阅postclip)。
# projection.clipAngle([angle]) <>
如果指定了angle,则将投影的剪切圆半径设置为指定的以度为单位的角度并返回投影。(原文:If angle is specified, sets the projection’s clipping circle radius to the specified angle in degrees and returns the projection.)如果angle为null,则切换到反面子午线切割而不是小圆切割。如果未指定angle,则返回当前剪切角度,默认为null。小圆剪切独立于projection.clipExtent视口剪切。
另见projection.preclip,d3.geoClipAntimeridian,d3.geoClipCircle。
# projection.clipExtent([extent]) <>
如果指定了extent,则将投影的的视口剪切范围设置为指定的以像素为单位的边界并返回投影。extent边界被指定为一个数组[[x₀, y₀],[x₁, y₁]],其中x₀是视口的左侧,y₀是视口的顶部,x₁是视口的右侧,y₁是视口的底部。如果extent为null,则不执行视口剪切。如果未指定extent,则返回当前视口剪切范围,默认为null。视口剪切独立于projection.clipAngle小圆剪切。
另请参见projection.postclip,d3.geoClipRectangle。
# projection.scale([scale]) <>
如果指定了scale,则将投影的缩放系数设置为指定值并返回投影。如果未指定scale,则返回当前缩放系数; 默认缩放系数是投影指定的。缩放系数与投影点之间的距离线性对应;但是,相同缩放系数在不同投影下的效果并不完全相同。(原文:however, absolute scale factors are not equivalent across projections.)
# projection.translate([translate]) <>
如果指定了translate,则将投影的平移距离设置为指定的双元素数组[tx, ty]并返回投影。如果未指定translate,则返回当前的平移距离,默认为[480,250]。平移距离确定投影的center的像素坐标。默认平移距离将⟨0°,0°⟩放置在960×500区域的中心。
# projection.center([center]) <>
如果指定了center,则将投影的中心设置为指定的以度为单位的经度和纬度的双元素数组center,并返回投影。如果未指定center,则返回当前中心,默认为⟨0°,0°⟩。
# projection.angle([angle]) <>
如果指定了angle,则将投影的投影后平面旋转角度设置为指定的以度为单位的angle并返回投影。如果未指定angle,则返回投影的当前角度,默认为0°。注意,在渲染期间旋转(例如,使用context.rotate)一般比投影期间旋转更快。
# projection.rotate([angles]) <>
如果指定了rotation,则将投影的球面旋转的三个轴设置为指定的angles,该角度必须是两个或三个元素的数字数组[lambda, phi, gamma],指定围绕球面旋转的三个轴的旋转角度。(和姿态角yaw, pitch and roll对应)如果省略旋转角度gamma,则默认为0.另请参阅d3.geoRotation。如果未指定rotation,则返回当前旋转角度,默认为[0,0,0]。
# projection.precision([precision]) <>
如果指定了precision,则将投影的自适应重采样的阈值设置为指定的以像素为单位值并返回投影。该值对应于Douglas–Peucker距离。如果未指定precision,则返回投影的当前重采样精度,默认为√0.5 ≅ 0.70710…
# projection.fitExtent(extent, object) <>
设置投影的scale和translate使得指定的GeoJSONobject从中心铺满指定的extent。该范围指定为数组[[x₀, y₀], [x₁, y₁]],其中x₀是边界框的左边,y₀是顶部,x₁是右边,y₁是底部。返回投影。
例如,缩放和平移新泽西州平面投影以使GeoJSON对象nj从中心铺满960×500的边界框,每边有20个像素的填充:
var projection = d3.geoTransverseMercator()
.rotate([74 + 30 / 60, -38 - 50 / 60])
.fitExtent([[20, 20], [940, 480]], nj);
确定新缩放和平移时,将忽略clip extent。precision用于计算由150缩放计算过的指定的object的外接矩形。(原文:The precision used to compute the bounding box of the given object is computed at an effective scale of 150.)
# projection.fitSize(size, object) <>
projection.fitExtent的便捷方法,其中范围的左上角是[0,0]。以下两个语句是等效的:
projection.fitExtent([[0, 0], [width, height]], object);
projection.fitSize([width, height], object);
# projection.fitWidth(width, object) <>
projection.fitSize的便捷方法,其中高度自动由object的纵横比和指定的width计算。
# projection.fitHeight(height, object) <>
projection.fitSize的便捷方法,其中宽度自动由object的纵横比和指定的height计算。
方位投影将球体直接投影到平面上。
# d3.geoAzimuthalEqualArea() <>
# d3.geoAzimuthalEqualAreaRaw
等积方位投影。
# d3.geoAzimuthalEquidistant() <>
# d3.geoAzimuthalEquidistantRaw
等距方位投影。
# d3.geoGnomonic() <>
# d3.geoGnomonicRaw
gnomonic投影。
# d3.geoOrthographic() <>
# d3.geoOrthographicRaw
正射投影(直角投影)。
# d3.geoStereographic() <>
# d3.geoStereographicRaw
立体投影。
# d3.geoEqualEarth() <>
# d3.geoEqualEarthRaw
The Equal Earth projection, by Bojan Šavrič et al., 2018.
复合投影由多个投影组成,这些投影进行组合显示到一张地图上。组成复合投影的投影的具有固定的剪切,中心和旋转,因此复合投影不支持projection.center、projection.rotate、projection.clipAngle和projection.clipExtent。
这是以美国为中心的三个d3.geoConicEqualArea投影的复合投影:d3.geoAlbers用于低纬度的四十八个州(原文: d3.geoAlbers is used for the lower forty-eight states),并且单独使用等积圆锥投影阿拉斯加和夏威夷。请注意,阿拉斯加的比例缩小:预计为其真实面积的0.35倍。Philippe Rivière的这张图使用阿拉斯加和夏威夷的两个矩形插图说明了这个投影:
更多示例,请参阅d3-composite-projections 。
圆锥投影将球体投影到圆锥体上,然后将圆锥体展开到平面上。圆锥投影有two standard parallels。
# conic.parallels([parallels]) <>
two standard parallels定义了圆锥投影的地图布局。
Albers的等积圆锥投影。这是以美国为中心的d3.geoConicEqualArea配置。
# d3.geoConicConformal() <>
# d3.geoConicConformalRaw(phi0, phi1) <>
等角圆锥投影。默认平行线为[30°, 30°],造成平顶。(原文:The parallels default to [30°, 30°] resulting in flat top.)另见conic.parallels。
# d3.geoConicEqualArea() <>
# d3.geoConicEqualAreaRaw(phi0, phi1) <>
Albers的等积圆锥投影。另见conic.parallels。
# d3.geoConicEquidistant() <>
# d3.geoConicEquidistantRaw(phi0, phi1) <>
等距圆锥投影。另见conic.parallels。
圆柱投影将球体投射到圆柱体上,然后将圆柱体展开到平面上。伪圆柱投影是圆柱投影的推广。
# d3.geoEquirectangular() <>
# d3.geoEquirectangularRaw
等距(plate carrée)投影。
# d3.geoMercator() <>
# d3.geoMercatorRaw
球形墨卡托投影。定义默认projection.clipExtent,使地球投影到一个正方形,剪裁到大约±85°纬度。
# d3.geoTransverseMercator() <>
# d3.geoTransverseMercatorRaw
横轴球墨卡托投影。定义projection.clipExtent,使世界投影到一个正方形,剪裁到大约±85°纬度。
# d3.geoNaturalEarth1() <>
# d3.geoNaturalEarth1Raw
自然地球投影是由Tom Patterson设计的伪圆柱投影。它既不等角也不等积,而是全世界的小比例地图。(原文:but appealing to the eye for small-scale maps of the whole world.)
原始投影是用于实现自定义投影的点变换函数;它们通常传递给d3.geoProjection或d3.geoProjectionMutator。暴露出来原始投影用来衍生相关投影。原始投影以弧度(不是角度!)取球面坐标[lambda, phi]并返回点[x, y],返回的点一般落在单位方形中心为原点的区域中。(原文:typically in the unit square centered around the origin.)
# project(lambda, phi)
投影以弧度表示的指定点[lambda, phi],返回新点的无量纲的坐标[x, y]。
# project.invert(x, y)
project的逆。
# d3.geoProjection(project) <>
使用指定的原始投影project构建一个新投影。该project函数的参数为弧度表示的longitude和latitude,通常被称为lambda (λ)和phi (φ),并返回数组[x, y]表示其单位投影。project函数不需要缩放和平移这个点,因为会自动应用projection.scale、projection.translate和projection.center。同样,project函数不需要执行任何球面旋转,因为在投影之前已经应用projection.rotate。
例如,球形墨卡托投影可以这样实现:
var mercator = d3.geoProjection(function(x, y) {
return [x, Math.log(Math.tan(Math.PI / 4 + y / 2))];
});
如果指定的project函数暴露了invert方法,则返回的投影也会暴露projection.invert。
# d3.geoProjectionMutator(factory) <>
使用指定的原始投影factory构建一个新投影,并返回一个当原始投影发生变化时调用的mutate函数。指定的factory必须返回一个原始的投影。返回的mutate函数的返回值是包装后的投影。例如,圆锥投影通常具有两条可配置的平行线。一个合适的factory函数,如d3.geoConicEqualAreaRaw,将具有以下形式:
// y0 and y1 represent two parallels
function conicFactory(phi0, phi1) {
return function conicRaw(lambda, phi) {
return […, …];
};
}
使用d3.geoProjectionMutator可以实例化一个允许修改平行线的标准投影,使用d3.geoProjection重新分配内部使用的原始投影:
function conicCustom() {
var phi0 = 29.5,
phi1 = 45.5,
mutate = d3.geoProjectionMutator(conicFactory),
projection = mutate(phi0, phi1);
projection.parallels = function(_) {
return arguments.length ? mutate(phi0 = +_[0], phi1 = +_[1]) : [phi0, phi1];
};
return projection;
}
在创建可变投影时,通常不会公开mutate函数。
返回指定GeoJSONobject的球面区域的球面度(译者注:整个球的球面度为4)。这是path.area的球面等价方法。
返回指定GeoJSONobject的球面边界框。边界框由二维数组表示:[[left, bottom], [right, top]],其中left是最小经度,bottom是最小纬度,right是最大经度,top是最大纬度。所有坐标均以度为单位。(注意,在平面投影坐标中,最小纬度通常是最大y值,最大纬度通常是最小y值。)这是path.bounds的球面等价方法。
返回指定GeoJSONobject的球面质心。这是path.centroid的球面等价方法。
返回指定a和b两点之间以弧度表示的距离。必须将每个点指定为以度为单位的双元素数组[longitude, latitude]。这是平面上使用度path.measure测量两点线段长度的球面等价方法。(原文:This is the spherical equivalent of path.measure given a LineString of two points.)
返回指定GeoJSON object之间以弧度表示的距离。以弧度形式返回指定GeoJSON 对象的大弧长度。对于多边形,返回外圈的周长加上全部岛的周长。这是平面上测量线段长度path.measure的球面等价方法。
返回指定两点a和b的插值函数。必须将每个点指定为以度为单位的双元素数组[longitude, latitude]。返回的插值函数带有一个参数t,其中t是0到1之间的数字; 值0返回点a,值1返回点b。沿着穿过a和b的大弧从a到b插值生成中间值。如果a和b是对跖点(译者注:对跖点地球同一直径的两个端点。),则选择任意大弧。
# d3.geoContains(object, point) <>
当且仅当指定GeoJSON object包含指定的point返回值true,否则返回假。必须将该点指定为以度为单位的双元素数组[longitude, latitude]。对于Point和MultiPoint几何体,使用精确测试;对于一个球体,总是返回true;对于其他几何体,使用epsilon阈值。
如果指定了rotation,则将投影的球面旋转的三个轴设置为指定的angles,该角度必须是以度表示球面旋转的三个轴(和姿态角yaw, pitch and roll对应)的两个或三个元素的数字数组[lambda, phi, gamma]。如果省略旋转角度gamma,则默认为0.另请参阅d3.geoRotation。
以度为单位返回一个新数组[longitude, latitude],表示指定point的旋转点。以度为单位返回指定point的选装新数组[longitude, latitude]。该点指定为以度为单位的双元素数组[longitude, latitude]。
以度为单位返回一个新的数组[longitude, latitude],表示指定point的反转点;rotation的反转。(原文:the inverse of rotation.)必须将该点指定为以度为单位的双元素数组[longitude, latitude]。
要生成一个大弧(一个大圆的一部分),只需将GeoJSON LineString几何对象传递给d3.geoPath。D3的投影使用大弧插值生成中间点,因此不需要大弧形发生器。
返回一个新的圆生成器。
返回一个新的类型为“Polygon”的GeoJSON几何对象,这个几何对象近似于球体表面上的圆,具有当前的center,radius和precision。arguments传递给访问器。(原文:Any arguments are passed to the accessors.)
如果指定center,设定圆心到指定的以度数为单位的点[longitude, latitude],并返回该圆的生成器。中心也可以指定为函数;每当生成一个圆时,将调用此函数,这个函数可以获取到圆生成器的全部参数。(原文:being passed any arguments passed to the circle generator.)如果未指定center,则返回当前的中心访问器,默认为:
function center() {
return [0, 0];
}
如果指定radius,设置圆半径为指定以度为单位的角度,并返回该圆生成器。半径也可以指定为函数;每当生成一个圆时,将调用此函数,这个函数可以获取到圆生成器的全部参数。(原文:being passed any arguments passed to the circle generator.)如果未指定radius,则返回当前半径访问器,默认为:
function radius() {
return 90;
}
# circle.precision([angle]) <>
如果指定precision ,设置圆精度为指定以度为单位的角度,然后返回该圆发生器。精度也可以指定为函数;每当生成一个圆时,将调用此函数,这个函数可以获取到圆生成器的全部参数。(原文:being passed any arguments passed to the circle generator.)如果未指定precision,则返回当前精度访问器,默认为:
function precision() {
return 6;
}
小圆圈不遵循大弧,因此生成的多边形只是近似值。(原文:Small circles do not follow great arcs and thus the generated polygon is only an approximation.)指定角度精度为较小值可提高多边形近似的精度,但也会增加生成和渲染它的成本。
构造一个用于创建经纬网的几何生成器:展示变形的投影使用均匀的经线和纬线。(原文:Constructs a geometry generator for creating graticules: a uniform grid of 经线 and 纬线圈 for showing projection distortion.)默认经纬网在有纬线,纬度±80°之间每隔10°有经线;对于极地地区,每隔90°有经线。
返回表示此经纬网的所有经线和纬线的GeoJSON MultiLineString几何对象。
返表示此经纬网的所有经线和纬线的GeoJSON LineString几何体对象的数组。(原文: Returns an array of GeoJSON LineString geometry objects, one for each meridian or parallel for this graticule.)
返回表示此经纬网轮廓的GeoJSON Polygon几何体对象,即沿着经线和纬线定义的范围。
# graticule.extent([extent]) <>
如果指定extent,设置此经纬网的主范围和次范围。如果未指定extent,返回当前次范围,默认为⟨⟨-180°, -80° - ε⟩, ⟨180°, 80° + ε⟩⟩。
# graticule.extentMajor([extent]) <>
如果指定extent,设置此经纬网的主范围。如果未指定extent,返回当前主范围,默认为⟨⟨-180°, -90° + ε⟩, ⟨180°, 90° - ε⟩⟩。
# graticule.extentMinor([extent]) <>
如果指定extent,设置此经纬网的次范围。如果未指定extent,返回当前次范围,默认为⟨⟨-180°, -80° - ε⟩, ⟨180°, 80° + ε⟩⟩。
如果指定了step,则设置此经纬网的主step和次step。如果未指定step,则返回当前的次step,默认为⟨10°, 10°⟩。
# graticule.stepMajor([step]) <>
如果指定了step,则设置此经纬网的主step。如果未指定step,则返回当前的主step,默认为⟨90°, 360°⟩。
# graticule.stepMinor([step]) <>
如果指定了step,则设置此经纬网的次step。如果未指定step,则返回当前的次step,默认为⟨10°, 10°⟩。
# graticule.precision([angle]) <>
如果指定precision,设置此经纬网的精度为指定以度为单位的精度。如果未指定precision,则返回当前精度,默认为2.5°。
一种直接生成10°全球经纬网的GeoJSON MultiLineString几何对象的便捷方法。相当于:
function geoGraticule10() {
return d3.geoGraticule()();
}
D3通过调用一系列函数进行几何变换,而不是具体化中间表示以减小开销。流必须实现几种方法来接收输入几何。流本质上是有状态的;一个点的含义取决于该点是否在一条线的内部,同样一条线与一个多边形的边界分开。尽管名称为“stream”,但这些方法调用目前是同步的。
# d3.geoStream(object, stream) <>
将指定的GeoJSON object流式传输到指定的projection stream。虽然支持要素和几何体对象作为输入,但流界面仅描述几何体,因此流不可见其他要素属性。
# stream.point(x, y[, z])
表示具有指定坐标x和y(以及可选z)的点。坐标系未指定且与实现相关;例如,projection streams需要以度为单位的球面坐标作为输入。在一个多边形或线的上下文之外,一个点表示一个点几何对象(点或多点)。在线或多边形边界,该点表示控制点。
# stream.lineStart()
表示线或多边形边界的开始。在多边形内,表示多边形边界的开始。多边形的第一个环是外环,通常是顺时针的。任何后续边界表示多边形中的岛,并且通常是逆时针方向。
# stream.lineEnd()
表示线或多边形边界的结束。在多边形内,表示多边形边界的结束。与GeoJSON不同,多边形边界的冗余闭合坐标不是通过点指示的,而是通过多边形内的lineEnd隐含。因此,给定的多边形输入:
{
"type": "Polygon",
"coordinates": [
[[0, 0], [0, 1], [1, 1], [1, 0], [0, 0]]
]
}
将在流上产生以下一系列方法调用:
stream.polygonStart();
stream.lineStart();
stream.point(0, 0);
stream.point(0, 1);
stream.point(1, 1);
stream.point(1, 0);
stream.lineEnd();
stream.polygonEnd();
# stream.polygonStart()
表示多边形的开始。多边形的第一行表示外环,任何后续行表示内部岛。
# stream.polygonEnd()
表示多边形的结尾。
# stream.sphere()
表示球体(地球;单位球体以⟨0,0,0⟩为中心)。
变换是投影的一般化。转换实现projection.stream并可以传递给path.projection。然而,它们仅实现其他投影方法的子集,并且表示任意几何变换而不是从球面到平面坐标的投影。
使用在指定methods对象上定义的方法,定义任意变换。任何未定义的方法都将使用将输入传送到输出流的传递方法。例如,要将y反射(原文:to reflect the y-dimension)(另请参见identity.reflectY):
var reflectY = d3.geoTransform({
point: function(x, y) {
this.stream.point(x, -y);
}
});
或者定义仿射矩阵变换:
function matrix(a, b, c, d, tx, ty) {
return d3.geoTransform({
point: function(x, y) {
this.stream.point(a * x + b * y + tx, c * x + d * y + ty);
}
});
}
特征变换可用于缩放,平移和剪裁平面几何体。它实现了projection.scale,projection.translate,projection.fitExtent,projection.fitSize,projection.fitWidth,projection.fitHeight和projection.clipExtent。
# identity.reflectX([reflect])
如果指定了reflect,则设置x否在输出中反射(变为相反数)。如果未指定reflect,则在启用x反射时返回true ,默认为false。
# identity.reflectY([reflect])
如果指定了reflect,则设置y否在输出中反射(变为相反数)。如果未指定reflect,则在启用y反射时返回true ,默认为false。这对于从标准空间参考系统进行转换特别有用,该系统将正y视为向上,显示坐标系统诸如使用Canvas和SVG将正yy视为向下。
投影分两个阶段进行几何形状的切割或裁剪。
# preclip(stream)
预剪裁发生在地理坐标中。沿着反面子午线线切割,或沿着小圆裁剪是最常见的策略。
# postclip(stream)
后剪裁发生在平面,当投影被限制到某个范围(例如矩形)时。
裁剪函数被实现为projection stream的转换。预裁剪在以弧度为单位的球面坐标上进行操作。后裁剪在以像素为单位的平面坐标上操作。
# d3.geoClipAntimeridian
裁剪函数,其对流进行变换,使得穿过反面子午线的几何形状(线或多边形)被切成两个,每边一个。通常用于预裁剪。
# d3.geoClipCircle(angle)
生成裁剪函数,该剪切函数对流进行变换,使得几何体限定在由围绕投影中心的半径angle的小圆圈内。通常用于预裁剪。
# d3.geoClipRectangle(x0, y0, x1, y1)
生成裁剪函数,该剪切函数转换流,使得几何图形限定在坐标[[x0, y0], [x1, y1]]的矩形内。通常用于后裁剪。