跳至内容

投影

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

更多投影,请参阅 d3-geo-projectiond3-geo-polygon。您可以使用 自定义投影 来实现 geoProjectiongeoProjectionMutator

projection(point)

源代码 · 返回一个新的数组 [x, y](通常以像素表示),表示给定 point 的投影点。该点必须指定为一个以度为单位的二维数组 [longitude, latitude]。如果指定 point 没有定义投影位置,则可能会返回 null,例如当点位于投影的剪切边界之外时。

projection.invert(point)

源代码 · 返回一个新的以度为单位的数组 [longitude, latitude],表示给定投影 point 的非投影点。该点必须指定为一个二维数组 [x, y](通常以像素表示)。如果指定 point 没有定义投影位置,则可能会返回 null,例如当点位于投影的剪切边界之外时。

此方法仅在可逆投影上定义。

projection.stream(stream)

源代码 · 返回指定输出 stream投影流。任何输入几何图形在流式传输到输出流之前都会被投影。典型的投影涉及多个几何变换:输入几何图形首先被转换为弧度,然后围绕三个轴旋转,剪切到小圆或沿本初子午线切割,最后以自适应重采样、缩放和平移的方式投影到平面上。

projection.preclip(preclip)

如果指定了 preclip,则将投影的球面剪切设置为指定函数,并返回投影;preclip 是一个函数,它接受一个 投影流 并返回一个剪切流。如果未指定 preclip,则返回当前球面剪切函数。预剪切通常用于沿本初子午线切割或沿小圆切割。

projection.postclip(postclip)

如果指定了 postclip,则将投影的笛卡尔剪切设置为指定函数,并返回投影;postclip 是一个函数,它接受一个 投影流 并返回一个剪切流。如果未指定 postclip,则返回当前笛卡尔剪切函数。后剪切发生在平面上,当投影限定在某个范围内(例如矩形)时。

projection.clipAngle(angle)

源代码 · 如果指定了 angle,则将投影的剪切圆半径设置为以度为单位的指定角度,并返回投影。如果 angle 为 null,则切换到 本初子午线切割 而不是小圆剪切。如果未指定 angle,则返回当前剪切角,默认为 null。小圆剪切独立于通过 projection.clipExtent 进行的视口剪切。另请参阅 projection.preclipgeoClipAntimeridiangeoClipCircle

projection.clipExtent(extent)

源代码 · 如果指定了 extent,则将投影的视口剪切范围设置为以像素为单位的指定边界,并返回投影。extent 边界指定为一个数组 [[x₀, y₀], [x₁, y₁]],其中 x₀ 是视口的左侧,y₀ 是顶部,x₁ 是右侧,y₁ 是底部。如果 extent 为 null,则不执行视口剪切。如果未指定 extent,则返回当前视口剪切范围,默认为 null。视口剪切独立于通过 projection.clipAngle 进行的小圆剪切。另请参阅 projection.postclipgeoClipRectangle

projection.scale(scale)

源代码 · 如果指定了 scale,则将投影的缩放因子设置为指定值,并返回投影。如果未指定 scale,则返回当前缩放因子;默认缩放因子是特定于投影的。缩放因子与投影点之间的距离线性对应;但是,绝对缩放因子在不同投影之间不相同。

projection.translate(translate)

源代码 · 如果指定了 translate,则将投影的平移偏移设置为指定的二维数组 [tx, ty],并返回投影。如果未指定 translate,则返回当前平移偏移量,默认为 [480, 250]。平移偏移量决定投影的 中心 的像素坐标。默认平移偏移量将 ⟨0°,0°⟩ 放置在 960×500 区域的中心。

projection.center(center)

源代码 · 如果指定了 center,则将投影的中心设置为指定的 center,一个以度为单位的二维数组 [longitude, latitude],并返回投影。如果未指定 center,则返回当前中心,默认为 ⟨0°,0°⟩。

projection.angle(angle)

源代码 · 如果指定了 angle,则将投影的投影后平面旋转角度设置为指定的以度为单位的 angle,并返回投影。如果未指定 angle,则返回投影的当前角度,默认为 0°。请注意,在渲染过程中进行旋转(例如,使用 context.rotate)可能比在投影过程中进行旋转更快。

projection.reflectX(reflect)

如果指定了 reflect,则设置输出中 x 维度是否被反射(取反)。如果未指定 reflect,则返回 true 表示 x 反射已启用,默认为 false。这在显示天空和天文数据时可能很有用,在这种情况下,当北方朝上时,赤经(东方方向)将指向左侧。

projection.reflectY(reflect)

如果指定了 reflect,则设置输出中 y 维度是否被反射(取反)。如果未指定 reflect,则返回 true 表示 y 反射已启用,默认为 false。这在从标准 空间参考系统(其中正 y 指向上方)转换为显示坐标系(例如 Canvas 和 SVG,其中正 y 指向下方)时特别有用。

projection.rotate(angles)

源代码 · 如果指定了 rotation,则将投影的 三轴球面旋转 设置为指定的 angles,它必须是一个包含两个或三个元素的数字数组 [lambda, phi, gamma],用于指定围绕 每个球面轴 的旋转角度。(这些对应于 偏航、俯仰和滚转。)如果省略了旋转角度 gamma,则默认为 0。另请参阅 geoRotation。如果未指定 rotation,则返回当前旋转,默认为 [0, 0, 0]。

projection.precision(precision)

源代码 · 如果指定了precision,则将投影的 自适应重采样 阈值设置为以像素为单位的指定值,并返回投影。 此值对应于 道格拉斯-普克算法 距离。 如果未指定precision,则返回投影的当前重采样精度,默认为 √0.5 ≅ 0.70710…

projection.fitExtent(extent, object)

源代码 · 设置投影的 比例平移 以将指定的 GeoJSON object 拟合到给定extent 的中心。 范围以数组 [[x₀, y₀], [x₁, y₁]] 的形式指定,其中 x₀ 是边界框的左侧,y₀ 是顶部,x₁ 是右侧,y₁ 是底部。 返回投影。

例如,要缩放和平移 新泽西州平面投影 以将 GeoJSON 对象nj 拟合到 960×500 边界框的中心,并在每侧有 20 像素的填充

js
var projection = d3.geoTransverseMercator()
    .rotate([74 + 30 / 60, -38 - 50 / 60])
    .fitExtent([[20, 20], [940, 480]], nj);

在确定新的比例和平移时,任何 裁剪范围 都会被忽略。 用于计算给定object 的边界框的 精度 是在有效比例为 150 时计算的。

projection.fitSize(size, object)

源代码 · projection.fitExtent 的便捷方法,其中范围的左上角为 [0, 0]。 以下两个语句等效

js
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 约束自动选择的。

原始投影

原始投影是点变换函数,用于实现自定义投影; 它们通常传递给 geoProjectiongeoProjectionMutator。 它们在此公开,以方便推导出相关投影。 原始投影采用以弧度(而不是度数!)表示的球面坐标 [lambda, phi],并返回一个点 [x, y],通常位于以原点为中心的单位正方形中。

project(lambda, phi)

投影指定以弧度表示的点 [lambda, phi],返回一个新的点 [x, y],以无量纲坐标表示。

project.invert(x, y)

project 的逆运算。

geoProjection(project)

源代码 · 从指定的 原始投影 project 构造一个新的投影。 project 函数采用给定点以 弧度 表示的经度纬度,通常称为lambda (λ) 和phi (φ),并返回一个代表其单位投影的二元素数组 [x, y]。 project 函数不需要缩放或平移点,因为这些操作由 projection.scaleprojection.translateprojection.center 自动应用。 同样,project 函数不需要执行任何球面旋转,因为 projection.rotate 在投影之前应用。

例如,球面墨卡托投影可以实现为

js
var mercator = d3.geoProjection(function(x, y) {
  return [x, Math.log(Math.tan(Math.PI / 4 + y / 2))];
});

如果project 函数公开invert 方法,则返回的投影也将公开 projection.invert

geoProjectionMutator(factory)

源代码 · 从指定的 原始投影 factory 构造一个新的投影,并返回一个mutate 函数,该函数在原始投影发生变化时调用。 factory 必须返回一个原始投影。 返回的mutate 函数返回包装的投影。 例如,圆锥投影通常有两个可配置的平行线。 一个合适的factory 函数,如 geoConicEqualAreaRaw,将具有以下形式

js
// y0 and y1 represent two parallels
function conicFactory(phi0, phi1) {
  return function conicRaw(lambda, phi) {
    return […, …];
  };
}

使用 d3.geoProjectionMutator,您可以实现一个标准投影,该投影允许更改平行线,重新分配由 geoProjection 内部使用的原始投影

js
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 函数通常不会公开。

geoTransform(methods)

源代码 · 使用在指定methods 对象上定义的方法定义任意变换。 任何未定义的方法将使用直通方法,将输入传播到输出流。

例如,要反射y 维度(另请参见 projection.reflectY

js
const reflectY = d3.geoTransform({
  point(x, y) {
    this.stream.point(x, -y);
  }
});

或者定义一个仿射矩阵变换

js
function matrix(a, b, c, d, tx, ty) {
  return d3.geoTransform({
    point(x, y) {
      this.stream.point(a * x + b * y + tx, c * x + d * y + ty);
    }
  });
}

变换是一个广义投影; 它实现 projection.stream,并且可以传递给 path.projection。 但是,它只实现其他投影方法的一部分,并且代表任意几何变换,而不是从球面到平面坐标的投影。

geoIdentity()

源代码 · 恒等变换可用于缩放、平移和裁剪平面几何。 它实现 projection.scaleprojection.translateprojection.fitExtentprojection.fitSizeprojection.fitWidthprojection.fitHeightprojection.clipExtentprojection.angleprojection.reflectXprojection.reflectY

geoClipAntimeridian

源代码 · 一个裁剪函数,它转换流,使得跨越反子午线的几何图形(线或多边形)被切成两部分,一部分在每一侧。 通常用于预裁剪。

geoClipCircle(angle)

源代码 · 生成一个裁剪函数,它转换流,使得几何图形被投影的 中心 周围半径为angle 的小圆限定。 通常用于预裁剪。

geoClipRectangle(x0, y0, x1, y1)

源代码 · 生成一个裁剪函数,它转换流,使得几何图形被坐标 [[x0, y0], [x1, y1]] 的矩形限定。 通常用于后裁剪。