无法使用geo2topo将Shapefile转换为TopoJSON的技术求助
我来帮你梳理下可能导致渲染失败的几个常见原因,毕竟处理地理数据时踩过不少类似的坑😎:
坐标系不匹配:很多BC省的Shapefile用的是本地投影(比如BC Albers或UTM),但D3的地理路径生成器默认期望WGS84(EPSG:4326)经纬度坐标系。你的命令里没有做投影转换,生成的TopoJSON坐标可能是平面投影值,D3无法识别。解决方法是在
shp2json时添加投影转换参数:geo2topo regions=<(shp2json --crs EPSG:4326 ABMS_RD_polygon.shp) \ | toposimplify -P 0.1 \ | topoquantize 1e5 \ > bc.json也可以先用
ogr2ogr提前转换Shapefile的坐标系,再进行后续处理。Shapefile文件名/路径错误:确认命令中的
ABMS_RD_polygon.shp和你实际下载的文件名称完全一致,路径也正确。可以先单独运行shp2json ABMS_RD_polygon.shp | head,看看是否输出了有效的GeoJSON数据——如果是空的或者报错,说明文件读取有问题。简化/量化参数过度:
toposimplify -P 0.1的简化比例太高(仅保留10%的顶点),可能把多边形简化成空对象或者产生自相交的几何,导致D3渲染出错。建议先去掉简化和量化步骤,直接生成最基础的TopoJSON测试:geo2topo regions=<(shp2json --crs EPSG:4326 ABMS_RD_polygon.shp) > bc-test.json如果这个基础文件能正常渲染,再逐步调整简化参数(比如改成
-P 0.01保留1%顶点,或者用-s 5设置固定简化阈值)和量化参数。D3代码中的对象名不匹配:你的命令里生成的TopoJSON对象名为
regions(regions=<(...)),但如果你的D3代码里引用的是其他名称(比如示例中的states或provinces),就会找不到数据。确认代码中是这样调用的:d3.json("bc.json").then(function(bcData) { const features = topojson.feature(bcData, bcData.objects.regions).features; // 后续渲染逻辑 });
内容的提问来源于stack exchange,提问作者brownshoes

