也参考了楼主的计算方法,的确小半径时有锯齿。同事给我提供了另一种算法,可行。 /** * 计算多边形内圈镂空圆坐标 * @param center 中心点坐标 * @param radius 半径,单位米 */ const computedCircle = (center: { latitude: number; longitude: number }, radius: number) => { const latRadian = (center.latitude * Math.PI) / 180 const lonRadian = (center.longitude * Math.PI) / 180 const distance = radius / 1000 / 6371 // 坐标点数 const accuracy = 40 let point = [] // 内圈坐标顺序自调 for (let i = 0; i < accuracy; i++) { const bearing = (360 / accuracy * i * Math.PI) / 180.0 let lat = Math.asin( Math.sin(latRadian) * Math.cos(distance) + Math.cos(latRadian) * Math.sin(distance) * Math.cos(bearing), ) let lon = lonRadian + Math.atan2( Math.sin(bearing) * Math.sin(distance) * Math.cos(latRadian), Math.cos(distance) - Math.sin(latRadian) * Math.sin(lat), ) lon = ((lon + 3 * Math.PI) % (2 * Math.PI)) - Math.PI lat = (lat * 180) / Math.PI lon = (lon * 180) / Math.PI point.push({ latitude: lat, longitude: lon, }) } // 加入第一个坐标点,形成闭环 point.push(point[0]) return point }