d3.js - 使用 d3-geo-projection 命令行工具设置自定义投影

标签 d3.js map-projections

我正在尝试使用 geoproject 在 geojson 文件上设置投影。具体来说,我正在尝试将投影设置为 BCalbers ( http://spatialreference.org/ref/epsg/3005/ )

我看到 geoproject 有许多投影选项,即

geoproject 'd3.geoAlbersUsa()' us.json \
  > us-albers.json

但是可以使用命令行工具设置自定义投影吗?我希望这样的事情是可能的:

geoproject '+proj=aea +lat_1=50 +lat_2=58.5 +lat_0=45 +lon_0=-126 +x_0=1000000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs' build/airzones.geojson \
  > bc-albers.json

但没有骰子。这适用于 ogr2ogr

ogr2ogr -f GeoJSON -t_srs "+proj=aea +lat_1=50 +lat_2=58.5 +lat_0=45 +lon_0=-126 +x_0=1000000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs  " \

最佳答案

D3 地理投影支持一系列通用投影(和自定义投影),通常可以重新创建任何给定的特定投影。但是,重新创建投影时,d3 投影不会复制 map 单位*。 D3 投影在 svg 坐标空间中创建单位(投影坐标将从左上角的 [0,0] 开始)。这允许跳过投影数据的步骤(通常使用 d3 即时进行),然后重新缩放并翻译它以显示 map 。

比较:使用引用的 d3.geoAlbersUsa(),如果使用默认比例,d3 将沿 x 轴投影大约 960 个像素的数据。非常适合在 SVG 中未经修改地使用 - 坐标可以用作直接 SVG 坐标。在 ArcGIS 或 QGIS 中使用 BC Albers 将投影数百万米的数据。

但是,除了单位之外,您可以重新创建按比例缩放的 BC Albers,以保留常规 BC Albers 的形状、距离、方向和面积。但由于 d3 不采用投影定义(例如 .prj 文件或其他定义),因此您需要使用 d3 的投影方法和适当的参数。

对于 BC Albers,您的纬线为:50 和 58.5,中心经度为 -126,投影类型为 Albers。这就是您所需要的 - (假)东移/北移引用是为了重新创建 map 单位 - 在 Web 场景中通常不需要这(如果需要,使用更完整的 GIS 平台会更合适)。

因此,要设置投影,您可以使用:

d3.geoAlbers()
  .center([0,y])
  .rotate([-x,0])
  .parallels([a,b])
  .scale(k)

哪里

x = center longitude (negative because we rotate the globe under the map)

a, b = standard parallels

k = scale factor(for a d3.geoAlbers(): whole world is 960 px across with a scale of 1070, the default scale, larger numbers expand this/zoom in)

y = centering latitude.

注意:y 不会改变投影,它只是平移投影 - BC Albers 的 y 引用位于 BC 以南,它只是北距的引用,因为它对 map 形状、面积、距离没有影响,或方向。对于 BC 阿尔伯斯,我可能会选择 50.5,因为它位于育空地区边界和华盛顿边界之间的中间位置,这是 BC 的北部和南部边界(嗯,温哥华岛和一些海湾群岛除外,所以假设 50 度北,抱歉我忘了你维多利亚)。

还请记住 d3 的投影功能假定数据未投影(或在 WGS84 中“投影”),由长纬度对组成。

您可以在 Mike Bostock 的命令行制图文章 here 中了解如何使用这些方法。 :

geoproject 'd3.geoConicEqualArea().parallels([34, 40.5]).rotate([120, 0]).fitSize([960, 960], d)' < ca.json > ca-albers.json
此示例中的

fitSize 缩放并将要素平移到指定的边界框 - 此平移和缩放不会改变投影参数,就像 中心的 y 坐标一样 方法,不会改变距离、面积、形状或角度(好吧,距离和面积仍与适当的 BC Albers 成比例)。

*您可以重新创建 map 单位(错误的东距/北距可能需要一些自定义投影工作),但这并不是真正的平台,使用许多其他平台会更容易。

另请参阅此问题和答案:Converting EPSG projection bounds to a D3.js .

关于d3.js - 使用 d3-geo-projection 命令行工具设置自定义投影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45928733/

相关文章:

javascript - 如何制作不规则数据的d3多折线图?

javascript - 在 d3.js 中显示形状内的表格时出现问题

javascript - 如何使用 D3.js 对分组的嵌套 json 坐标数据进行动画转换?

r - 如何在 ggplot2 中正确绘制投影网格数据?

javascript - D3 条形图 - 删除具有零值的标签

javascript - 两个对象数组正在合并,但它们没有排序 - D3

python - 如何将 Matplotlib 的 stock_img() 与 Cartopy 的 NearsidePerspective 投影相匹配

openstreetmap - 如何正确找到球体上的 UV

javascript - 未捕获类型错误 : n is not a function d3. js。尝试在谷歌地图上覆盖 us_map 时

python - Mapnik 不是 -85.0511° 到 85.0511° 形状问题