在D3 v4中渲染GeoJson文件无法正确缩放

时间:2017-04-12 20:45:31

标签: d3.js geojson qgis

我正在尝试使用GeoJSON数据渲染带有叠加层的地图。我已将数据加载到QGIS以及mapshaper中并正确呈现;但是,我的JavaScript代码没有呈现我期望的内容(整个SVG被填充,让我觉得这是一个扩展问题。)

我相信我的计算代码是准确的。

count(/myform/grp/*[text() = 'yes']) * 2

我已将示例项目上传到plunker https://plnkr.co/edit/jzXRaOs2xXpZuJraMq3p

预期结果应如下所示: Map of the US

1 个答案:

答案 0 :(得分:3)

问题在于你的geojson:

... coordinates":[[[1983816.6475302426,681422.0990409602], ...

这个数据是投影数据,也就是它使用二维笛卡尔坐标系。 D3投影使用纬度较长的对(三维地球上的点),其值在东/西和北/南90度不超过180度。在D3中假定使用的特定椭圆体是在WGS84数据中定义的。 D3期望地理数据位于此坐标空间内。

如果要使用在问题中引用的自动缩放功能,则需要重新投影数据以使其位于WGS84中(或者,找到已使用此空间参考系统的US geojson )。诸如mapshaper之类的工具可以帮助在线转换数据(尽管您可能需要在应用任何变换之前指定数据使用的空间参考系统)。

另一个选择是使用geoTransform(v3中为geo.transform)来扩展已投影的数据。由于您的数据在笛卡尔平面上已经是二维的,因此您只需创建一个函数来缩放它以匹配您的svg坐标空间。我没有考虑过这种自动缩放功能,但它应该是可能的。此处可找到geo.transform的示例(具有类似的地理特征集):

https://bl.ocks.org/andrew-reid/496078bd5e37fd22a9b43fd6be84b36b

(由于mapshaper和qGIS预期有多个不同的空间参考系统,如果在数据中指定投影,它们将正常显示此数据,或者作为普通的x,y数据,这就是为什么它似乎可以在其他平台上工作但是不是在d3投影中,假设所有数据都是长对子。)