我试图使用GeoJSON数据呈现一个覆盖的地图。我已经将数据加载到QGIS和mapshaper中,并且它正确地呈现;但是,我的JavaScript代码并没有呈现我所期望的结果(整个SVG都被填充了,这使我认为这是一个缩放问题)。
我相信我计算比额表的代码是准确的。
var bounds = path.bounds(us),
scale = .95 / Math.max((bounds[1][0] - bounds[0][0]) / width, (bounds[1][1] - bounds[0][1]) /height),
translation = [(width - scale * (bounds[1][0] + bounds[0][0])) / 2, (height - scale * (bounds[1][1] + bounds[0][1])) / 2];我已经将我的示例项目上传到柱塞https://plnkr.co/edit/jzXRaOs2xXpZuJraMq3p。
预期结果应该如下所示:

发布于 2017-04-12 22:54:14
问题在于你的地理位置:
... coordinates":[[[1983816.6475302426,681422.0990409602], ...这个数据是投影数据,也就是说它使用二维笛卡儿坐标系。D3投影使用lat长对(三维地球上的点),其值不超过东西向180度和南北90度。D3中lat长对应该使用的特定椭球是在WGS84基准中定义的。D3期望地理数据位于这个坐标空间内。
如果您想使用您在问题中引用的自动缩放函数,那么您将需要重新设计数据,使其位于WGS84中(或者,找到已经使用此空间参考系统的美国geojson )。像映射器这样的工具可以帮助在线转换数据(尽管在应用任何转换之前,您可能需要指定数据使用的空间引用系统)。
另一种选择是使用geoTransform (geo.transform in v3)来缩放您已经预测的数据。由于您的数据在笛卡儿平面上已经是二维的,所以您可以简单地创建一个函数来缩放它以匹配您的svg坐标空间。我还没有考虑过使用自动标度函数,但这应该是可能的。geo.transform的一个例子在这里找到(具有类似的地理特征集):
https://bl.ocks.org/andrew-reid/496078bd5e37fd22a9b43fd6be84b36b
(由于mapshaper和qGIS预期有多个不同的空间参考系统,如果在数据中指定了投影,或者将投影指定为普通x,y数据,它们通常会显示这些数据,这就是为什么它似乎在其他平台上工作,但在假定所有数据都是长对的d3投影中不起作用)。
https://stackoverflow.com/questions/43379342
复制相似问题