使用D3 v4映射内布拉斯加州学区-基本层未显示

时间:2019-03-04 16:09:22

标签: json d3.js geojson topojson

我在D3(v4)中绘制内布拉斯加州学区时遇到麻烦。 (请参阅bl.ock here。)我可以映射内布拉斯加州的县没有问题,但是为学区修改的相同代码(并指向学区的TopoJSON文件)为我提供了一个空白页。

这是我基于Mike Bostock's excellent instructions创建JSON的方式:

curl "https://www2.census.gov/geo/tiger/GENZ2017/shp/cb_2017_31_unsd_500k.zip" -o cb_2017_31_unsd_500k.zip

unzip -o cb_2017_31_unsd_500k.zip
shp2json cb_2017_31_unsd_500k.shp -o ne_district.json
ndjson-split "d.features" < ne_district.json > ne_district.ndjson
ndjson-map "d.id = d.properties.GEOID, d" < ne_district.ndjson > ne_district-id.ndjson
geo2topo -n districts=ne_district-id.ndjson > ne_district-id-topo.json

这是我的预测:

var projection = d3.geoConicConformal()
   .parallels([40, 43])
   .rotate([100, 0])
   .scale(8000); 

对于您遗漏的重要事项,感谢您的帮助和歉意!

1 个答案:

答案 0 :(得分:1)

问题是您尚未完成投影参数的设置。您已经旋转了地图,这就是您应该沿x轴使圆锥投影居中的方式。但是您尚未将地图以y轴为中心,而是以赤道为中心。你

对于圆锥形投影,您可以通过以下三种方式之一进行操作:

  • 以中心纬度为地图中心:projection.center([0,y])

您不需要将.center与x值一起使用,因为地图已经通过旋转在x上居中,旋转和居中是累积的

  • 将地图旋转到中心纬度和经度:projection.rotate([-x,-y])

在圆锥投影上,子午线上的旋转不会使地图扭曲(通常),当我们在下方移动地球时,我们将由负旋转。此选项相对于其他选项确实会使地图稍微变形-这可能是更可取的。

  • 使用投影平移将地图居中

最简单的方法是转换结果,同时使用projection.fitSizeprojection.fitExtent自动缩放(尽管您也可以手动缩放)。这些方法修改了projection.scale和projection.translate。与.center居中一样,您需要保持旋转-否则您将对地图产生奇怪的倾斜。 这些方法将转换和缩放设置为适当的值,以便您的地图区域包含所需的功能:

var featureCollection = topojson.feature(ne, ne.objects.districts);
projection.fitSize([width,height],featureCollection);

这些方法必须采用对象,而不是数组,因此我们将featureCollection而不是要素作为数组使用

这两个方法都使用一个数组,该数组指定大小以将提供的geojson对象拉伸到上面:

projection.fitSize([mapwidth,mapheight],geojsonObject)
projection.fitExtent([[left,top],[right,bottom]],geojsonObject)

这里是使用fitSize的updated要点。