【问题标题】:Scoping SQL to a bounding box over the international date line将 SQL 范围限定为国际日期变更线上的边界框
【发布时间】: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,但纬度/经度存储为单独的双列。

标签: sql geolocation gis latitude-longitude bounding-box


【解决方案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 子句的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 2012-12-25
  • 2021-08-16
  • 1970-01-01
  • 1970-01-01
  • 2011-04-19
  • 1970-01-01
相关资源
最近更新 更多