有没有办法改变一个topojson文件中的投影?

时间:2019-07-08 23:52:50

标签: topojson map-projections ogr2ogr

我正在尝试创建一个使用geoAlbersUsa投影的topojson文件,该文件源自美国人口普查的ZCTA(本质上是邮政编码)shapefile。我可以使用指定的映射成功浏览出色的https://medium.com/@mbostock/command-line-cartography-part-1-897aa8f8ca2c中的示例,现在我正尝试使用邮政编码级别的shapefile获得相同的结果。

由于文件的大小和文件中字符串的长度,我不断遇到各种问题。虽然我已经能够创建geojson文件和topojson文件,但是我却无法为其提供我想要的geoAlbersUsa投影。我希望找到一些可以将当前topojson文件转换为带有geoAlbersUsa投影的topojson文件的方法,但是我一直找不到任何方法。

我知道可以在浏览器中以编程方式完成此操作,但是我所阅读的所有内容都表明,如果可以首先在文件本身中进行尽可能多的操作,则性能将显着提高。

尝试1:我能够使用shp2json成功将ZCTA级别的shapefile转换为geojson文件(如Mike Bostock的示例),但是当我尝试运行geoproject(从d3-geo-projection)时,我得到了与字符串太长。在节点(使用npm)中,我安装了d3-geo-projection(npm install -g d3-geo-projection),然后运行以下命令:

geoproject“ d3.geoAlbersUsa()” us_zips_albersUsa.json

我收到错误消息,指出“错误:无法创建长度超过0x3fffffe7个字符的字符串”

尝试2:我使用ogr2​​ogr(https://gdal.org/programs/ogr2ogr.html)创建了geojson文件(而不是shp2json),然后尝试运行与上述相同的geoproject代码,并得到了相同的错误。

尝试3:我使用ogr2​​ogr创建了geojson序列文件(而不是geojson文件),然后运行geo2topo从geojsons文件创建了topojson文件。尽管此操作成功创建了topojson文件,但仍未在生成的topojson文件中包括geoAlbersUsa投影。

我从ogr2ogr的相当晦​​涩的文档中得知,可以使用-a_srs来指定输出投影,但是我一生都无法弄清楚如何指定可以使我获得geoAlbersUsa投影的东西。我找到了这个参考文献https://spatialreference.org/ref/sr-org/44/,但我认为那会让我得到阿尔伯斯的青睐,并且有可能砍掉阿拉斯加和夏威夷,这不是我想要的。

这里有什么建议吗?我希望能找到一种方法来更改topojson文件本身中的投影,因为这样可以避免在尝试在需要使用geojson文件的节点中执行任何操作时遇到的过长字符串问题。看起来这可能是在早期版本的topojson中可以完成的(请参阅Ways to project topojson?),但我现在看不到任何方法。

2 个答案:

答案 0 :(得分:0)

我建议您首先也使用ogr2ogr将GeoJson文件投影到Albers投影,就像对shapefile所做的一样,然后运行geotopo

假设您的源坐标系是NAD83(即使是WGS84,但实际上我们可以假设它们在Tiger数据的详细程度上都是相同的),我们有:

来源:NAD83 EPSG: 4269 https://epsg.io/4269

对于目标坐标系,我们将Albers投影应用于NAD83地理坐标。也就是说,

目标:NAD83的阿尔伯斯:EPSG: 42303 https://epsg.io/42303

转换为:

ogr2ogr output.geojson -t_srs "EPSG:42303" input.geojson -s_srs "EPSG:4269"

可能您会忘记-s_srs选项而只写:

ogr2ogr output.geojson -t_srs "EPSG:42303" input.geojson 

您也可以尝试投影原始shapefile,然后使用已经投影的坐标进行后续转换:

ogr2ogr output.shp -t_srs "EPSG:42303" input.shp

答案 1 :(得分:0)

不是一个完整的答案,而是一个评论。

因此,我在一个随机的Github / NodeJS项目中用Google搜索“ 0x3fffffe7”并发现this comment,基于阅读,我的直觉是节点的东西和/或D3您正在使用的东西是将整个ZCTA级别的shapefile缩减为....存储在内存中的单个字符串!对于具有如此细化细节的大陆比例的地图,这是不好的。

此外,发表评论的人建议,在这种情况下,OP将需要一种不同的方法来将其数据集介绍给客户。 (我想是哪个浏览器?)对于您而言,如果您将每个州的zip集合查询到单个shapefile中(ogr2ogr可以使用OGR-SQL来完成),这可能会起作用,这将为您提供5个不同的shapefile。然后针对其中每一个,通过转换运行它们以获取json / geoalbers。要测试此概念,请尝试仅导出一个状态,然后查看其他所有功能是否均按预期工作。

话虽这么说,但我担心您对该项目的处理方式对UI /体系结构的期望不可行:我只是认为您不能在浏览器DIV中放置这么多的地理数据!我希望全屏显示的DIV有多大?!?

我的建议是考虑另一种呈现数据的方式。例如,使用inset-DIV“选择您的状态”,然后单击状态,将主DIV放大到该状态的更大视图,同时使用您使用以下命令准备的50个文件来下拉和标记该状态的特定ZCTA级数据我上面提到的策略。这有道理吗?

这是一个简单的示例,说明我希望如何将OGR_SQL应用于您的方案并适应以下情况:

ogr2ogr idaho_zcta.shp USA_zcta.shp -sql "SELECT * FROM USA_zcta WHERE STATE_NAME = 'ID'"

参数如下:

  • idaho_zcta.shp <这是您的新文件
  • USA_zcta.shp <这是您的源shapefile
  • -sql <这表示OGR_SQL查询表达式

关于查询本身,有几点提示。首先,将整个查询字符串用双引号引起来。如果发生奇怪的情况,请尝试在查询的开头和结尾添加前导和尾随空格,例如。.

" SELECT ... 'ID' "

我知道这很奇怪,但是我曾经遇到过这样的情况。

第二,相对于查询,表名称与shapefile名称相同,仅不带“ .shp”文件扩展名。我不记得shapefile名称和查询字符串的表名称之间是否区分大小写。如果遇到问题,请提供shapefile和所有小写字母的名称,并在SQL中也使用小写字母。

关于投影转换-您就在那里。 geoAlbersUSA似乎不是行业标准(即EPSG编码),并且是D3专用的,专门用于浏览器。因此,ogr2ogr不会处理它。但是我同意预先转换数据的策略。希望您已经研究过的转换管道可以通过,如果您只需要使用更小的(即状态规模)数据集。

祝你好运。