这是在前端方面。我正在使用 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的特征集合的方法吗?
答案 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距离函数比较到你的缓冲区。