已知圆中心点经纬度和半径,求圆边360°经纬度?

在网上查询过,写出来一个示例,能计算出来,但是不够精细,半径越大倒是没问题,小了就不行了,不太懂这个坐标计算,请教各位[抱拳]

借鉴的代码

/**
 * 计算圆边坐标
 * @param {Array<number>} lnglat 经纬度坐标数组
 * @param {number} radius 半径
 */
function computedCircle(lnglat, radius) {
  let r = 6371000.79
  let phase = 2 * Math.PI / 360
  let point = []
  for (let i = 0; i < 360; i++) {
    let dx = radius * Math.cos(i * phase)
    let dy = radius * Math.sin(i * phase)

    let lng = dx / (r * Math.cos(lnglat[1] * Math.PI / 180) * Math.PI / 180)
    let lat = dy / (r * Math.PI / 180)
    let newLng = lnglat[0] + lng
    point.push([newLng, lnglat[1] + lat])
  }
  return point
}

半径一百

半径一千

上面用的的高德的遮罩 Polygon ,然后在中间扣出一个圆

阅读 1k
avatarAI BotBETA

这个问题是关于计算一个以给定中心点和半径的圆形的坐标。根据你提供的代码和描述,我理解你已经在尝试计算这个问题的答案了,但是当半径非常小(比如100)时,结果并不准确。

你的代码看起来是用 JavaScript 写的,使用的是球面坐标变换来计算圆周上的点。然而,当半径非常小的时候,这种方法的精度可能会受到经纬度坐标系离散化的影响。这个问题在地球表面的纬度坐标尤为明显,因为它们的范围是从-90度到+90度,经度范围是从-180度到+180度。

一个更简单且精度更高的方法是直接使用平面坐标系(x,y)。通过将地球表面投影到一个二维平面上,我们可以简单地使用标准的平面几何来解决问题。

在二维平面上,圆的中心点是 (x0, y0),半径是 r。在圆上的任何一点 P 的坐标是 (x0 + r cos(theta), y0 + r sin(theta)),其中 theta 是点 P 从 x 轴逆时针旋转到半径矢量的角度。

以下是用 Python 编写的示例代码:

import numpy as np

def compute_circle_coords(x0, y0, r):
    theta = np.linspace(0, 2*np.pi, num=360)  # 圆上均匀分布的角度
    x = x0 + r * np.cos(theta)
    y = y0 + r * np.sin(theta)
    return np.column_stack((x, y))

# 中心点坐标 (100, 100),半径 100
x0, y0 = 100, 100
r = 100
coords = compute_circle_coords(x0, y0, r)
print(coords)

这个方法不受地球大小和半径大小的影响,因此无论半径是100还是1000,都可以得到准确的结果。如果你需要将这些坐标可视化到地图上,那么你可以使用一种地图投影算法(如 Mercator、Equirectangular 等)将平面坐标转换为经纬度坐标。

1 个回答

也参考了楼主的计算方法,的确小半径时有锯齿。同事给我提供了另一种算法,可行。

/**
 * 计算多边形内圈镂空圆坐标
 * @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
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏