shp2json 生成边界和坐标不在 (-180,180) 范围内的 GeoJSON
shp2json produces GeoJSON with bounding and coordinates not in (-180,180) range
我在命令行制图 1 上做@mbostock 的 tutorial。这是我所做的:
1) 下载 zip 文件
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 M 增加到 14 M。
更新:
问题似乎出在 shp2json
步骤而不是 geoProject
步骤。查看 CaAirBasin.shp.xml,
有两组边界,bounding
和 lbounding.
在我的例子中,lbounding
和 100,000s 范围内的坐标值被使用而不是 (- 180, 180) 在教程中,使投影失败。
什么是好的下一步 - 是否有替代 shp2json
的方法适合我的情况?或者如何将我的 bounding/coordinates 翻译成合适的 (-180,180)?
谢谢。
您的 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 指向下方。
我在命令行制图 1 上做@mbostock 的 tutorial。这是我所做的:
1) 下载 zip 文件
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 M 增加到 14 M。
更新:
问题似乎出在 shp2json
步骤而不是 geoProject
步骤。查看 CaAirBasin.shp.xml,
有两组边界,bounding
和 lbounding.
在我的例子中,lbounding
和 100,000s 范围内的坐标值被使用而不是 (- 180, 180) 在教程中,使投影失败。
什么是好的下一步 - 是否有替代 shp2json
的方法适合我的情况?或者如何将我的 bounding/coordinates 翻译成合适的 (-180,180)?
谢谢。
您的 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 指向下方。