ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-11-10 16:37:28  阅读:383  来源: 互联网

标签:geojson shapefile d3-js json javascript


我遵循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使用此投影时,他将其应用于非投影数据.

标签:geojson,shapefile,d3-js,json,javascript
来源: https://codeday.me/bug/20191110/2013646.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有