如何在指定半径的圆内生成随机坐标?

2024-04-23

我试图生成位于半径 5 公里的圆内的随机坐标(纬度,经度),其中中心点位于某个坐标(x,y)。我正在尝试用 ruby​​ 编写此代码,并且正在使用该方法,但不知何故我得到的结果不在指定的 5 公里半径内。

def location(lat, lng, max_dist_meters)
  max_radius = Math.sqrt((max_dist_meters ** 2) / 2.0)
  lat_offset = rand(10 ** (Math.log10(max_radius / 1.11)-5))
  lng_offset = rand(10 ** (Math.log10(max_radius / 1.11)-5))
  lat += [1,-1].sample * lat_offset
  lng += [1,-1].sample * lng_offset
  lat = [[-90, lat].max, 90].min
  lng = [[-180, lng].max, 180].min
  [lat, lng]
end

你的代码

max_radius = Math.sqrt((max_dist_meters ** 2) / 2.0)

这只是max_dist_meters.abs / Math.sqrt(2) or max_dist_meters * 0.7071067811865475.

10 ** (Math.log10(max_radius / 1.11)-5)

这可以写成9.00901E-6 * max_radius, 所以就是6.370325E−6 * max_dist_meters.

rand(10 ** (Math.log10(max_radius / 1.11)-5))

现在是有趣的部分 :rand(x)只是rand() https://ruby-doc.org/core-2.2.3/Kernel.html#method-i-rand如果 x 介于-1 and 1. So if max_dist_meters小于1/6.370325E−6 ~ 156977.86,你的前 3 行所做的就是:

lat_offset = rand()
lng_offset = rand()

So for max_dist_meters = 5000,您的方法将返回一个随机点,该点可能位于 1° 经度和 1° 纬度之外。最多也就157公里多一点。

更糟糕的是,如果x在。。。之间156978 and 313955,您的代码相当于:

lat_offset = lng_offset = 0

从 Ruby 2.4 开始

[[-90, lat].max, 90].min

可以写成lat.clamp(-90, 90) https://ruby-doc.org/core-2.4.0/Comparable.html#method-i-clamp

可能的解决方案

得到半径圆盘上均匀分布的随机点max_radius, 你需要随机半径的非均匀分布 http://mathworld.wolfram.com/DiskPointPicking.html :

def random_point_in_disk(max_radius)
  r = max_radius * rand ** 0.5
  theta = rand * 2 * Math::PI
  [r * Math.cos(theta), r * Math.sin(theta)]
end

这是一个包含一百万个随机点的图:

这是与 @Schwern 的代码相同的情节:

一旦掌握了这种方法,您就可以应用一些基本数学将米转换为纬度和经度。请记住,1° 纬度始终为 111.2 公里,但 1° 经度在赤道处为 111.2 公里,但在两极处为 0 公里:

def random_point_in_disk(max_radius)
  r = max_radius * rand**0.5
  theta = rand * 2 * Math::PI
  [r * Math.cos(theta), r * Math.sin(theta)]
end

EarthRadius = 6371 # km
OneDegree = EarthRadius * 2 * Math::PI / 360 * 1000 # 1° latitude in meters

def random_location(lon, lat, max_radius)
  dx, dy = random_point_in_disk(max_radius)
  random_lat = lat + dy / OneDegree
  random_lon = lon + dx / ( OneDegree * Math::cos(lat * Math::PI / 180) )
  [random_lon, random_lat]
end

对于这种计算,不需要安装 800 磅重的 GIS 大猩猩。

几点:

  • 我们通常先讨论纬度,然后讨论经度,但在 GIS 中,通常是lon首先因为x出现在之前y.
  • cos(lat)被认为是常数,所以max_radius不应该太大。几十公里应该不会有什么问题。球体上的圆盘形状变为.
  • 不要在距离极点太近的地方使用此方法,否则您会得到任意大的坐标。

为了测试它,我们在不同位置的 200 公里磁盘上创建随机点:

10_000.times do
  [-120, -60, 0, 60, 120].each do |lon|
    [-85, -45, 0, 45, 85].each do |lat|
      puts random_location(lon, lat, 200_000).join(' ')
    end
  end
end

使用 gnuplot,结果图如下:

耶!我刚刚重新发明天梭指标 https://en.wikipedia.org/wiki/Tissot%27s_indicatrix,晚了 150 年:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在指定半径的圆内生成随机坐标? 的相关文章

  • 使用 HTTPClient 发布嵌套参数(哈希)

    我需要从一个应用程序到另一个应用程序的多部分 http 帖子 其中包括文件附件和嵌套的参数哈希 我尝试使用HTTPClient这适用于文件附件 但是我无法获取以嵌套格式发送的参数 data params Hash new data para
  • Windows 等效的系统配置目录

    我正在 Ruby 中开发一个 CLI 应用程序 我希望允许通过标准配置文件级联在 Unix 中进行配置 etc appnamerc appnamerc 然而 该应用程序也应该在 Windows 环境中运行 我不确定将像这样的文件放在哪里 e
  • 错误:执行 gem 时... (Gem::FilePermissionError)

    我检查了所有其他类似的答案 没有一个与我的完全一样 这些解决方案也不适合我 gem environment and sudo gem environment给出相同的结果 RubyGems Environment RUBYGEMS VERS
  • 比较 ruby​​ 中的两个字符串[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我刚刚开始学习 ruby 这可能很容
  • STI 在遗传类型之间发生变化。

    在我的模型中 我像这样使用 STI 车辆型号 vehicle rb class Vehicle lt ActiveRecord Base end 车型 car rb class Car lt Vehicle end 总线模型 bus rb
  • 如何让 DateTime.parse 返回您所在时区的时间?

    我需要这个 require date DateTime parse Mon Dec 27 6 30pm 返回 EDT 时区下午 6 30 的日期时间 但返回 UTC 时间 如何获取 EST 日期时间或将 UTC 日期时间转换为下午 6 30
  • 如何验证单选按钮?

    我的 Rails 应用程序中有一个单选按钮 我想编写一个 java 脚本代码 在未选择任何选项时验证这一点 在你的 votes 类中做类似的事情 class Myvotes lt ActiveRecord Base validates vo
  • 在文档片段中查找注释或文本节点

    我必须清理 Nokogiri HTML DocumentFragment 文档 删除仅包含空格的注释节点和文本节点 这是一个例子 html p paragraph p p paragraph p p paragraph p doc Noko
  • Ruby 2 升级破坏了 Nokogiri 和/或 open-uri 编码?

    将 Rails3 2 Ruby 1 9 应用程序升级到 Rails3 2 Ruby 2 1 2 时 我有一个谜团需要解决 Nokogiri 似乎崩溃了 因为它使用 open uri 改变了它的行为 没有改变 gem 版本 只是改变 ruby
  • Rspec:期望与期望与块 - 有什么区别?

    刚刚学习 rspec 语法 我注意到这段代码有效 context given a bad list of players do let bad players it fails to create given a bad player li
  • 为什么 C# ProcessStartInfoRedirectStandardOutput 会导致 xcopy 进程失败

    这有点痛苦 因为我现在没有代码 但我会尽力解释 我有一个简单的 C 应用程序 它启动 Ruby 脚本 它还执行一些其他操作 因此它生成一个批处理文件并执行该文件 我正在使用 C 进程对象并设置以下内容 重定向标准输出 true 重定向标准错
  • 获取特定时区一天开始时的时间对象

    如何获取代表给定时区特定日期的一天开始时间的 ruby Time 对象 date Date today date to time in time zone America New York beginning of day 目前输出 gt
  • JavaScript 执行 Ruby 脚本

    服务器 客户端是同一个盒子 创建一个 UI 以在本地运行 ruby 测试脚本 我想要执行 ActiveXObject 之类的东西 w new ActiveXObject WScript Shell w run test rb 文件结构如下
  • mail_form gem 与 sidekiq 工作者

    怎么做邮件表格gem 与 sidekiq 工作人员一起工作吗 https github com plataformatec mail form https github com plataformatec mail form 我可能做错了什
  • 如何在heroku上运行一个简单的文件

    假设我已经在 github 上安装了 Rails 应用程序 并且正在 heroku 上部署 github 存储库 我遇到过这样的情况 我有一个包含一堆单词的简单文本文件 它在我的 github 存储库中 我想将这些单词 使用简单的 ruby
  • 如何使用 Nokogiri 将带有 & 符号的字符串放入 xml 文件中?

    我试图在 XML 文件中包含图像的 URL 并且 URL 查询字符串中的 符号被删除 bgdoc xpath Master each do elem part elem xpath Part inner text image imageha
  • 核心中的 find_by() 和 FinderMethods 中的 find_by() 有什么区别?

    目前我正在开发一个 gem 它会覆盖 ActiveRecordswhere 通过研究 我偶然发现了两种不同的find by实施 一个是在core https github com rails rails blob 5 0 stable ac
  • 在出错之前如何检查 nilClass 的未定义方法?

    我目前正在使用以下内容 20 p Status p 但是 我仍然收到以下错误 ActionView TemplateError undefined method status for nil NilClass on line 20 of a
  • 帮助重构这个讨厌的 Ruby if/else 语句

    所以我有这个大而多毛的 if else 语句 我将跟踪号码传递给它 然后它确定它是什么类型的跟踪号码 我怎样才能简化这件事 具体来说就是想减少代码行数 if num length lt 8 tracking service false el
  • 如何在 Ruby 2.0 中使用调试器?

    我知道调试器 gem 不会也永远不会与 ruby 2 0 per 兼容正式支持ruby 2 X https github com cldwalker debugger issues 47 issuecomment 44027702 Ruby

随机推荐

  • 如何在 gnuplot 中设置时区?

    我有一个简单的 gnuplot 命令文件 set xdata time set timefmt s set format x H M 其中 x 时间戳列 结果 UTC 格式的时间 我可以更改 x 轴的本地时区吗 今天刚刚在文档中发现了这一点
  • VarName 未定义,请修复或添加 /*global VarName*/ Cloud9

    客观的 阻止 Cloud9 IDE 向我发出警告消息 背景 我正在使用 Cloud9 IDE 编写 JavaScript 无论何时使用另一个文件 同一文件夹中 中的类 我都会收到警告消息 VarName 未定义 请修复或添加 global
  • 使用 JWT 缺少授权标头

    我正在尝试设置 JSON Web 令牌以从移动应用程序与我的 php 后端进行通信 我可以请求一个令牌就好了 当我需要验证它 或向另一个端点发出请求 时 我使用以下格式设置授权标头 Bearer
  • SimPy 资源有 3 个,每个资源都有不同的特征

    我试图模拟这样一种情况 我们有 5 台机器 它们的情况是 1 gt 3 gt 1 即中间的3个并行运行以减少它们所花费的有效时间 我可以通过创建值为 3 的 SimPy 资源来轻松模拟这一点 如下所示 simpy Resource env
  • 如何在提交表单时禁用“window.onbeforeunload”?

    当我从浏览器关闭此页面时 会打开一个警告框 询问 离开此页面 或 留在此页面 没关系 但是 当从下面给出的 提交 按钮提交表单时 它会再次询问并显示此警报框 我如何在提交表单时禁用此功能 不应该询问并显示警报框
  • IE8 中的不透明度不起作用

    我已经设置了覆盖层的不透明度 该覆盖层在 FF Chrome Safari 和 IE9 中工作正常 但在 IE8 中不起作用 我用谷歌搜索了很多 但没有找到任何解决方案 我的CSS代码是 overlayEffectDiv ms filter
  • 使用 python Shutil.py 时出现 Errno 2 没有这样的文件或目录作为文件目标

    我正在使用shutil python 模块在linux redhat 机器上复制文件和目录 我编写了以下方法 它接受 2 个参数 src 正在收集的文件或目录的路径 和目标 将收集的日志 目录粘贴到的所需新路径 def copy src d
  • RandomAccess接口,为什么没有方法?

    我正在读书Collections shuffle List javadoc http docs oracle com javase 7 docs api java util Collections html shuffle 28java u
  • Postman:如何在运行时删除/清除postman环境变量

    有没有办法在运行时使用函数删除 清除邮递员环境变量 我可以设置为空白或一些特殊值 但是有通用的处理方法吗 沙盒APIpm environment unset variableName 也允许这样做 如果您想立即清除所有环境变量 您可能需要执
  • Twitter 数据 - 查找 MongoDB 中被提及最多的用户

    假设我有来自 Twitter API 的流数据 并且将数据作为文档存储在 MongoDB 中 我想要找到的是计数screen name under entities user mentions id ObjectId 50657d58449
  • jquery 在点击时突出显示链接

    如何使用 jquery 在单击链接时突出 显示该链接 例如 当我单击链接 class1 1 时 我想将此链接设为红色 或其他颜色 JavaScript 代码在这里
  • 无意中使用 = 而不是 ==

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 看起来 if x y 代替 if x y 是许多罪恶的根源 为什么不all编译器将其标记
  • Android 5.0 JobScheduler API 在早期版本上?

    我正在构建一个 Android 应用程序 它利用清单广播接收器来了解设备何时插入 我认为 Android 5 0 JobScheduler API 是一种更好的方法 但我有一个问题 是否可以在早期版本的 Android 上使用此 API 或
  • 使用 PHP Swiftmailer 时如何解决错误 554 5.5.1(无有效收件人)?

    在测试我们的邮件服务器时 我们偶然发现了一个错误 该错误阻止我们通过 PHP 发送邮件 尽管每个 Mail in a box 的常规发送 接收工作没有任何问题 我们正在运行一个单独的 Ubuntu 18 04 服务器 该服务器仅运行 Mai
  • Python SimpleHTTPServer 接收文件

    我正在使用 SimpleHTTPServer 的 do POST 方法来接收文件 如果我使用curl上传png文件 该脚本工作正常 但每当我使用python请求库上传文件时 文件上传但会损坏 这是 SimpleHTTPServer 代码 u
  • Maven findbugs:check - 错误的输出摘要

    有谁知道如何配置 maven findbugs 插件以将错误摘要输出到控制台 类似于 pmd 插件 目前 findbugs check 只是打印出总共有多少个错误 我需要检查各个模块 target findbugs 目录和每个 findbu
  • 如何处理未知变量或如何处理多个数据库

    我正在开发一个带有多个数据库的 Go RESTful API 应用程序 启动服务器时 用户提供他们想要使用的数据库 在应用程序中 我有三大功能其中一个处理连接 selectedDb Get selectedDb Add selectedDb
  • Linux Python Azure Function APP - 尽管在requirements.txt中但未找到pyodbc模块,并且其他模块工作正常

    我正在使用一个Linux consumption plan 我收到以下错误 Exception ModuleNotFoundError No module named pyodbc 我已经添加了pyodbc in the requireme
  • 如何在powershell中获取登录用户的电子邮件

    使用 Vbscript 我们获取当前用户的电子邮件 ID 它就像下面几行一样简单 Option Explicit Dim objUser objADSysInfo Set objADSysInfo CreateObject ADSystem
  • 如何在指定半径的圆内生成随机坐标?

    我试图生成位于半径 5 公里的圆内的随机坐标 纬度 经度 其中中心点位于某个坐标 x y 我正在尝试用 ruby 编写此代码 并且正在使用该方法 但不知何故我得到的结果不在指定的 5 公里半径内 def location lat lng m