我正在尝试使用 D3 显示旧金山的 GeoJSON 地图。我使用“http-server -c-1”提供以下文件:
索引.html:
<!DOCTYPE html>
<html>
<head>
<script src="http://d3js.org/d3.v4.min.js"></script>
</head>
<body>
<script src="./d3Map.js"></script>
</body>
</html>
d3Map.js:
const d3 = window.d3;
// Append a svg to the HTML body and set its height and width:
const svg = d3.select('body')
.append('svg')
.attr('height', 500)
.attr('width', 500)
// Append the <g> element which is used for grouping SVGs:
const g = svg.append('g');
// Get the GeoJSON data and use it to setup the paths:
d3.json('./sfmaps/neighborhoods.json', (error, topology) => {
// Setup the projection:
const bounds = d3.geoBounds(topology);
const centerX = d3.sum(bounds, (d) => d[0]) / 2;
const centerY = d3.sum(bounds, (d) => d[1]) / 2;
const projection = d3.geoMercator()
.center([centerX, centerY]);
// Create a geographic path generator and set its projection:
const path = d3.geoPath()
.projection(d3.geoMercator());
g.selectAll('path')
.data(topology.features)
.enter()
.append('path')
.attr('d', path);
});
当我检查结果页面时,我有:
<body>
<svg>
<g>
<path d="..."></path>
<path d="..."></path>
...
</g>
</svg>
</body
但是,显示的 SVG 是空白的。
我怀疑投影没有正确缩放或居中,所以我尝试省略 .center(...),硬编码中心和旧金山的纬度和经度,并使用 .fitSize(...)。
我对文档的术语感到有些困惑。当它说一个值应该是 GeoJSON 对象时,我不确定这是否意味着它应该是整个 JSON(我在代码中命名为“拓扑”)、特征(topology.features)或单个路径(拓扑.特征[0])。但是,我尝试使用所有这三个,但它们都没有工作或在控制台中显示错误。
GeoJSON 文件是由其他人制作的,所以我相当肯定它是正确的。
你对我可能做错了什么或我应该寻求什么途径来调试这个有什么建议吗?