我在mongo集合中有~400K文档,所有文档都具有几何type:Polygon.2dsphere由于几何体显然具有自交叉,因此无法像当前所示那样为数据添加索引.
在过去,我们有一个hacky解决方法,即在mongoose保存钩子上计算几何的边界框,然后索引而不是几何体本身,但我们想简化事情并只使用实际几何.
到目前为止,我尝试使用草皮如下(这是一个函数的主体fix):
let geom = turf.polygon(geometry.coordinates);
geom = turf.simplify(geom, { tolerance: 1e-7 });
geom = turf.cleanCoords(geom);
geom = turf.unkinkPolygon(geom);
geom = turf.combine(geom);
return geom.features[0].geometry;
Run Code Online (Sandbox Code Playgroud)
最重要的功能是unkinkPolygons我希望它能完全符合我的要求,即使几何体足够好以便进行索引.这simplify可能没什么用,但我把它添加进去了.那clean是因为unkink抱怨它的输入,并且combine是将Polygons 数组转换成单个数组MultiPolygon.实际上,unkink仍然不满意它的输入,所以我不得不编写一个hacky函数,如下所示,抖动重复的顶点,这会修改geom之前传递给unkink:
function jitterDups(geom) {
let coords = geom.geometry.coordinates;
let points = new Set();
for (let ii = 0; ii < coords.length; ii++) {
// last coords is …Run Code Online (Sandbox Code Playgroud)