У меня есть таблица линий и таблица полигонов. Некоторые линии (возможно, 1% всех линий) находятся на границах между многоугольниками (большинство линий просто лежат внутри одного многоугольника).
Как эффективно определить многоугольник «слева» и «справа» от заданной линии?
Это мой текущий эксперимент: сделать параллельные линии на расстоянии 1 метра влево и вправо (ST_OffsetCurve), взять первую геометрию в результате, так как это, возможно, многоканальная строка (ST_GeometryN), взять среднюю точку этих линий (ST_LineInterpolatePoint) и выполнить запрос полигоны, содержащие эти точки (ST_Contains).
... WHERE ST_Contains(polygon.geom, ST_Transform(ST_LineInterpolatePoint(ST_GeometryN(ST_OffsetCurve(ST_Transform(line.geom,3857), -1),1), 0.5), 4326)
Работает, но очень медленно (конечно же, есть геометрические показатели GIST).
Есть идеи, как это ускорить, или, может быть, совсем другой подход для определения полигонов слева и справа?