Найти полигоны слева и справа от линии - PullRequest
1 голос
/ 20 марта 2019

У меня есть таблица линий и таблица полигонов. Некоторые линии (возможно, 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).

Есть идеи, как это ускорить, или, может быть, совсем другой подход для определения полигонов слева и справа?

1 Ответ

0 голосов
/ 28 марта 2019

Если ваши таблицы polygons и lines, я бы предложил фильтрацию в объединении с ST_Intersects:

SELECT *
FROM polygones p INNER JOIN lines l ON ST_Intersects(p.geom, l.geom)
WHERE 
ST_Contains(
    polygon.geom, 
    ST_Transform(
        ST_LineInterpolatePoint(
            ST_GeometryN(
                ST_OffsetCurve(
                    ST_Transform(line.geom,3857)
                    , -1)
                , 1)
            , 0.5)
        , 4326)
    )
...