首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何从D3文件中缩放/选择.shp投影设置

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

Stack Overflow用户
提问于 2018-01-15 12:28:44
回答 1查看 312关注 0票数 3

我遵循Mike创建geoJSON投影的示例,下载shapefiles并将其转换为geoJSON。我已经正确下载了这些文件,它们都在网上:

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

这很好(很明显,将来我将简化形状文件,使其在浏览器上运行得更快)。现在,我希望能够快速复制这个过程,用于其他的shapefiles。我从自然地球下载了很多,并成功地将它们转换成JSON文件,以便在geoJSON和topoJSON中使用,但我不知道如何确定在它们上使用哪个投影。

是否有一种快速检查.shp文件(或在转换JSON之后)以确定要使用哪个D3投影、使用哪个“转换”值以及用于我的投影的其他预置的方法?或者,如果我要在映射文件之前使用地质工程,我如何找到要插入的值?下面是的例子:

代码语言:javascript
运行
AI代码解释
复制
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推荐的JSON投影转换器来访问geoproject?谢谢你能提供的任何帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-15 13:32:57

密钥问题

D3假设要投影的文件需要投影-也就是说,它假定文件尚未被投影。如果将文件从命令lie预投影,以便您可以在不使用d3投影的情况下显示它们,则应用此方法。如果使用投影功能,您将不会得到您想要的结果-您必须首先取消您的功能项目。

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

非预计与预计

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

投影特征是具有笛卡尔x,y坐标的特征。它们是某些投影函数的乘积,从而导致部分或全部:形状、面积、距离或方向的畸变。

使用投影数据的标志

倒向特征

颠倒功能是一个简单的指标,你的功能已经被投影。预计的地理数据一般特征和起源在特征的左下角,当一个人向北移动时,y值增加。SVG坐标空间是相反的,随着南移y值的增加。

当您在mapshaper中显示数据时,如果您包含一个shapefiles .prj文件,mapshaper将根据此投影您的数据。这将确保北方是正确的。当使用d3显示这些数据时,y轴上没有翻转,除非您将其放入投影函数中。

投影文件

其次,每个shapefile (或绝大多数)附带的prj文件将告诉您功能是否投影。如果您的prj文件列出了类似Alber、Conic等的内容,那么您就有了投影数据。您需要使用WGS84数据或非投影数据(也使用WGS84)将数据“投影”。使用此坐标空间的数据的EPSG编号为4326,prj文件应该如下所示:

代码语言:javascript
运行
AI代码解释
复制
GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]

坐标域

最后,如果在mapshaper (或处理geojson的任何其他地理信息系统实用程序)中,您要将数据导出为geojson,如果您看到的坐标超过了[+/-180,+/-90],那么您可能处理的是投影数据,它通常使用一个度量单位,比如米。

如果您包括一个文件和一个投影函数,我可以提供一些更具体的符号,而不是这些概括。

易解

如果不想修改输入的数据的投影,可以使用标识投影:

d3.geoIdentity().reflectY(true).fitSize([w, h], geojson)

这将不会修改输入投影,本质上它只是缩放和翻转输入特性,以匹配您预期的svg/画布尺寸。

缺点是你不能把已经投影成阿尔贝尔斯等面积的特征直接转换成方位角等距投影。此外,这种方法可能会使你很难将地理坐标叠加在你的预投影功能之上--因为你需要重新创建最初加入的投影。

优点是简单,这是很好的合唱或可视化,没有任何地理覆盖的投影特征。

更灵活的解决方案

首先,在mapshaper中,如果您通过使用控制台窗口导入prj文件并键入:

代码语言:javascript
运行
AI代码解释
复制
proj wgs84

现在,您可以对d3进行重新规划或预项目。还有其他工具用于命令行,而像QGIS这样的程序也可以帮助快速转换数据。

这样做的好处是,您可以轻松地将命令行上使用的投影重新应用于任何想要覆盖在顶部的点,当然,您也可以轻松地修改投影。

选择的项目参数

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

选择的投影参数非常具体,通常直接从标准投影中选取。shapefile的.prj文件包含重新创建shapefile中使用的投影所需的所有内容。这个回答将讨论如何用d3投影来模拟prj文件。

SpatialReference.org是寻找不同投影参数的重要参考。加州阿尔贝尔斯的例子很有可能是基于一个标准的投影,你可以在这个网站上找到,可能是这一个。当然,当Mike使用这一预测时,他将其应用于未预测的数据。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48270218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文