我正在尝试调整Mike Bostock的约束缩放示例以满足我的需求。 (http://bl.ocks.org/mbostock/4987520)。有什么方法可以在缩放地图时计算投影的地理边界(长/纬度)。 d3.geo.bounds()方法需要一个“功能” - 我真的不想放大任何特定功能。我想要的只是投影可见区域的地理界限。
提前致谢, 基肖尔马布
答案 0 :(得分:2)
我的另一个答案是对这个问题的误读,但是如果其他人以同样的方式误读了这个问题,我会把它留在那里。
要在屏幕上找到地图可视区域的边界框,只需使用projection.invert()函数并将其输入SVG的左上角和右下角。如果您有500x500 SVG,那么看起来像这样:
projection.invert([0,0])
projection.invert([500,500])
这是你的屏幕的边界框,在lat-long(或你正在使用的任何坐标系统)。
之后,您可以获取要素的边界并进行测试,以查看它们是完全包含还是相交,或者在这些边界内具有质心。我不打算在这里解释如何做到这一点,因为这是一个不同的问题,有许多不同的答案取决于你决定的“在这些界限内”的定义。
答案 1 :(得分:1)
我不知道任何内置功能来提供一组功能的界限,但这是一个非常简单的功能:
function boundingExtent(features) {
var boundExtent = [[0,0],[0,0]];
for (var x in features) {
thisBounds = d3.geo.bounds(features[x]);
boundExtent[0][0] = Math.min(thisBounds[0][0],boundExtent[0][0]);
boundExtent[0][1] = Math.min(thisBounds[0][1],boundExtent[0][1]);
boundExtent[1][0] = Math.max(thisBounds[1][0],boundExtent[1][0]);
boundExtent[1][1] = Math.max(thisBounds[1][1],boundExtent[1][1]);
}
return boundExtent;
}
有了这个,您可以将功能数组传递给boundingExtent(featureArray),它将为您提供整个集合的边界框。