Javascript 在d3 svg路径中查找坐标

Javascript 在d3 svg路径中查找坐标,javascript,d3.js,svg,Javascript,D3.js,Svg,请在阅读前注意: 这是我在大学里为一个班级做的一个项目,如果你知道答案的话;请只提示我正确的方向或举个例子。出于同样的原因,我也不会发布我的全部代码,但我会详细描述我的进度 对于这个项目,我用d3创建了一个地图。我正在添加功能,但在搜索了几个小时的互联网并尝试了一些东西后,我找不到这个问题的答案: 要在地图的侧栏中显示额外信息,我需要检查数据中的坐标是否在给定的svg路径中。 我可以使用以下命令在地图上显示坐标: var coords = projection([longitude, latit

请在阅读前注意: 这是我在大学里为一个班级做的一个项目,如果你知道答案的话;请只提示我正确的方向或举个例子。出于同样的原因,我也不会发布我的全部代码,但我会详细描述我的进度

对于这个项目,我用d3创建了一个地图。我正在添加功能,但在搜索了几个小时的互联网并尝试了一些东西后,我找不到这个问题的答案:

要在地图的侧栏中显示额外信息,我需要检查数据中的坐标是否在给定的svg路径中。 我可以使用以下命令在地图上显示坐标:

var coords = projection([longitude, latitude]);
之后,我可以使用数组在正确的区域显示坐标

路径的绘制方式如下所示:

svg.selectAll(".geodata")
  .data(geodata)
  .enter().append("path")
地理数据的定义如下:

var geodata = topojson.feature(data, data.objects.collection).features;
这是一个铸造到geojson的topojson。(它存储为topojson,因为这些文件较小,将在Web应用程序上使用。)

但是,我无法检查特定坐标是否在给定路径中,以下是我尝试的方法:

  • polygonContains()-我相信这一个不起作用,因为我正在处理路径,即使从技术上讲它是一个多边形,但它当然不是存储为多边形的,所以我无法以那种方式操纵它
  • document.elementByPoint()-这将返回最上面的元素,而转到较低的元素将没有帮助,因为我无法区分具体的路径
如果你有一个想法或者知道一个例子,我想听听下面的例子

给出的答案:

将显示设置为“无”,然后在elementByPoint下找到您的元素:

console.log(this);
var element = document.elementFromPoint(coords[0], coords[1]);
console.log(element);
element.style.display = "none";
我的评论是:
这不起作用,它会在div标记中给出一个结果,而不是您单击的相应路径(本例中为县)

由于我无法在评论部分将问题标记为已回答,因此我将在此处复制评论并将其标记为已回答


使用svg路径查看点是否位于多边形内采用笛卡尔坐标-而d3沿着大圆坐标对路径进行采样,采样率可能会非常粗糙,以至于一个点位于svg形状的外部,但在地理特征内(它会在我们的视觉边界上显示)。使用原始地理数据(如果原始地理数据是球形的:纬度和经度对)尝试d3.geoContains()

非常感谢安德鲁


编辑:我现在注意到,我无法在接下来的两天内将此设置为已回答,因此我将在以后进行设置。

我假设您指的是elementFromPoint,因为elementFromPath似乎不存在。出于格式化目的,我将我的评论添加到主要帖子中。使用svg路径查看点是否位于多边形内采用笛卡尔坐标-而d3沿着大圆坐标对路径进行采样,采样率可能足够粗,以至于一个点位于svg形状之外但在地理特征内(它会出现在我们的视觉边界上)。使用原始地理数据(如果您的原始地理数据是球形的:纬度和经度对)尝试d3.geoContains(),我不知道您所说的“它在-标记内给您一个结果,而不是对应的路径”是什么意思。顺便说一句,您需要一个循环,以便显示none有任何点,因为它在那里删除元素作为下一个elementFromPoint调用的候选元素。很高兴这起作用。d3 geo模块的一些容量没有得到充分利用,但它们可能非常有用。