【问题标题】:shp2json produces GeoJSON with bounding and coordinates not in (-180,180) rangeshp2json 生成边界和坐标不在​​ (-180,180) 范围内的 GeoJSON
【发布时间】:2017-04-14 18:00:10
【问题描述】:

我在命令行制图 1 上执行 @mbostock 的 tutorial。这是我所做的:

1) 下载压缩包

wget https://www.arb.ca.gov/ei/gislib/gislib.htm/ca_air_basins.zip (来自California Air Resources Board site)

2) 通过单击.zip 文件手动解压缩(unzip 命令不起作用,因为下载的文件没有'End-of-central-directory signature')

2) 将 shapefile 转换为 GeoJSON shp2json CaAirBasin.shp -o ca.json

3) 使用 California Albers 制作 GeoJSON 投影(在 CaAirBasin.prj 文件中指定):

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

结果: 我得到的 ca-albers.json (223M) 比 ca.json (6.3M) 大得多。在教程中使用的人口普查区 shapefile 中,文件大小从 10 增加到 14 M。

更新: 似乎问题在于shp2json 步骤而不是geoProject 步骤。查看CaAirBasin.shp.xml, 有两组边界,bounding 和lbounding. 在我的情况下,lbounding 和在 100,000s 范围内的坐标值用于与教程中的 (-180, 180) 相反,使投影失败。

下一步有什么好的 - shp2json 的替代品是否适用于我的情况?或者如何将我的边界/坐标转换为适当的(-180,180)?

谢谢。

【问题讨论】:

    标签: d3.js geojson topojson


    【解决方案1】:

    您的 shapefile 已被投影。通过 d3.geoConicEqualArea 传递它,您将它投影两次; d3.geoConicEqualArea 需要 WGS84(以度为单位的经度和纬度)作为输入,但您给它的是投影坐标。

    您可以通过查看 PRJ 文件或查看 shp2json 生成的几何图形的坐标来判断您的 shapefile 是投影的:第一个点是 [-298228.39936644124, 437516.87775637675],这远远超出了预期的范围[±180°, ±90°] 表示经度和纬度。

    与其将几何图形重新投影到新投影,最简单的方法是使用它已经在其中的投影。您需要做的就是平移和缩放以适应所需的 960×960 显示尺寸.您可以为此使用d3.geoIdentity。

    geoproject 'd3.geoIdentity().reflectY(true).fitSize([960, 960], d)' < ca.json > ca-albers.json
    

    设置identity.reflectY 也将固定几何体的垂直方向:GIS 约定是 +y 指向上方,但 Canvas 和 SVG 约定是 +y 指向下来。

    【讨论】:

    • 嗨 Mike,你的教程有点过时了,而且你使用的许多 API 都发生了变化。你介意更新你的教程吗?对初学者跟随会有帮助。谢谢!
    猜你喜欢
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-23
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多