如何从 .shp 文件 Scale/Choose D3 投影设置
How to Scale/Choose D3 Projection Settings from .shp File
我遵循 Mike Bostock 的示例,通过下载 shapefile 并将其转换为 geoJSON 创建 geoJSON 投影。我已经正确下载了文件,它们在此处在线:
https://bl.ocks.org/KingOfCramers/2c5ceb2e7526a8370d6926958654cf21
这很好用(很明显,将来我会简化形状文件以使其在浏览器上更快 运行)。现在,我希望能够为其他 shapefile 快速复制此过程。我从 Natural Earth 下载了很多,并已成功将它们转换为 JSON 文件,用于 geoJSON 和 topoJSON,但我不确定如何确定在它们上使用哪个投影.
有没有办法快速检查 .shp 文件(或在转换后 JSON)以确定要使用的 D3 投影、要使用的 "translate" 值以及任何其他预设为了我的投影?或者,如果我要在映射文件之前使用 geoproject,我该如何找到要插入的值?这是 Mike Bostock 的例子:
geoproject 'd3.geoConicEqualArea().parallels([34, 40.5]).rotate([120, 0]).fitSize([960, 960], d)' < ca.json > ca-albers.json
他怎么知道轮换值的?他如何知道将哪些参数输入该函数?
举一个未完成的例子,这是我的bl.ock当前地球,但是投影打破了JSON,因为显然我的投影设置不对:
http://blockbuilder.org/KingOfCramers/16be1bf014683572086511c6a8bd7470
-- 或--
https://bl.ocks.org/KingOfCramers/16be1bf014683572086511c6a8bd7470
我可以将这个 JSON 文件放到 mapshaper 中,它可以快速完美地投影它。我希望能够在 D3 中执行此操作,或者至少在映射之前转换文件。我假设信息存储在 JSON 文件中的某处?或者可以使用 Mike Bostock 推荐的 JSON 投影转换器以某种方式访问,geoproject?感谢您提供的任何帮助!
关键问题
D3 假定要投影的文件需要投影 - 也就是说,它假定文件尚未已经 投影。这适用于从命令 lie 预先投影您的文件,以便您可以在没有 d3 投影的情况下显示它们。如果使用投影特征,您将得不到想要的结果 - 您必须先取消投影特征。
如果使用标准的 d3 投影,例如 d3.geoAlbers,数据必须是未投影的并且包含纬度经度对。
未预测与预测
未投影的要素是那些具有纬度和经度坐标的要素,它们是位于三维地球上的点。要显示这些,我们需要一个投影函数(最简单:lat = y,long = x,一个 plate carree 投影)。
投影特征是具有笛卡尔 x,y 坐标的特征。它们是某些投影函数的产物,因此会导致以下部分或全部失真:形状、面积、距离或方向。
使用投影数据的迹象
颠倒特征
颠倒的特征很容易表明您的特征已经投影。投影地理数据一般特征和原点在特征的左下方,随着向北移动,y值增加。 SVG坐标space则相反,向南y值增加。
在 mapshaper 中显示数据时,如果包含 shapefiles .prj 文件,mapshaper 将根据此投影数据。这将确保 north 为真。使用 d3 显示此数据时,除非将其烘焙到投影函数中,否则 y 轴上没有翻转。
投影文件
其次,每个 shapefile(或绝大多数)附带的 prj 文件会告诉您特征是否被投影。如果您的 prj 文件列出了 Albers、Conic 等任何内容,那么您就有了投影数据。您需要使用 WGS84 基准或未投影(也使用 WGS84)来获取数据 "projected"。使用此坐标 space 的数据的 EPSG 编号为 4326,prj 文件应如下所示:
GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]
坐标域
最后,如果在 mapshaper(或任何其他处理 geojson 的 GIS 实用程序)中将数据导出为 geojson,如果您看到坐标超过 [+/-180,+/-90]
,则您可能正在处理投影数据,这经常使用米等计量单位。
如果你包含一个文件和一个投影函数,我可以提供一些更具体的符号而不是这些概括。
简单的解决方案
如果不想修改传入数据的投影,可以使用恒等投影:
d3.geoIdentity().reflectY(true).fitSize([w, h], geojson)
这不会修改输入投影,本质上它只是缩放和翻转输入特征以匹配您预期的 svg/canvas 尺寸。
缺点是您不能将已经投影为阿尔伯斯等面积的要素直接转换为等距方位角投影。此外,这种方法可能难以在预先投影的要素之上叠加具有地理坐标的位置 - 为此,您将需要重新创建要素最初出现的投影。
好处是简单,对于没有任何地理覆盖在投影特征上的等值线或可视化效果很好。
更灵活的解决方案
首先取消投影您的数据,在 mapshaper 中您可以执行此操作,假设您使用控制台 window 并输入以下内容导入了 prj 文件:
proj wgs84
现在您可以为 d3 重新投影或预投影。命令行还有其他工具,而像 QGIS 这样的程序也可以帮助快速转换数据。
这样做的好处是,您可以轻松地将在命令行中使用的投影重新应用到要叠加在上面的任何点,当然您也可以轻松修改投影。
选择什么项目参数
如果遵循第二种方法或将地理坐标叠加在使用第一种方法显示的要素之上,选择什么投影参数的问题又变得相关了。
选择的投影参数非常具体,通常直接取自标准投影。 shapefile 的 .prj 文件包含重新创建 shapefile 中使用的投影所需的一切。 介绍如何使用 d3 投影模拟 prj 文件。
SpatialReference.org is a great reference for finding parameters to different projections. There is a good chance that the California Albers example was based on a standard projection that you can find on this site, probably this one。当然,当 Mike Bostock 使用此投影时,他将其应用于未投影的数据。
我遵循 Mike Bostock 的示例,通过下载 shapefile 并将其转换为 geoJSON 创建 geoJSON 投影。我已经正确下载了文件,它们在此处在线:
https://bl.ocks.org/KingOfCramers/2c5ceb2e7526a8370d6926958654cf21
这很好用(很明显,将来我会简化形状文件以使其在浏览器上更快 运行)。现在,我希望能够为其他 shapefile 快速复制此过程。我从 Natural Earth 下载了很多,并已成功将它们转换为 JSON 文件,用于 geoJSON 和 topoJSON,但我不确定如何确定在它们上使用哪个投影.
有没有办法快速检查 .shp 文件(或在转换后 JSON)以确定要使用的 D3 投影、要使用的 "translate" 值以及任何其他预设为了我的投影?或者,如果我要在映射文件之前使用 geoproject,我该如何找到要插入的值?这是 Mike Bostock 的例子:
geoproject 'd3.geoConicEqualArea().parallels([34, 40.5]).rotate([120, 0]).fitSize([960, 960], d)' < ca.json > ca-albers.json
他怎么知道轮换值的?他如何知道将哪些参数输入该函数?
举一个未完成的例子,这是我的bl.ock当前地球,但是投影打破了JSON,因为显然我的投影设置不对:
http://blockbuilder.org/KingOfCramers/16be1bf014683572086511c6a8bd7470
-- 或--
https://bl.ocks.org/KingOfCramers/16be1bf014683572086511c6a8bd7470
关键问题
D3 假定要投影的文件需要投影 - 也就是说,它假定文件尚未已经 投影。这适用于从命令 lie 预先投影您的文件,以便您可以在没有 d3 投影的情况下显示它们。如果使用投影特征,您将得不到想要的结果 - 您必须先取消投影特征。
如果使用标准的 d3 投影,例如 d3.geoAlbers,数据必须是未投影的并且包含纬度经度对。
未预测与预测
未投影的要素是那些具有纬度和经度坐标的要素,它们是位于三维地球上的点。要显示这些,我们需要一个投影函数(最简单:lat = y,long = x,一个 plate carree 投影)。
投影特征是具有笛卡尔 x,y 坐标的特征。它们是某些投影函数的产物,因此会导致以下部分或全部失真:形状、面积、距离或方向。
使用投影数据的迹象
颠倒特征
颠倒的特征很容易表明您的特征已经投影。投影地理数据一般特征和原点在特征的左下方,随着向北移动,y值增加。 SVG坐标space则相反,向南y值增加。
在 mapshaper 中显示数据时,如果包含 shapefiles .prj 文件,mapshaper 将根据此投影数据。这将确保 north 为真。使用 d3 显示此数据时,除非将其烘焙到投影函数中,否则 y 轴上没有翻转。
投影文件
其次,每个 shapefile(或绝大多数)附带的 prj 文件会告诉您特征是否被投影。如果您的 prj 文件列出了 Albers、Conic 等任何内容,那么您就有了投影数据。您需要使用 WGS84 基准或未投影(也使用 WGS84)来获取数据 "projected"。使用此坐标 space 的数据的 EPSG 编号为 4326,prj 文件应如下所示:
GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]
坐标域
最后,如果在 mapshaper(或任何其他处理 geojson 的 GIS 实用程序)中将数据导出为 geojson,如果您看到坐标超过 [+/-180,+/-90]
,则您可能正在处理投影数据,这经常使用米等计量单位。
如果你包含一个文件和一个投影函数,我可以提供一些更具体的符号而不是这些概括。
简单的解决方案
如果不想修改传入数据的投影,可以使用恒等投影:
d3.geoIdentity().reflectY(true).fitSize([w, h], geojson)
这不会修改输入投影,本质上它只是缩放和翻转输入特征以匹配您预期的 svg/canvas 尺寸。
缺点是您不能将已经投影为阿尔伯斯等面积的要素直接转换为等距方位角投影。此外,这种方法可能难以在预先投影的要素之上叠加具有地理坐标的位置 - 为此,您将需要重新创建要素最初出现的投影。
好处是简单,对于没有任何地理覆盖在投影特征上的等值线或可视化效果很好。
更灵活的解决方案
首先取消投影您的数据,在 mapshaper 中您可以执行此操作,假设您使用控制台 window 并输入以下内容导入了 prj 文件:
proj wgs84
现在您可以为 d3 重新投影或预投影。命令行还有其他工具,而像 QGIS 这样的程序也可以帮助快速转换数据。
这样做的好处是,您可以轻松地将在命令行中使用的投影重新应用到要叠加在上面的任何点,当然您也可以轻松修改投影。
选择什么项目参数
如果遵循第二种方法或将地理坐标叠加在使用第一种方法显示的要素之上,选择什么投影参数的问题又变得相关了。
选择的投影参数非常具体,通常直接取自标准投影。 shapefile 的 .prj 文件包含重新创建 shapefile 中使用的投影所需的一切。
SpatialReference.org is a great reference for finding parameters to different projections. There is a good chance that the California Albers example was based on a standard projection that you can find on this site, probably this one。当然,当 Mike Bostock 使用此投影时,他将其应用于未投影的数据。