如何用最少 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 英里半径的圆圈覆盖美国地图?的主要内容,如果未能解决你的问题,请参考以下文章