如何用最少 30 英里半径的圆圈覆盖美国地图?

Posted

技术标签:

【中文标题】如何用最少 30 英里半径的圆圈覆盖美国地图?【英文标题】:How to cover the US map with minimum number of 30 mile radius circles? 【发布时间】:2020-06-30 16:55:37 【问题描述】:

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

【问题讨论】:

如果您的圈子要重叠(他们必须这样做),当您尝试分类的一个点适合两个圈子时,您希望发生什么? 那些半径圆的中心在哪里?一个好的起点可能是raster::buffer() 函数,用于创建距给定中心点给定距离的空间缓冲区 @AaronMontgomery 算在两个圈子下。主要目标是能够用 30 英里半径的圆圈覆盖整个地图。 @davidnortes 我想只有在布置好圆圈后才能确定中心。谢谢你的建议,我会考虑的。 【参考方案1】:

我不久前写了一封npm package,它将帮助您处理地球上的位置。

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

对于包装,我会尝试hexagon formation - 制作一个网格并消除那些不与土地相交的网格。由于地球是一个球体,您可能应该找到最接近赤道的经度数,它代表您的偏移量,这样 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)

【讨论】:

以上是关于如何用最少 30 英里半径的圆圈覆盖美国地图?的主要内容,如果未能解决你的问题,请参考以下文章

在谷歌地图中围绕一个点绘制半径

【在线等】怎么在百度地图上查找方圆多少公里内的地方

使用 Google 地图 API 在 100 英里半径内使用相同产品的人们的 GPS 位置

如何仅在地图上的半径(圆圈)内显示标记?

地图缩放级别基于半径 React Native 地图

谷歌地图精度半径