首页 > 解决方案 > 如何用最少 30 英里半径的圆圈覆盖美国地图?

问题描述

我有一个大数据集的坐标,并希望将它们放入一个 30 英里半径范围内的组中。我需要这些圆圈来覆盖整个美国陆地区域。允许重叠的圆圈。有没有办法做到这一点?任何帮助将非常感激。谢谢你。

标签: rgeolocationgeometrygisgeospatial

解决方案


不久前我写了一个npm 包,它可以帮助你处理地球上的位置。

您可以看到我制作的一个jsfiddle ,它在以某个位置为中心的圆上生成随机点。下面的代码是从 jsfiddle 粘贴的,因为当您包含小提琴链接时,SO 需要代码,但您最好尝试使用小提琴。该函数pointAtDistance()实现了Haversine 公式

对于包装,我会尝试形成六边形- 制作一个网格并消除那些不与土地相交的网格。由于地球是一个球体,您可能应该找到最接近赤道的经度数,它代表您的偏移量,这样 30 英里的圆圈仍然重叠。然后使用这个角度,更北的圆圈会重叠得比需要的多,但至少不会有间隙,而且结构很容易推理。

function pointAtDistance(inputCoords, distance) {
    const result = {}
    const coords = toRadians(inputCoords)
    const sinLat =  Math.sin(coords.latitude)
    const cosLat =  Math.cos(coords.latitude)

    const bearing = Math.random() * TWO_PI
    const theta = distance/EARTH_RADIUS
    const sinBearing = Math.sin(bearing)
    const cosBearing =  Math.cos(bearing)
    const sinTheta = Math.sin(theta)
    const cosTheta =    Math.cos(theta)

    result.latitude = Math.asin(sinLat*cosTheta+cosLat*sinTheta*cosBearing);
    result.longitude = coords.longitude + 
    Math.atan2( sinBearing*sinTheta*cosLat, cosTheta-sinLat*Math.sin(result.latitude )
        );
    result.longitude = ((result.longitude+THREE_PI)%TWO_PI)-Math.PI

    return toDegrees(result)
}

推荐阅读