如何重构lat/lng坐标数组以提取各区块的闭合坐标集合
行线坐标数组转闭合区块坐标数组实现方案
假设你有一个嵌套坐标数组,结构为4条行线×7个坐标点,每条行线对应场地的横向线条,需要将其拆分为独立的闭合区块坐标集合,每个区块包含四个角点并以起点收尾闭合。
核心逻辑
4条行线可划分出3行横向区块,7个点可划分出6列纵向区块,最终得到 3×6=18 个独立区块。每个区块的四个角点按以下规则提取:
- 左上角:第
i行第j个坐标 - 右上角:第
i行第j+1个坐标 - 右下角:第
i+1行第j+1个坐标 - 左下角:第
i+1行第j个坐标
提取后按顺序排列,最后重复起点坐标完成闭合。
代码实现(JavaScript)
// 示例输入:4行7列的经纬度坐标数组 const rowCoordinates = [ [{lat: 1, lng: 1}, {lat:1, lng:2}, {lat:1, lng:3}, {lat:1, lng:4}, {lat:1, lng:5}, {lat:1, lng:6}, {lat:1, lng:7}], [{lat: 2, lng: 1}, {lat:2, lng:2}, {lat:2, lng:3}, {lat:2, lng:4}, {lat:2, lng:5}, {lat:2, lng:6}, {lat:2, lng:7}], [{lat: 3, lng: 1}, {lat:3, lng:2}, {lat:3, lng:3}, {lat:3, lng:4}, {lat:3, lng:5}, {lat:3, lng:6}, {lat:3, lng:7}], [{lat: 4, lng: 1}, {lat:4, lng:2}, {lat:4, lng:3}, {lat:4, lng:4}, {lat:4, lng:5}, {lat:4, lng:6}, {lat:4, lng:7}] ]; function convertToBlockCoordinates(rows) { const blocks = []; const rowCount = rows.length; const colCount = rows[0].length; // 遍历所有区块的顶部行索引 for (let i = 0; i < rowCount - 1; i++) { // 遍历所有区块的左列索引 for (let j = 0; j < colCount - 1; j++) { const topLeft = rows[i][j]; const topRight = rows[i][j+1]; const bottomRight = rows[i+1][j+1]; const bottomLeft = rows[i+1][j]; // 构建顺时针闭合的区块坐标数组 const block = [topLeft, topRight, bottomRight, bottomLeft, topLeft]; blocks.push(block); } } return blocks; } // 执行转换并输出结果 const blockCoordinates = convertToBlockCoordinates(rowCoordinates); console.log(blockCoordinates);
注意事项
- 坐标排列顺序可根据需求调整(比如改为逆时针),只要保证四个角点能形成闭合的多边形即可
- 若输入的行线为纵向线条,只需调换遍历的行、列维度即可适配
- 需确保输入的每行坐标数量一致,否则建议在函数开头添加参数校验逻辑
内容的提问来源于stack exchange,提问作者Deep Kakkar
相关产品推荐
相关产品推荐

