r - 如何用最少 30 英里半径的圆圈覆盖美国地图?
问题描述
我有一个大数据集的坐标,并希望将它们放入一个 30 英里半径范围内的组中。我需要这些圆圈来覆盖整个美国陆地区域。允许重叠的圆圈。有没有办法做到这一点?任何帮助将非常感激。谢谢你。
解决方案
不久前我写了一个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)
}
推荐阅读
- ios - How to display the data in the nested section in the tableview
- c# - C# - 锁定目录,直到所有文件都复制到其中
- java - Java:DTO 集合内的值总和
- java - 查找转换为十进制数时的二进制数是否为 2 的幂?
- hyperledger-fabric - Hyperledger Fabric 中的多个主机连接
- apache-spark - 为什么只有一个核心承担所有负载,如何让其他29个核心承担负载?
- jclouds - 带有 multipart() 选项的 B2 存储和 jclouds 出错
- r - 如何将 60 个时间值附加到 400 万个串联经度和纬度值的列表中?
- java - Firebase 数据库身份验证注册
- postgresql - 带有 Powershell for Postgresql 的 Dbup(.net 库)