D3.js с ошибкой Turf.js: «Ошибка Uncaught (в обещании): у каждого линейного кольца многоугольника должно быть 4 или более позиций».) - PullRequest
0 голосов
/ 26 августа 2018

Я пытаюсь перебрать серию полигонов, чтобы увидеть, существует ли моя единственная точка в одном из этих полигонов. Из того, что я прочитал, мне нужно импортировать топойсон, преобразовать его в объект геойсон и пройтись по каждому полигону, проверяя точку. Вот что у меня есть, используя 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's d3.geoContain(), но каждый раз получалось false. Я открыт для альтернативных решений, которые проверят, находится ли координата широта / долгота в форме топойсона. Благодаря.

Ответы [ 2 ]

0 голосов
/ 22 июля 2019

Я получил ту же ошибку.

Позже я обнаружил, что недостаточно вложил массив, который я представлял, в 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]]]);
0 голосов
/ 26 августа 2018

Так вот что у меня получилось, заменив 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
    }
  });
});
...