PostGIS - Отримайте точку всередині лінії або багатокутника


10

Мені потрібно отримати центральну точку лінії або багатокутника, щоб зробити markerдля свого додатка. Так що при натисканні на маркер з’являється геометрія (лінія або багатокутник). Раніше я ST_Centroidпрацював.

Результат - це те, що я очікував зняття деяких полігонів чи ліній, центроїдів яких не в геометрії. Що я хотів би для цих ліній або багатокутників, це отримати "найбільш центральну точку", але всередині геометрії.

Як я можу це зробити? Чи є рішення?

Відповіді:


9

Від doc: ST_PointOnSurface - Повертає POINT, гарантовано лежачи на поверхні.


4
Для рядків ST_LineInterpolatePoint з дробом 0,5 має бути ідеальним postgis.net/docs/manual-2.1/ST_LineInterpolatePoint.html
user30184

ST_PointOnSurface () працює з Lines! (thx Postgis)
WKT

Так! Ви маєте рацію @ user30184, тому що здається, що для рядків ST_PointOnSurface () приймає крапку довільно, я не впевнений, але в прикладі doc приймає першу точку LineString.
Хосе Ермосіла Родріго

7

У моєму випадку я маю кожну геометрію в таблицях розрізів. Що я зробив:

  1. Для рядків -> ST_LineInterpolatePoint()з коефіцієнтом 0,5.
  2. Для багатокутників -> Перевірте, чи ST_Centroid()знаходиться всередині його геометрія. Якщо так, ST_Centroid()то найкращий вибір, якщо не я вибираю PointOnSurface().

Ось запит:

SELECT
    CASE WHEN (SELECT the_geom FROM points WHERE gid = d.gid) IS NOT NULL
    THEN (SELECT the_geom FROM points WHERE gid = d.gid)
    WHEN (SELECT the_geom FROM lines WHERE gid = d.gid) IS NOT NULL
    THEN ST_LineInterpolatePoint((SELECT the_geom FROM lines WHERE gid = d.gid), 0.5)
    WHEN (SELECT the_geom FROM polygons WHERE gid = d.gid AND ST_Intersects(ST_Centroid(the_geom),the_geom)) IS NOT NULL
    THEN ST_Centroid((SELECT the_geom FROM polygons WHERE gid = d.gid))
    ELSE ST_PointOnSurface((SELECT the_geom FROM polygons WHERE gid = d.gid))
    END AS center
FROM someTable d

5
Оператор && перевіряє лише bbox. Ви можете використовувати ST_intersects ().
WKT

Ти правий. Я помилявся. Я оновлю свою відповідь. Дякую!
Хосе Ермосіла Родріго
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.