d3世界地图——缩放时计算地理边界



我正在尝试调整Mike Bostock的受限缩放示例以满足我的需求。(http://bl.ocks.org/mbostock/4987520)。当地图缩放时,有什么方法可以计算投影的地理边界(长/宽)吗。d3.geo.bounds()方法需要一个"feature"——我真的不想放大任何特定的功能。我想要的只是投影可见区域的地理边界。

提前感谢,Kishore

我的另一个答案是对这个问题的误读,但我会把它留在那里,以防其他人以同样的方式误读了这个问题。

要在屏幕上找到地图可视区域的边界框,只需使用projection.inverse()函数并将其输入SVG的左上角和右下角。如果你有一个500x500的SVG,那么它看起来是这样的:

 projection.invert([0,0])
 projection.invert([500,500])

这是屏幕的边界框,以lat-long(或您使用的任何坐标系)为单位。

之后,您可以获得特征的边界,并测试它们是否完全包含或相交,或者它们的质心是否在这些边界内。我不打算在这里解释如何做到这一点,因为这是一个不同的问题,有很多不同的答案,取决于你决定的"在这些界限内"的定义

我不知道有任何内置功能可以提供一组功能的边界,但这里有一个非常简单的函数可以做到这一点:

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),它就会为您的整个集合返回一个边界框。

最新更新