Turf.js与Polygon,MultiPolygon,GeometryCollection相交的缓冲区

时间:2016-10-24 05:53:50

标签: geospatial geojson geo turfjs

这是在前端方面。我正在使用 turf.js

场景:获取距当前位置10公里范围内的所有警告和事件。

我获得的实时geojson Feed包含警告或具有许多功能的事件,其中有些人拥有t.references :seller, index: true, foreign_key: { to_table: :users }

到目前为止我做了什么:

使用当前坐标创建缓冲区功能区域,并比较我附近是否发生了事故(10km)。

如果geometry.type =' Point'我使用turf.inside(point,bufferPolygon)进行比较,这很好。

挑战在于它不是一个点,比如一个包含MultiPolygons的MultiPolygon或GeometryCollection。

我可用于在两个参数中接受多边形的唯一方法是geometry.type='Point' || geometry.type='MultiPolygon' || geometry.type='GeometryCollection'

在这里,我的Feed中没有turf.intersect(polygon, bufferPolygon),但它是geometry.type ='Polygon'MultiPolygon(拥有MultiPolygons)。

GeometryCollection

另外,尝试将multiPolygon转换为Polygon,但效果不佳。

任何人都可以建议一种比较bufferFeature和一组具有point,multipolygon和GeometryCollection的特征集合的方法吗?

2 个答案:

答案 0 :(得分:1)

如果您不介意将缓冲区与多个点进行比较,那么您可以做的一件事就是在多边形/多边形上使用turf.explode()。这是文档的链接。

http://turfjs.org/examples/turf-explode/

Turf explode会将多边形或多边形转换为表示形状顶点的点的要素集合。在多边形/多边形上运行turf.explode()后,您需要迭代结果中的每个要素(点),并使用turf.inside()将其与缓冲区进行比较。对于此部分使用turf.within()可能会更容易,但如果您愿意,可以使用turf.inside()

这是有效的,因为如果其中一个点位于缓冲区内,那么这些点所代表的多边形的至少某些部分也将位于缓冲区内。

另一种方法是使用点而不是缓冲区来比较距离。然后,如果你有一个点,你可以使用turf.distance()和两个点来查看它们之间的距离。如果您有多边形/多边形,那么您可以turf.explode()那些并将距离与原始点进行比较。

对于几何集合,我认为除非您将几何集合的不同部分按类型分离为单独的要素集合,否则我不认为您将能够使用草皮。

答案 1 :(得分:0)

  

另外,尝试将multiPolygon转换为Polygon,没有用   好。

为什么没有这个工作?你能进一步解释一下吗?

多面体或多边形只不过是一组点。您应该能够将其转换为点数组或包含点要素的数组。

你可以这样做:

function unpackMultiPolCoords(features) {
  var data = [];
  featureEach(features, function(feature) {
    var coordCollection = feature.geometry.coordinates;
    coordCollection.forEach(function(coords) {
      coords.forEach(function(coord) {
        data.push(coord);
      });
    });
  });
  return data;
};

var unpacked = unpackMultiPolCoords(multiPoly);

let toPoints = function(fc) {
  let points = [];
  fc.forEach((coord) => {
    points.push(turf.point(coord));
  });
  return points;
};

var points = toPoints(unpacked);

请参阅完整代码@ http://codepen.io/bitHugger/pen/mOxwME

然后你可以将每个点与turfs距离函数比较到你的缓冲区。