我试图找出如何检测进入某个区域并离开该区域的汽车。 目前,我有一个包含汽车ID,时间戳,纬度,经度(carid,timestamp,lat,lon)的表(数据来自GPS跟踪器)。 我有多边形变量,我将其转换为几何类型。
我的目标是说 汽车A在上午8点,汽车A在上午9点,汽车A在下午3点,汽车A在下午4点,汽车B在上午10点,汽车B在下午3点,...
我知道如何使用ST_Within和外部使用ST_Disjoint在多边形内找到点(lat / lon)。
由此,我想我必须为每辆车找到最接近多边形的内外点(如果是外点的时间戳)
但我无法弄清楚如何编写正确的查询,因为知道汽车每天可以进出几次。
答案 0 :(得分:0)
蛮力方法是定期询问每辆车的状态(进/出)。
SELECT carID, st_within(car_geom, boxgeom) AS in_box FROM table
WHERE timestamp = '2018-06-05 09:00:00';
这会为您提供车辆IDS和True
的列表,如果在,False
,如果输入。但是,它假定您的数据每秒只记录一个且只有一个点。
在实践中,我会寻找timestamp BETWEEN '2018-06-05 09:00:00' AND '2018-06-05 09:01:00'
并确保您只使用GROUP BY carID
为每辆车获得一行。您需要在st_within周围使用聚合函数。如果您希望in_box仅在所有点都在框内时为真,请使用bool_and
;如果你希望in_box为True,如果至少有一个点在里面,则使用bool_or
。
SELECT carID, bool_or(st_within(car_geom, boxgeom)) AS in_box
FROM table WHERE timestamp BETWEEN '2018-06-05 09:00:00'
AND '2018-06-05 09:01:00' GROUP BY carID;
然后我会使用一些python来生成查询并分析结果(例如使用psycopg2)。
可能有更优雅的解决方案。