我可以使用 Postgres 函数查找固定大小的旋转矩形内的点吗?

2023-11-29

我正在使用 Postgres 9.5,并且刚刚安装了 PostGIS 来实现一些扩展功能。我有一个包含 (x,y) 点的表格,我想找到适合最大点数的矩形。约束是矩形边长是固定的。到目前为止,我正在计算框中有多少个没有旋转的点。我的观点以原点为中心,(0,0).

SELECT Sum(CASE
             WHEN x > -5
                  AND x < 5
                  AND y > -10
                  AND y < 10 THEN 1
             ELSE 0
           END) AS inside_points,
       Count(1) AS total_points
FROM   track_t;  

这个查询给出了带有原点的矩形内的点数(0,0)和长度x = 10 and y = 20.

从这里我将创建一个旋转矩形角点(角度、x1、y1、x2、y2)的辅助表,然后交叉连接到我的数据,并计算每个角度的点,同时按角度分组。然后我可以选择哪个角度在矩形内给我最多的点。

但这似乎有点过时,而且可能性能不佳。此外,计算旋转矩形内的点不是一个琐碎的计算.

有没有更高效、优雅的方式,也许使用 Postgres几何数据类型或PostGISBox2D, 旋转一个边长固定的矩形,然后计算里面的点数?几何函数看起来不错,但它们似乎提供了最小边界框,而不是相反。

除了 Postgresql 之外,我还使用了一个 Python 框架,可以在 SQL 无法完成这项工作的情况下使用。


更新:我尝试过的一件事是使用几何类型,特别是盒子

  SELECT deg, Box(Point(-5, -10), Point(5, 10)) * Point(1, Radians(deg)) 
        FROM   Generate_series(0, 360, 90) AS deg

不幸的是,旋转功能按一点不适用于多边形.


我最终生成了矩形顶点,旋转这些顶点,然后将矩形(常数)的面积与通过包含测试点而形成的 4 个三角形的面积进行比较。

该技术基于吝啬的回答:

做三角形。假设 abcd 是矩形,x 是点,那么如果area(abx)+area(bcx)+area(cdx)+area(dax) equals area(abcd)那么点就在里面了。

矩形定义为

  • A左下角(-x/2,-y/2)

  • B左上角 (-x/2,+y/2)

  • C右上角 (+x/2,+y/2)

  • D右下角(+x/2,-y/2)

然后,此代码检查点 (qx,qy) 是否位于宽度的矩形内x=10和身高y=20,绕原点 (0,0) 旋转 10 度,范围为 0 到 180。

这是代码。检查 750k 点需要 9 分钟,所以肯定还有改进的空间。另外,一旦我升级到9.6,它就可以并行化

with t as (select 10*0.5 as x, 20*0.5 as y, 17.0 as qx, -3.0 as qy)

select 
    z.angle
    -- ABC area
    --,abs(0.5*(z.ax*(z.by-z.cy)+z.bx*(z.cy-z.ay)+z.cx*(z.ay-z.by)))

    -- CDA area
    --,abs(0.5*(z.cx*(z.dy-z.ay)+z.dx*(z.ay-z.cy)+z.ax*(z.cy-z.dy)))

    -- ABCD area
    ,abs(0.5*(z.ax*(z.by-z.cy)+z.bx*(z.cy-z.ay)+z.cx*(z.ay-z.by))) + abs(0.5*(z.cx*(z.dy-z.ay)+z.dx*(z.ay-z.cy)+z.ax*(z.cy-z.dy))) as abcd_area

    -- ABQ area
    --,abs(0.5*(z.ax*(z.by-z.qx)+z.bx*(z.qy-z.ay)+z.qx*(z.ay-z.by)))

    -- BCQ area
    --,abs(0.5*(z.bx*(z.cy-z.qx)+z.cx*(z.qy-z.by)+z.qx*(z.by-z.cy)))

    -- CDQ area
    --,abs(0.5*(z.cx*(z.dy-z.qx)+z.dx*(z.qy-z.cy)+z.qx*(z.cy-z.dy)))

    -- DAQ area
    --,abs(0.5*(z.dx*(z.ay-z.qx)+z.ax*(z.qy-z.dy)+z.qx*(z.dy-z.ay)))

    -- total area of triangles with question point (ABQ + BCQ + CDQ + DAQ)
    ,abs(0.5*(z.ax*(z.by-z.qx)+z.bx*(z.qy-z.ay)+z.qx*(z.ay-z.by)))
        + abs(0.5*(z.bx*(z.cy-z.qx)+z.cx*(z.qy-z.by)+z.qx*(z.by-z.cy)))
        + abs(0.5*(z.cx*(z.dy-z.qx)+z.dx*(z.qy-z.cy)+z.qx*(z.cy-z.dy)))
        + abs(0.5*(z.dx*(z.ay-z.qx)+z.ax*(z.qy-z.dy)+z.qx*(z.dy-z.ay))) as point_area

from
(
SELECT 
    a.id as angle
    -- bottom left (A)
    ,(-t.x) * cos(radians(a.id)) - (-t.y) * sin(radians(a.id)) as ax
    ,(-t.x) * sin(radians(a.id)) + (-t.y) * cos(radians(a.id)) as ay
    --top left (B)
    ,(-t.x) * cos(radians(a.id)) - (t.y) * sin(radians(a.id)) as bx
    ,(-t.x) * sin(radians(a.id)) + (t.y) * cos(radians(a.id)) as by
    --top right (C)
    ,(t.x) * cos(radians(a.id)) - (t.y) * sin(radians(a.id)) as cx
    ,(t.x) * sin(radians(a.id)) + (t.y) * cos(radians(a.id)) as cy
    --bottom right (D)
    ,(t.x) * cos(radians(a.id)) - (-t.y) * sin(radians(a.id)) as dx
    ,(t.x) * sin(radians(a.id)) + (-t.y) * cos(radians(a.id)) as dy

    -- point to check (Q)
    ,t.qx as qx
    ,t.qy as qy
FROM generate_series(0,180,10) AS a(id), t
) z
;

结果是

angle;abcd_area;point_area
0;200;340
10;200;360.6646055963
20;200;373.409049054212
30;200;377.846096908265
40;200;373.84093170467
50;200;361.515248361426
60;200;341.243556529821
70;200;313.641801308188
80;200;279.548648061772
90;200;240
*100;200;200*
*110;200;200*
*120;200;200*
*130;200;200*
*140;200;200*
150;200;237.846096908265
160;200;277.643408923024
170;200;312.04311584956
180;200;340

其中,角度 100、110、120、130 和 140 度的旋转包括测试点(用*)

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

我可以使用 Postgres 函数查找固定大小的旋转矩形内的点吗? 的相关文章

  • 线性问题和非线性问题之间的区别?点积和核技巧的本质

    核技巧将非线性问题映射为线性问题 我的问题是 1 线性问题和非线性问题的主要区别是什么 这两类问题的差异背后的直觉是什么 核技巧如何帮助在非线性问题上使用线性分类器 2 为什么点积在这两种情况下如此重要 Thanks 当人们说到分类问题的线
  • 使用连接查询检索行

    我有两张这样的桌子 A B col1 col2 col1 col2 一个表包含 300k 行 B表包含400k行 如果表 A 的 col1 与表 B 的 col1 匹配 我需要计算它 我写了一个这样的查询 select count dist
  • MySQL:你能指定一个随机限制吗?

    有没有办法在 SQL MySQL 中随机化限制数字 我希望能够做的是在查询中获取随机数量的结果以在插入子查询中使用 而无需任何服务器端脚本 我希望能够作为假设说明运行的查询是 SELECT id FROM users ORDER BY RA
  • 整理有关 QueryDSL-JPA 的提示

    有没有办法用 QueryDSL 来执行它 粗体部分 从地点选择 其中名称如 cafe 整理 Latin1 general CI AI 我将 JPA 与 hibernate 一起使用 您可以使用addFlag QueryFlag Positi
  • 将多边形“对齐”在一起

    我有一组代表行政区的多边形 这些区域是手工数字化的 多边形之间有很小的空间 多边形之间应该接触 可能还有重叠的多边形 如何让多边形对齐在一起 填充间隙并消除重叠 首选 QGIS ArcGIS 或 Python 库解决方案 但欢迎算法建议 我
  • 在防风草模型上使用 VIP 包计算重要性度量

    我正在尝试使用 vi firm 在防风草中制作的逻辑回归模型上计算特征重要性 对于正则表达式 我将使用 iris 数据集并尝试预测观察结果是否为 setosa iris1 lt iris gt mutate class case when
  • (SQL) 识别字段中字符串格式多次出现的位置

    我需要将叙述字段 自由文本 拆分为多行 目前的格式如下 Case Reference Narrative XXXX XX 123456 Endless Text up to 50k characters 在作为文本的叙述字段中 各个条目 当
  • 使用神经网络包进行多项分类

    这个问题应该很简单 但文档没有帮助 我正在使用 R 我必须使用neuralnet多项式分类问题的包 所有示例均针对二项式或线性输出 我可以使用二项式输出进行一些一对一的实现 但我相信我应该能够通过使用 3 个单元作为输出层来做到这一点 其中
  • 在 Oracle 中使用触发器记录对表的更改

    我的一门课有一个项目 当我们的两个表发生更改时 我们需要创建一个日志 插入 更新 删除 我们需要使用Oracle触发器和PL SQL 在日志文件中 我们需要记录用户ID 日期时间 IP地址和事件 插入 更新 删除 我知道如何设置触发器 但我
  • 如何将自定义类型数组传递给 Postgres 函数

    我有一个自定义类型 CREATE TYPE mytype as id uuid amount numeric 13 4 我想将它传递给具有以下签名的函数 CREATE FUNCTION myschema myfunction id uuid
  • POSTGRESQL:如何在现有表上添加包含数据的新列

    我是 postgres 和 sql 脚本的新手 所以请耐心等待 我想要做的是在现有表上添加包含数据的现有列 现有表的示例 NAME AGE Adam 25 Tim 30 现在我想添加一个新列 ADDRESS 其中包含 Adam 和 Tim
  • SQL - 为每条记录调用存储过程

    我正在寻找一种方法来为 select 语句的每条记录调用存储过程 SELECT SomeIds SELECT spro Id FROM SomeTable as spro INNER JOIN Address addr ON addr Id
  • 操作错误:游标“_django_curs_”不存在

    我们有一个由 django postgresql 和 heroku 提供支持的在线商店 Web 应用程序 对于特定的活动 您可以将活动视为要购买的产品 我们已成功售出 10 000 份以上的副本 然而 根据我们的 Sentry 报告 我们的
  • Yii 查询时对相关模型的限制

    我遇到了极限问题 我正在使用的代码如下 model PostCategory model record model gt with array posts gt array order gt posts createTime DESC li
  • 如何避免应用程序停止后 docker 容器停止

    有一个带有 Postgres 服务器的 docker 容器 postgres 停止或崩溃 无关紧要 我需要检查一些环境变量和一些文件的状态 默认情况下 容器在应用程序完成后停止 我知道有一个选项可以更改 dockerfile 中的默认行为
  • Tensorflow 2.0 中的二阶导数

    我正在尝试计算标量变量的简单向量函数的二阶导数f x x x 2 x 3 使用 TF 2 3 与tf GradientTape def f ab x return x x 2 x 3 import tensorflow as tf in1
  • 在存储过程结束时显式删除本地临时表有什么好处?

    考虑以下伪 T SQL 代码 由存储过程执行 CREATE TABLE localTable
  • SQL:查找每个跑步者跑步之间的平均天数

    因此 如果我们给出下表 runner ran Carol 2011 02 01 Alice 2011 02 01 Bob 2011 02 01 Carol 2011 02 02 Bob 2011 02 02 Bob 2011 02 03 B
  • 从一个sql服务器选择到另一个sql服务器?

    我想将一台服务器 Data Old S1 中的一个表 T1 在 DB1 中 中的数据选择到另一台服务器 Data Latest S2 中的另一个表 T2 在 DB2 中 中的数据 我怎样才能做到这一点 请注意服务器的命名方式 查询也应该考虑
  • 期望最大化算法的数值示例[重复]

    这个问题在这里已经有答案了 由于我不确定给出的公式 有人可以提供 EM 算法的简单数字示例吗 一个非常简单的具有 4 或 5 个笛卡尔坐标的坐标就可以了 那这个呢 http en wikibooks org wiki Data Mining

随机推荐

  • 如何显示“打开方式”文件对话框?

    有没有简单的方法来打开 打开方式 文件对话框 使用 ProcExp 进行的一些逆向工程揭示了一个有效的 rundll32 exe 命令行 这是使用它的示例程序 using System using System Diagnostics us
  • 在 R 中有效地创建向量的排列

    我正在研究一种在 R 中有效创建向量混乱 以及相反的特定排列 的方法 据我所知 没有基本函数可以做到这一点 而且这里也没有太多关于它的内容 一个明显的开始是sample它创建了一个向量的排列 但我需要这个排列没有固定点 因此是向量的混乱 有
  • 在 CSS FlexBox 布局中自动调整图像大小并保持宽高比?

    我使用了 CSS 弹性框布局 如下所示 如果屏幕变小 就会变成这样 问题是图像没有调整大小 保持原始图像的纵横比 如果屏幕变小 是否可以使用纯 CSS 和弹性框布局来调整图像大小 这是我的html div class content div
  • 如何克隆Python生成器对象?

    考虑这种情况 usr bin env python coding utf 8 import os walk os walk home for root dirs files in walk for pathname in dirs file
  • 如何限制用户或应用程序使用大页面支持?

    我们部署和使用 内部自行开发的应用程序 所有这些实际上都使用大页面和mmap 系统调用 但我更愿意限制某些应用程序实际使用大页面支持 这可以通过代码的任何更改或任何可以实现的系统范围的配置选项来实现吗 我建议设置和使用内核可调选项vm hu
  • 从 UIMenuController 中删除复制、查找和共享

    我正在尝试覆盖默认值UIMenuController这样 当用户在其文本视图中选择文本时 仅出现我的自定义项 定义 到目前为止 我在网上找到的方法并没有太多运气 更具体地说 我将UIViewController并使用canPerformAc
  • Accepts_nested_attributes_for 和Belongs_to 多态

    我想与建立多态关系accepts nested attributes for 这是代码 class Contact
  • Xcode - OSX 错误:使用旧版运行时的平台不支持 -fobjc-arc

    我正在使用 XCode 4 6 1 和 OSX 10 8 5 我尝试编译一个项目但收到此错误 error fobjc arc is not supported on platforms using the legacy runtime Co
  • 从本机代码 (JNI/NDK) 创建、填充和返回 2D 字符串数组

    我发现这段特定的代码非常困难 尤其是因为我一周前才开始使用 C 我一直在努力寻找正确的语法来在 C 中正确创建 java 字符串数组 即 jstring 对象数组 即表示 jstring 对象数组的对象 我一直在使用以下资源 并从中构建了可
  • 检查器中显示哪种旋转?

    我的玩家的胸骨可以在瞄准时旋转 现在我想评估我应该让胸部旋转多少 最小和最大旋转 为此 我允许所有角度的旋转并查看了 Inspector 例如 胸部应可向左旋转的最小值应为Y 15 当 Y 15 在 Inspector 中看到 时 它看起来
  • React,无法读取 useEffect 的未定义错误的属性

    我试图从 API 获取一些天气数据 但总是遇到无法读取未定义属性的相同错误 我已经浏览了不同的教程和之前提出的问题 但我无法弄清楚我做错了什么 有人可以帮我一下吗 export default function Weather const
  • Entity Framework 5.0b2 Code First:同一个表的一对多和一对一,带级联删除

    经过几个小时的反复试验 我达到了这个目的thread它解释了如何使用相同的两种类型建立一对多关系和一对一关系 但是 我无法将此与级联删除一起使用 抛出 无法确定依赖项的有效顺序 运营 由于外键约束 可能存在依赖关系 模型要求 或存储生成的值
  • Android 上 chrome 25 中的语音输入

    在运行 chrome 25 非测试版 的 PC 上 显示一个麦克风图标 单击它会提示输入 当我停止说话时 我的警报呼叫就会执行 都好 在运行 chrome 25 非测试版 且运行 Android 4 04 的 Galaxy Note 智能手
  • 如何使用 Regex.Replace 一次替换两个字符串?

    我有以下方法可以替换文件名中的 井号 符号 但我还希望能够同时替换 单撇号 我该怎么做 这是文件名的值 提供商许可证 A R Ab acus Settlements 1 11 09 xls static string removeBadCh
  • Rust 中低级数据结构和类型转换的位域和联合

    我需要管理位域数据和联合 这是我在 C 中想到的代码 typedef struct attribute packed union struct attribute packed unsigned short protocol 4 unsig
  • 如何查看 pytest 运行期间创建的正常打印输出?

    有时我只想在代码中插入一些打印语句 然后看看当我执行它时会打印出什么 我通常的 练习 方法是使用现有的 pytest 测试 但是当我运行这些时 我似乎看不到任何标准输出 至少在我的 IDE PyCharm 中 有没有一种简单的方法可以在 p
  • Spring Boot Oauth2 客户端(反应式)双向 TLS/SSL 令牌 uri

    弹簧靴2 3 x 和 Spring 5 x 最近添加了对基于以下配置的反应式 oauth2 客户端的支持网络客户端 class 我需要客户端凭据授予流程配置 在没有相互 TLS SSL 的情况下执行此调用非常简单 正常 无 TLS SSL
  • 如何在不使用引用的情况下删除 F# 序列中的重复项

    我有一个排序序列 想要遍历它并返回序列中的唯一条目 我可以使用以下函数来完成此操作 但它使用引用变量 我认为这不是解决问题的正确方法 let takeFirstCell sectors let currentRNCId ref 1 let
  • 将水平(基于行)数据从 xlsx 文件读取到 R 数据帧中

    这是一篇 让我们尝试另一种方式 的帖子 与this one 是否可以定义 修改一个读取函数 可以处理这样的事实 数据存储在xlsx文件是基于行的 即每一行代表一个变量 并相应地对其进行转换 以便可以将其存储在基于列的 data frame
  • 我可以使用 Postgres 函数查找固定大小的旋转矩形内的点吗?

    我正在使用 Postgres 9 5 并且刚刚安装了 PostGIS 来实现一些扩展功能 我有一个包含 x y 点的表格 我想找到适合最大点数的矩形 约束是矩形边长是固定的 到目前为止 我正在计算框中有多少个没有旋转的点 我的观点以原点为中