import { generateUUID } from '../src/tool'; /** * 使用turf工具进行切割面 * @param line 线段数据 * @param outerPolygon 面数据 * return 返回切割的面数据 */ export function splitPolygonByLine(line, outerPolygon) { console.log("绘制的分割线数据",line); // 处理被分割的面数据坐标小数点保留多少位 let truncatedSplitter = turf.truncate(turf.lineString(outerPolygon.geometry.coordinates[0]), { precision: 7, }); console.log("分割面转换为线数据",truncatedSplitter); //求交点 let intersectCollection = turf.lineIntersect(line, truncatedSplitter); console.log("与分割面的交点",intersectCollection); // printLngLat(intersectCollection.geometry.coordinates); // 交点小于2个 返回null if (intersectCollection.features.length < 2) { return null; } //将点合并成MultiPoint let intersectCombined = turf.combine(intersectCollection).features[0]; console.log("分割后所有点数据",intersectCombined) //分别获取切割线 let outerPieceCollection = turf.lineSplit(line, intersectCombined); let splitterPieceCollection = turf.lineSplit(truncatedSplitter, intersectCombined); console.log("切割线被分割后所有线段",outerPieceCollection); console.log("切割面被分割后所有线段",splitterPieceCollection); //将所有的线段放到一起 let pieceCollection = turf.featureCollection( outerPieceCollection.features.concat(splitterPieceCollection.features), ); console.log("所有分割线段",pieceCollection); //使用turf将闭合线组成多边形 let polygonCollection = turf.polygonize(pieceCollection); console.log("分割线合并面数据",polygonCollection) //对多边形进行判断,切割外的多边形丢弃 let innerPolygons = polygonCollection.features.filter((polygon) => { // 获取多边形质心 多边形不规则时有问题 // let center = turf.centroid(polygon); // 获取多边形表面一点 let newcenter = turf.pointOnFeature(polygon); // 判断点是否在被分割图斑内 // 图斑中心点 let centerPoint = turf.point(newcenter.geometry.coordinates); // 图斑面 let outPolygon = turf.polygon(outerPolygon.geometry.coordinates) // return turf.booleanPointInPolygon(centerPoint, outPolygon); // let innerPoint = getRandomPointInPolygon(outPolygon); // 获取多边形边界 // let bbox = turf.bbox(outPolygon); // 获取多边形的边界框 // return turf.booleanPointInPolygon(randomPoint.features[0], outPolygon); return turf.booleanWithin(centerPoint, outerPolygon); }); // let innerPolygons = polygonCollection.features; //处理镂空数据(多处镂空数据会导致计算错误,因为polygonize方法无法正常的返回数据) if (outerPolygon.geometry.coordinates?.length > 1) { //获取镂空的面数据 let holeCollection = turf.featureCollection( outerPolygon.geometry.coordinates.slice(1).map((item) => turf.polygon([item])), ); //剔除掉镂空的部分数据 innerPolygons = innerPolygons.map((polygon) => { let diff = polygon; turf.featureEach(holeCollection, (hole) => { diff = turf.difference(diff, hole); }); return diff; }); } innerPolygons.forEach((item, index) => { innerPolygons[index].properties.id = generateUUID(); // console.log("innerPolygons_length",innerPolygons[index].geometry.coordinates[0].length); // console.log("innerPolygons_array",innerPolygons[index].geometry.coordinates[0]) // console.log("innerPolygons_length",innerPolygons[index].geometry.coordinates[0].length); // console.log("innerPolygons_string",JSON.stringify(innerPolygons[index].geometry.coordinates[0])); }); // let arr = JSON.parse(JSON.stringify(innerPolygons)) // arr.forEach((item, index) => { // arr[index].properties.id = generateUUID(); // if((arr[index].geometry.coordinates[0][0][0] == arr[index].geometry.coordinates[0][arr[index].geometry.coordinates[0].length-1][0]) && arr[index].geometry.coordinates[0][0][1] == arr[index].geometry.coordinates[0][arr[index].geometry.coordinates[0].length-1][1]){ // }else{ // arr[index].geometry.coordinates[0].push(arr[index].geometry.coordinates[0][0]) // console.log("coordinates789",arr); // } // }); return innerPolygons; } function getRandomPointInPolygon(polygon) { const bbox = turf.bbox(polygon); // 获取多边形的边界框 let point; do { point = turf.randomPoint(1, {bbox: bbox}).features[0]; // 从边界框中生成一个随机点 } while (!turf.booleanPointInPolygon(point, polygon)); // 检查点是否在多边形内部 return point; } export function splitPolygonByFill(drawPolygon, outerPolygon) { console.log("drawPolygon",drawPolygon); console.log("outerPolygon",outerPolygon) var polygon1 = turf.polygon(drawPolygon.geometry.coordinates) var polygon2 = turf.polygon(outerPolygon.geometry.coordinates); var difference = turf.difference(polygon2,polygon1); var intersection = turf.intersect(polygon2, polygon1); intersection.properties.id = generateUUID(); difference.properties.id = generateUUID(); let splitAfterFeatures = [intersection,difference]; // splitAfterFeatures?.forEach((item,index)=>{ // splitAfterFeatures[index].properties?.id = generateUUID(); // }) return splitAfterFeatures; } export function printLngLat(arr){ arr.forEach((item,index)=>{ console.log(item[1]+","+item[0]+"\n"); }) }