Postgis指向多边形内部和外部

时间:2018-04-12 06:10:41

标签: postgresql postgis

我试图找出如何检测进入某个区域并离开该区域的汽车。 目前,我有一个包含汽车ID,时间戳,纬度,经度(carid,timestamp,lat,lon)的表(数据来自GPS跟踪器)。 我有多边形变量,我将其转换为几何类型。

我的目标是说 汽车A在上午8点,汽车A在上午9点,汽车A在下午3点,汽车A在下午4点,汽车B在上午10点,汽车B在下午3点,...

我知道如何使用ST_Within和外部使用ST_Disjoint在多边形内找到点(lat / lon)。

由此,我想我必须为每辆车找到最接近多边形的内外点(如果是外点的时间戳)

但我无法弄清楚如何编写正确的查询,因为知道汽车每天可以进出几次。

1 个答案:

答案 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)。

可能有更优雅的解决方案。