1

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

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

我正在获取包含警告或事件的实时 geojson 提要,其中包含许多具有geometry.type='Point' || geometry.type='MultiPolygon' || geometry.type='GeometryCollection'.

到目前为止我做了什么:

使用我当前的坐标创建一个缓冲区特征区域,并比较我附近是否发生了事件(10 公里)。

如果 geometry.type='Point' 我正在使用 turf.inside(point, bufferPolygon) 进行比较,这工作正常。

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

我可以用来查找在两个参数中都接受多边形的唯一其他方法是turf.intersect(polygon, bufferPolygon).

在这里,我没有进入geometry.type ='Polygon'我的提要,但它是一个MultiPolygonGeometryCollection(具有 MultiPolygons)。

if(feature.geometry.type === 'Point') {
    if(turf.inside(feature, bufferPolygon)) {
        console.log("inside");
        feature.properties.feedType === 'warning' ? warningsNearBy++ : incidentsNearBy++;
    }
} else {
    if(feature.geometry.type === 'GeometryCollection') {
        $.each(feature.geometry.geometries, function(index, geo) {
            if(geo.type === 'MultiPolygon') {
                //console.log('MP:', geo.coordinates[0]);
                var convertToPolygon = turf.polygon(geo.coordinates[0]);
                console.log('convertToPolygon:',convertToPolygon);
                //console.log('MP:intersect',turf.intersect(polygon, bufferPolygon));
                var isIntersecting = turf.intersect(convertToPolygon, bufferPolygon);
                if(isIntersecting) {
                    feature.properties.feedType === 'warning' ? warningsNearBy++ : incidentsNearBy++;
                }
            } else if(geo.type === 'GeometryCollection') {
                console.log('GC:', geo);
            }
        });
    } else {
        console.log('not geo collection:', feature.geometry.type);
    }
}

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

任何人都可以建议一种将bufferFeature与一组具有点、多面体和GeometryCollection的特征集合进行比较的方法吗?

4

2 回答 2

2

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

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

Turf explode 会将多边形或多多边形转换为表示形状顶点的点的特征集合。在多边形/多多边形上运行turf.explode()后,您将需要遍历结果中的每个要素(点),并使用turf.inside(). 这部分可能更容易使用turf.within(),但turf.inside()如果您愿意,可以使用它。

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

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

至于几何集合,我认为除非您将几何集合的不同部分按类型分成单独的特征集合,否则您将无法与使用草皮的人一起工作。

于 2016-11-23T12:33:09.123 回答
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

然后,您可以将每个点与草皮距离函数与缓冲区进行比较。

于 2016-12-05T17:59:48.987 回答