Buffer Polygon线性环不闭合问题求助:返回含无穷坐标
解决缓冲多边形首尾点不一致及出现Infinity坐标问题
确保原始输入是闭合的LinearRing
多数缓冲算法要求输入的多边形是闭合状态(首尾点坐标完全一致),如果你的coordinateArray未闭合,先手动处理:val pointList = coordinateArray.map { Point(it[0], it[1]) } // 检查并闭合原始点列表 val closedPointList = if (pointList.first() != pointList.last()) { pointList + pointList.first() } else { pointList }过滤无效坐标并闭合缓冲结果
生成缓冲后先剔除包含Infinity或NaN的无效点,再强制闭合缓冲后的点列表:val distance = 0.0001 val bufferedPolygonList: List<Point> = AreaBuffer.buffer(closedPointList, distance) // 过滤非有限值的异常点 val validPoints = bufferedPolygonList.filter { it.x.isFinite() && it.y.isFinite() } // 确保缓冲后的多边形首尾闭合 val closedValidPoints = if (validPoints.isNotEmpty() && validPoints.first() != validPoints.last()) { validPoints + validPoints.first() } else { validPoints } val newBufferedCoordinateArray = closedValidPoints.map { mutableListOf(it.x, it.y) }.toMutableList()检查原始多边形的顶点顺序
部分缓冲算法对顶点的顺时针/逆时针顺序有严格要求,乱序可能触发计算溢出。可以尝试调整顶点顺序(比如按顺时针重新排列)后再执行缓冲操作。替换为更可靠的GIS库实现
如果上述方法无法解决问题,建议使用成熟的GIS库(如JTS)生成缓冲,其算法稳定性更强,能处理更多边界情况:import org.locationtech.jts.geom.* import org.locationtech.jts.operation.buffer.BufferOp // 初始化JTS几何工厂 val geometryFactory = GeometryFactory() // 转换原始坐标为JTS Coordinate数组并闭合 val rawCoords = coordinateArray.map { Coordinate(it[0], it[1]) }.toTypedArray() if (rawCoords.first() != rawCoords.last()) { rawCoords += rawCoords.first() } val polygon = geometryFactory.createPolygon(rawCoords) // 生成缓冲(注意:若原始坐标是经纬度,distance单位为度,如需米级缓冲需先投影) val bufferedPolygon = polygon.buffer(distance) // 提取最终缓冲坐标 val newBufferedCoordinateArray = bufferedPolygon.coordinates.map { mutableListOf(it.x, it.y) }.toMutableList()
内容的提问来源于stack exchange,提问作者KJSR
相关产品推荐
相关产品推荐

