移動オブジェクトが空間内の他の可動および固定オブジェクトに触れることをテストするためのオフセット関数を作成しようとしています。
これをテストするには、それらの境界四角形が交差するかどうかを確認する必要があります。
2 つの可動オブジェクトが次のように接触しているかどうかをテストしたいと思います: Table car
- id: integer (autoinc primary)
- rect: Linestring
- ...
テーブルの場所
- id: 整数 (autoinc プライマリ)
- car_id: 整数
- car_date: 日付
- car_pos: ポイント
- ...
FUNCTION MyDB.OffsetRect(pLineString GEOMETRY, pOffset POINT)
RETURNS geometry
BEGIN
declare Result LineString;
declare P1 Point;
declare P2 point;
declare P3 point;
declare P4 point;
set Result = ENVELOPE(pLineString); /Make sure we are dealing with a rect/
set P1 = POINTN(Result,1);
set p1 = Point(X(p1)+X(pOffset),Y(p1)+Y(pOffset));
set P2 = POINTN(Result,2);
set p2 = Point(X(p2)+X(pOffset),Y(p2)+Y(pOffset));
set P3 = POINTN(Result,3);
set p3 = Point(X(p3)+X(pOffset),Y(p3)+Y(pOffset));
set P4 = POINTN(Result,4);
set p4 = Point(X(p4)+X(pOffset),Y(p4)+Y(pOffset));
set Result = LineString(p1,p2,p3,p4);
RETURN Result;
END
しかし、2 台の車が時間内に交差するかどうかを確認するために使用するクエリに行き詰まっています。何かのようなもの。
SELECT location.id, location2.id FROM location
INNER JOIN car ON (car.id = location.car_id)
INNER JOIN location location2 ON (location.id <> location2.id)
INNER JOIN car car2 ON (car2.id = location2.car_id AND car.id <> car2.id)
WHERE location.car_date BETWEEN date_sub(now(),INTERVAL 1 DAY) AND date_add(now(),INTERVAL 1 DAY)
AND location2.car_date BETWEEN date_sub(now(),INTERVAL 1 DAY) and date_add(now(),INTERVAL 1 DAY)
AND MBRIntersects(OffsetRect(car.rect,location.car_pos),OffsetRect(car2.rect,location2.car_pos));
しかし、これは機能しません。何が問題なのですか?