【问题标题】:Retrieve geo-coordinates from d3-tile从 d3-tile 检索地理坐标
【发布时间】:2018-06-17 04:38:06
【问题描述】:

我正在尝试在地理平铺地图上返回 [x,y] 地理坐标。如果您查看以下jsfiddle 的控制台日志,您会发现它们出错了。我正在使用 projection.invert() 函数,我假设它从像素向后工作以返回地理坐标……我做错了什么?

这是一段试图获取坐标的代码:

function mousemoved() {
  console.log(formatLocation(projection.invert(d3.mouse(this)), d3.zoomTransform(this).k));
}

function formatLocation(p, k) {
  var format = d3.format("." + Math.floor(Math.log(k) / 2 - 2) + "f");
  return (p[1] < 0 ? format(-p[1]) + "°S" : format(p[1]) + "°N") + " "
       + (p[0] < 0 ? format(-p[0]) + "°W" : format(p[0]) + "°E");
}

【问题讨论】:

  • 我猜那个投反对票的家伙知道问题的答案...... :)
  • 没有投反对票,但可能对此有答案(我发现 d3-tile 投影有点绕圈子,反转它可能也需要绕圈子)。
  • 你好安德鲁。我一直在为 D3 Tiles 上的投影而苦苦挣扎。我在这里提出了另一个类似的问题:stackoverflow.com/questions/50891330/…

标签: javascript d3.js


【解决方案1】:

我知道的 D3-tile 示例(和您的小提琴)(包括 d3-tile 文档中的大多数示例)通常使用 1/tau 的投影比例(并且没有投影转换值),它会绘制一个像素空间内的地球。

var projection = d3.geoMercator()
    .scale(1 / tau)
    .translate([0, 0]); 

虽然投影将 3 维纬度/经度对转换为笛卡尔坐标,但 d3-zoom 会进行所有缩放和平移以填充地图尺寸。将鼠标坐标反转为长/纬度对时,必须考虑这种缩放。

因此,要获得 svg 上某个点的纬度/经度对,我们需要回溯。如果要反转缩放,首先我们需要获取鼠标坐标,然后我们可以反转投影:

var transform = d3.zoomTransform(svg.node()); // get the current zoom
var xy = transform.invert(d3.mouse(this));    
var longlat = projection.invert(xy);          

(另请参阅,this answer on transform.invert())

这是updated fiddle

【讨论】:

  • 谢谢安德鲁 - 这是一个非常完整的答案。我看到这也是github.com/d3/d3-plugins/issues/37 的辩论主题,其他窥视者一直在努力理解投影在 d3-tiles 中的工作原理。
猜你喜欢
  • 2016-05-15
  • 2021-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多