2

我正在尝试遍历一系列多边形,以查看我的单点是否存在于其中一个多边形中。根据我的阅读,我需要导入 topojson,将其转换为 geojson 对象,然后遍历每个多边形检查点。这是我使用 D3、Topojson 和 Turf 所拥有的...

const point = turf.point([long, lat]);
d3.json('data/myAreas.json').then((myAreas) => {
    const keys = Object.keys(myAreas.objects);
    const geo = topojson.feature(myAreas, myAreas.objects[keys[0]]);
    geo.features.forEach((area) => {
      const searchWithin = turf.polygon([[area.geometry.coordinates[0]]]);
      const ptsWithin = turf.pointsWithinPolygon(point, searchWithin);
      console.log('ptsWithin?', ptsWithin);
    });
});

当它到达时const searchWithin = turf.polygon([[area.geometry.coordinates[0]]]);会引发以下错误......

Uncaught (in promise) Error: Each LinearRing of a Polygon must have 4 or more Positions.

我试过D3 d3.geoContain(),但false每次都扔。我对替代解决方案持开放态度,这些解决方案将检查纬度/经度坐标是否在 topojson 形状内。谢谢。

4

2 回答 2

4

所以这就是最终为我工作的东西,取而代之turf.polygon()的是turf.multiPolygon

const point = turf.point([long, lat]);
d3.json('data/myAreas.json').then((areas) => {
  const keys = Object.keys(areas.objects);
  const geo = topojson.feature(areas, areas.objects[keys[0]]);
  geo.features.forEach((k, i) => {
    const searchWithin = turf.multiPolygon([[k.geometry.coordinates[0]]]);
    const ptsWithin = turf.pointsWithinPolygon(point, searchWithin);
    if (ptsWithin.features.length > 0) {
      console.log('ptsWithin?', i, ptsWithin); // The index of the containing polygon
      console.log(geo.features[i]); // The features for the corresponding polygon
    }
  });
});
于 2018-08-26T18:23:38.640 回答
1

我得到了同样的错误。

后来我发现我没有将要呈现给 turf.polygon() 的数组充分嵌套。

从上面的示例中获取以下行

const searchWithin = turf.polygon([[area.geometry.coordinates[0]]]);

我认为这实际上应该是(注意额外的 [] 括号):

const searchWithin = turf.polygon([[[area.geometry.coordinates[0]]]]);

这是来自 turfjs 网站的示例:

var poly = turf.polygon([[[0,29],[3.5,29],[2.5,32],[0,29]]]);
于 2019-07-22T16:06:07.993 回答