gpt4 book ai didi

javascript - 如何从.shp文件缩放/选择D3投影设置

转载 作者:行者123 更新时间:2023-11-29 10:30:08 25 4
gpt4 key购买 nike

我遵循Mike Bostock的示例,该示例通过下载shapefile并将其转换为geoJSON来创建geoJSON投影。我已经正确下载了文件,它们在这里在线:

https://bl.ocks.org/KingOfCramers/2c5ceb2e7526a8370d6926958654cf21

这可以很好地工作(显然,将来我会简化形状文件以使其在浏览器中更快地运行)。现在,我希望能够为其他shapefile快速复制此过程。我已经从Natural Earth下载了许多文件,并将它们成功转换为JSON文件,可用于geoJSON和topoJSON,但是我不确定如何确定在其上使用哪种投影。

有没有一种方法可以快速检查.shp文件(或在将其转换为JSON之后),以确定要使用的D3投影,要使用的“转换”值以及我的投影的其他任何预设?或者,如果在映射文件之前要使用geoproject,我如何找到要插入的值?这是Mike Bostock的示例:

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

他怎么知道旋转值?他如何知道向该函数提供哪些参数?

对于一个未完成的示例,这是我当前的环境,但是投影破坏了JSON,因为显然我的投影设置不正确:

http://blockbuilder.org/KingOfCramers/16be1bf014683572086511c6a8bd7470

- 要么 -

https://bl.ocks.org/KingOfCramers/16be1bf014683572086511c6a8bd7470

enter image description here
我可以将此JSON文件放到mapshaper中,后者可以快速,完美地进行投影。我希望能够在D3中执行此操作,或者至少在映射文件之前将其转换。我假设信息存储在JSON文件中的某个位置?或者可以使用Mike Bostock建议的JSON投影转换器以某种方式访问​​geoproject?感谢您的任何帮助,您可以提供!

最佳答案

关键问题

D3假定要投影的文件需要投影-也就是说,假定文件尚未投影。如果通过命令lie对文件进行预投影,则可以使用此文件,而无需d3投影就可以显示它们。如果使用投影功能,则不会获得所需的结果-必须先取消投影功能。

如果使用标准d3投影,例如d3.geoAlbers,则数据必须是非投影的,并且必须包含纬度经度对。

未投影与预计的

未投影的要素是具有纬度和经度坐标的要素,它们是位于三维地球上的点。为了显示这些,我们需要一个投影函数(最简单的是:lat = y,long = x,板角投影)。

投影特征是具有笛卡尔x,y坐标的特征。它们是某些投影函数的产物,结果导致某些或所有形状,面积,距离或方向失真。

使用投影数据的迹象

颠倒功能

上下颠倒的功能可以轻松指示您的功能已经投影。投影的地理数据通常具有特征,并且特征的左下角是原点,随着向北移动,y值会增加。 SVG坐标空间正好相反,随着向南移动y值增加。

如果包含shapefiles .prj文件,则在mapshaper中显示数据时,mapshaper将根据此投影数据。这将确保north为真。使用d3显示此数据时,除非将其烘焙到投影功能中,否则y轴上没有翻转。

投影档

其次,每个shapefile(或绝大多数)随附的prj文件将告诉您是否投影了特征。如果您的prj文件列出了像Albers,Conic等之类的文件,则说明您已经投影了数据。您需要使用WGS84基准面对数据进行“投影”或不进行投影(也使用WGS84)。使用此坐标空间的数据的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中,您可以执行此操作,假设您已通过使用控制台窗口并键入以下命令导入了prj文件:
proj wgs84

现在您可以为d3重新投影或预投影。命令行还有其他工具,而QGIS之类的程序也可以帮助快速转换数据。

这样做的好处是,您可以轻松地将在命令行上使用的投影重新应用到要叠加在顶部的任何点上,并且当然可以轻松地修改投影。

选择什么项目参数

如果遵循第二种方法或将地理坐标叠加在使用第一种方法显示的要素之上,那么选择哪种投影参数的问题就再次变得重要。

选择的投影参数非常具体地选择,通常直接取自标准投影。 shapefile的.prj文件包含重新创建shapefile中使用的投影所需的所有内容。该 answer讨论了如何使用d3投影模拟prj文件。

SpatialReference.org是查找不同投影参数的重要引用。 California Albers的示例很有可能基于您可以在此站点上找到的标准投影,可能是 this one。当然,当Mike Bostock使用此投影时,他将其应用于未投影的数据。

关于javascript - 如何从.shp文件缩放/选择D3投影设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48270218/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com