【问题标题】:PostgreSQL: show trips within a bounding boxPostgreSQL:在边界框内显示行程
【发布时间】:2020-07-09 11:07:43
【问题描述】:

我有一个包含用户旅行信息的trips 表,如下所示:

select * from trips limit 10;
 trip_id | daily_user_id | session_ids | seconds_start | lat_start  | lon_start  | seconds_end |  lat_end   |  lon_end   |     distance     
---------+---------------+-------------+---------------+------------+------------+-------------+------------+------------+------------------
  594221 |         16772 | {170487}    |    1561324555 | 41.1175475 | -8.6298934 |  1561325119 | 41.1554091 | -8.6283493 | 5875.39697884959
  563097 |          7682 | {128618}    |    1495295471 | 41.1782829 | -8.5950303 |  1495299137 | 41.1783908 | -8.5948965 | 5364.81067787512
  596303 |         17264 | {172851}    |    1578011699 | 41.5195598 | -8.6393526 |  1578012513 | 41.4614024 |  -8.717709 | 11187.7956426909
  595648 |         17124 | {172119}    |    1575620857 | 41.1553116 | -8.6439528 |  1575621885 | 41.1621821 | -8.6383042 | 1774.83365424607
  566061 |          8720 | {133624}    |    1509005051 | 41.1241975 | -8.5958988 |  1509006310 | 41.1424158 | -8.6101461 | 3066.40306678979
  566753 |          8947 | {134662}    |    1511127813 | 41.1887996 | -8.5844238 |  1511129839 | 41.2107519 | -8.5511712 | 5264.64026582458
  561179 |          7198 | {125861}    |    1493311197 | 41.1776935 | -8.5947254 |  1493311859 | 41.1773815 | -8.5947254 | 771.437257541019
  541328 |          2119 | {46950}     |    1461103381 |    41.1779 | -8.5949738 |  1461103613 | 41.1779129 | -8.5950202 | 177.610819150637
  535519 |           908 | {6016}      |    1460140650 | 41.1644658 | -8.6422775 |  1460141201 | 41.1642646 | -8.6423309 | 1484.61552373019
  548460 |          3525 | {102026}    |    1462289206 |  41.177689 |  -8.594679 |  1462289843 | 41.1734476 | -8.5916326 | 1108.05119077308
(10 rows)

任务是过滤在upper left: 41.24895, -8.68494lower right: 41.11591, -8.47569 定义的边界框内开始和结束的行程。

【问题讨论】:

  • 左上角是什么意思?您指的是任何特定的列吗?
  • 上面写着relation "j" does not exist
  • @JimJones ERROR: Operation on mixed SRID geometries
  • @JimJones 根据我在您的回答中的评论生成错误。

标签: sql postgresql google-maps postgis


【解决方案1】:

由于您的坐标存储在 x,y 列中,因此您必须使用 ST_MakePoint 来创建正确的几何图形。之后,您可以使用函数ST_MakeEnvelope创建一个BBOX,并使用ST_Contains检查开始和结束坐标是否在BBOX内,例如

WITH bbox(geom) AS (
  VALUES (ST_MakeEnvelope(-8.68494,41.24895,-8.47569,41.11591,4326))
)
SELECT * FROM trips,bbox
WHERE 
  ST_Contains(bbox.geom,ST_SetSRID(ST_MakePoint(lon_start,lat_start),4326)) AND
  ST_Contains(bbox.geom,ST_SetSRID(ST_MakePoint(lon_end,lat_end),4326));

注意:CTE 并不是真正必需的,在查询中只是为了说明目的。您可以在 WHERE 子句中的两个条件上重复 ST_MakeEnvelope 函数,而不是 bbox.geom。此查询还假定 SRS WGS84 (4326)。

【讨论】:

  • 这里有些错误ERROR: Operation on mixed SRID geometries
  • @arilwan 我真诚地建议您将坐标存储在几何或地理列中。根据您的表大小,查询时间的转换可能会变慢。祝你好运!
  • 啊,好吧,我必须在trips 类型的geography 表中添加一个列geo_start,而不是使用lat_start, lon_start 更新列
  • 只是一个问题,在查询中添加数字4326 有什么意义?
  • @arilwan 4326 代表 SRS(空间参考系统) - 也称为 CRS(坐标参考系统)。 4326 是 WGS84 的 SRS 代码,它是世界上使用最多的坐标系。在这个问题中,我也处理了这个问题:stackoverflow.com/a/52446455/2275388 ;-)
【解决方案2】:

如果我理解正确,您可以比较一下起始坐标和结束坐标:

select t.*
from trips t
where lat_start >= 41.11591 and lat_start <= 41.24895 and
      lat_end >= 41.11591 and lat_end <= 41.24895 and
      long_start >= -8.68494 and long_start <= -8.47569 and
      long_end >= -8.68494 and long_end <= -8.47569
  
  

【讨论】:

  • 啊,好的。我认为postgres/postgis 提供了一些函数来仅从bbox 对角线的坐标来执行此操作。
  • @arilwan 。 . . (1) 确实如此。 (2) 您似乎将数据放在不同的列中。
猜你喜欢
  • 2021-12-02
  • 1970-01-01
  • 2021-09-18
  • 2011-08-13
  • 2022-01-22
  • 2011-07-18
  • 1970-01-01
  • 1970-01-01
  • 2022-11-18
相关资源
最近更新 更多