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

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

【问题讨论】:

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

标签: r geolocation geometry gis geospatial


【解决方案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)
}

【讨论】:

    猜你喜欢
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 2017-08-14
    • 2014-01-17
    相关资源
    最近更新 更多