【问题标题】:d3 world map -- calculate geo bounds on zoomd3 世界地图——计算缩放的地理范围
【发布时间】:2014-11-07 23:30:33
【问题描述】:

我正在尝试调整 Mike Bostock 的受限缩放示例以满足我的需求。 (http://bl.ocks.org/mbostock/4987520)。缩放地图时,有什么方法可以计算投影的地理范围(以经度/纬度为单位)。 d3.geo.bounds() 方法需要一个“特征”——我真的不想放大任何特定的特征。我想要的只是投影可见区域的地理范围。

提前致谢, 基肖尔

【问题讨论】:

  • This 问题可能会有所帮助(或更重要的是其中的链接)。

标签: d3.js topojson


【解决方案1】:

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

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

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

这是您屏幕的边界框,以经纬度(或您使用的任何坐标系)表示。

之后,您可以获取要素的边界并测试它们是否完全包含或相交,或者它们的质心是否在这些边界内。我不打算在这里解释如何做到这一点,因为这是一个不同的问题,有许多不同的答案,具体取决于您决定的“在这些范围内”的定义。

【讨论】:

  • 再次感谢您的回复。我试过了,无论缩放比例是多少,我都会从 projection.invert() 方法中取回相同的值。在我使用 (bl.ocks.org/mbostock/4987520) 的示例中,svg 边界框的尺寸为 (600,340)。无论缩放比例是多少,当我调用 projection.invert(600, 340) 方法时,我总是得到值 [360,-86.74356437364693] 。我试图弄清楚什么是看似神奇的公式,以获取平移坐标和缩放因子,以获得可见区域的正确经纬度边界,但到目前为止还没有运气。
【解决方案2】:

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

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

【讨论】:

  • 感谢您的回复。但是,有没有办法知道缩放后投影的可见区域中有哪些特征?
  • 啊,我误解了你的问题。是的,我会给出第二个答案。
猜你喜欢
  • 1970-01-01
  • 2016-05-07
  • 2016-02-27
  • 2015-04-10
  • 1970-01-01
  • 2012-03-10
  • 2018-01-17
  • 2013-09-07
  • 1970-01-01
相关资源
最近更新 更多