将 SQL 范围限定为国际日期变更线上的边界框

Posted

技术标签:

【中文标题】将 SQL 范围限定为国际日期变更线上的边界框【英文标题】:Scoping SQL to a bounding box over the international date line 【发布时间】:2021-12-30 05:28:12 【问题描述】:

我正在尝试将查询范围限定为选择纬度/经度边界框内的位置。一般来说,如果边界框不跨越国际日期变更线,这可以正常工作。

SELECT *
FROM locations
WHERE latitude BETWEEN ? AND ?
AND longitude BETWEEN ? AND ?

但是 - 如果我的边界框要跨越国际日期变更线 - 比如说从 179.00-179.00 的纵向边界,那么查询不会返回任何结果。我不能只是翻转订单并将其更改为 -179.00179.00 之间,因为那样会返回我的边界框之外的东西。

什么是最好地确定所需的适当 SQL 的最明智的方法(作为有助于派生最佳 SQL 的 SQL 或伪代码)。

【问题讨论】:

您使用的是什么关系型数据库?您的位置是否以某种地理数据类型存储? +1 到 RDBMS 问题。一些数据库具有本机空间支持,您可以使用。例如。 BigQuery 有ST_IntersectsBox,它可以在国际日期变更线上正常工作,例如ST_IntersectsBox(p, 179, -10, -179, 10). 我正在使用 mysql,但纬度/经度存储为单独的双列。 【参考方案1】:

您可以做的一件事是在WHERE 子句中使用CASE WHEN 表达式来区分您的纵向下限是否大于上限并相应地修改行为:

SELECT * 
  FROM locations 
 WHERE lon BETWEEN CASE WHEN @param1 > @param2 THEN -180.0 
                        ELSE @param1 
                   END AND @param2 
    OR lon BETWEEN CASE WHEN @param1 > @param2 THEN @param1 
                        ELSE 181.0 
                   END AND 180.0

对于您的示例(179.00-179.00 的纵向边界),这将具有与

相同的效果
SELECT * 
  FROM locations 
 WHERE lon BETWEEN -180.0 AND -179.0
    OR lon BETWEEN 179.0 AND 180.0

而倒置示例的相同查询(-179.00179.00 的纵向边界)将评估为

SELECT * 
  FROM locations 
 WHERE lon BETWEEN -179.0 AND 179.0
    OR lon BETWEEN 181.0 AND 180.0 -- (always false)

在this db<>fiddle (SQL Server example) 中查看它的实际效果。

【讨论】:

我喜欢它的发展方向——我认为这是一个很好的蓝图,可以将其转换为可以生成 SQL 而无需总是错误地 OR 子句的代码。

以上是关于将 SQL 范围限定为国际日期变更线上的边界框的主要内容,如果未能解决你的问题,请参考以下文章

Mysql 数据查询语句中between and 是包含边界值的

在边界框中绘制 networkx 图

任何形状四边形的最小边界框或凸包?

shell脚本中 ${ } 和 $(( )) 的区别。${ } 限定变量边界 $(( )) 加减乘除运算

如何将地理坐标转化为矢量边界信息

为啥边界值不叫粗细?