我在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);
对于您遗漏的重要事项,感谢您的帮助和歉意!
答案 0 :(得分:1)
问题是您尚未完成投影参数的设置。您已经旋转了地图,这就是您应该沿x轴使圆锥投影居中的方式。但是您尚未将地图以y轴为中心,而是以赤道为中心。你
对于圆锥形投影,您可以通过以下三种方式之一进行操作:
projection.center([0,y])
您不需要将.center与x值一起使用,因为地图已经通过旋转在x上居中,旋转和居中是累积的
projection.rotate([-x,-y])
在圆锥投影上,子午线上的旋转不会使地图扭曲(通常),当我们在下方移动地球时,我们将由负旋转。此选项相对于其他选项确实会使地图稍微变形-这可能是更可取的。
最简单的方法是转换结果,同时使用projection.fitSize
或projection.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要点。