Как получить длину пересечения соприкасающихся геометрий с помощью ST_Touches - PullRequest
1 голос
/ 28 января 2020

Я пытаюсь разработать запрос в Postgis, где он может решить эту проблему:

У меня есть геометрия, и я хочу знать, какой из полигонов, которые ее касаются, имеет самую высокую площадь контакта этого геометрия. После того, как я узнаю этот многоугольник, я возьму его значение в столбце спецификаций c и поместу это значение в тот же столбец, но в моей геометрии.

Кто-то знает, как я могу это сделать? Я новый пользователь в postgresql / postgis.

1 Ответ

1 голос
/ 29 января 2020

Как отмечает @JGH в комментариях, область перекрытия будет нулевой, если вы используете только ST_Touches. Что вы можете сделать, чтобы отфильтровать только геометрические формы, которые касаются ссылочных геометрий, а затем использовать ST_Intersection, чтобы получить область пересечения, так что вы можете, наконец, вычислить длину пересечения с ST_Length.

Образец данных

enter image description here

Значения геометрии, изображенные выше, находятся внутри CTE :

WITH j (id,geom) AS (
  VALUES 
  (1,'POLYGON((-4.64 54.19,-4.59 54.19,-4.59 54.17,-4.64 54.17,-4.64 54.19))'),
  (2,'POLYGON((-4.59 54.19,-4.56 54.19,-4.56 54.17,-4.59 54.17,-4.59 54.19))'),
  (3,'LINESTRING(-4.65 54.19,-4.57 54.21)'),
  (4,'POLYGON((-4.66 54.21,-4.60 54.21,-4.60 54.20,-4.66 54.20,-4.66 54.21))'),
  (5,'POINT(-4.57 54.20)')
)
SELECT 
  id, 
  ST_Length(
    ST_Intersection(
      geom,
      'POLYGON((-4.62 54.22,-4.58 54.22,-4.58 54.19,
                -4.62 54.19,-4.62 54.22))')) AS touch_length
FROM j
WHERE 
  ST_Touches(
    geom,
    'POLYGON((-4.62 54.22,-4.58 54.22,-4.58 54.19,
              -4.62 54.19,-4.62 54.22))')
ORDER BY touch_length DESC
LIMIT 1;

 id |    touch_length     
----+---------------------
  1 | 0.03000000000000025
(1 Zeile)
...