【问题标题】:Filter by Point in Polygon and Return County ID/Name按多边形中的点过滤并返回县 ID/名称
【发布时间】:2017-02-22 06:02:34
【问题描述】:

我已经重做了这种方法,但仍然没有奏效。这次我有一个非常简短的工作示例,可以完美地说明问题:

https://bl.ocks.org/diggetybo/raw/6d35e5ecd17992650d0a23896e649b25/

在上面的区块中,您将看到一个县的地图。另外,我有用户输入的纬度和经度,如下所示:

var lat = d3.select('#lat_input').node();

var long = d3.select('#long_input').node();

这些坐标可能位于美国境内的任何地方。我要做的是创建一个函数来查询用户输入的坐标并返回县的 FIPS id。

   var containing_county = us.objects.counties.geometries.filter(function(polygon) {
       return d3.polygonContains(polygon, [long.value, lat.value]);
   });
   console.log(containing_county)
 });

但是它并没有按照我期望的方式过滤,它说无法读取未定义的属性 0。

这里应该做些什么不同的事情?

也试过了:

    var containing_county = topojson.feature(us, us.objects.counties).features.filter(function(d) { 
return d3.polygonContains(d.geometry, [long.value, lat.value]);
    });

【问题讨论】:

  • 您能提供一个工作示例吗?
  • 现在终于有时间提供一个工作示例。
  • 您仍在传递 MultiPolygon 参数而不是预期的 Polygon

标签: javascript d3.js topojson


【解决方案1】:

我检查了您链接的数据。
objects.counties.geometries 的元素 0 不是“Polygon”类型,而是“MultiPolygon”类型。
d3.polygonContains 的第一个参数需要一个多边形,并且不能处理多边形。可能您应该对不同的几何图形使用不同的方法。

【讨论】:

  • 你是唯一一个坚持我的人。所以我认为你赢得了它。尽管您的回答现在很有意义,但它最终采用以下方式返回包含 FIPS id 的对象:var containing_county = mapData.filter(function(polygon) { if(polygon.geometry !== null) { return d3.polygonContains(polygon.geometry.coordinates[0], [long.value, lat.value]) 所以我必须添加坐标特征,然后将其切片为零。
  • @ArashHowaida,这解决了你的问题吗?现在可以用了吗?
  • 是的,上面评论中的代码行为我做了。关键是在 0 处切片并添加.coordinates,这两个我之前都没有做过。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多