PostGIS - Dapatkan titik di dalam garis atau poligon

10

Saya perlu mendapatkan titik pusat garis atau poligon untuk membuat markeraplikasi saya. Sehingga ketika Anda mengklik penanda, geometri muncul (garis atau poligon). Saya dulu ST_Centroidmembuatnya bekerja.

Hasilnya adalah apa yang saya harapkan dari beberapa poligon atau garis yang centroid berada di luar geometri. Apa yang saya inginkan untuk garis-garis atau poligon adalah untuk mendapatkan "titik paling tengah" tetapi di dalam geometri.

Bagaimana saya bisa melakukan ini? Apakah ada solusinya?

Jose Hermosilla Rodrigo
sumber

Jawaban:

9

Dari dokumen: ST_PointOnSurface - Mengembalikan POINT yang dijamin terletak di permukaan.

WKT
sumber
4
Untuk baris ST_LineInterpolatePoint dengan pecahan 0,5 harus sempurna postgis.net/docs/manual-2.1/ST_LineInterpolatePoint.html
user30184
ST_PointOnSurface () berfungsi dengan Lines! (thx Postgis)
WKT
Iya! Anda benar @ user30184 karena tampaknya untuk baris ST_PointOnSurface () mengambil titik arbitrer, saya tidak yakin tetapi dalam contoh dokumen mengambil titik pertama dari LineString.
Jose Hermosilla Rodrigo
7

Dalam kasus saya, saya memiliki masing-masing geometri dalam tabel disctint. Apa yang saya lakukan adalah:

  1. Untuk garis -> ST_LineInterpolatePoint()dengan 0,5 faktor.
  2. Untuk poligon -> Uji jika ST_Centroid()ada di dalam geometrinya. Jika demikian, ST_Centroid()adalah pilihan terbaik, jika tidak saya pilih PointOnSurface().

Inilah pertanyaannya:

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
Jose Hermosilla Rodrigo
sumber
5
&& operator hanya memeriksa kotak. Anda mungkin ingin menggunakan ST_intersects ().
WKT
Kamu benar. Saya salah. Saya akan memperbarui jawaban saya. Terima kasih!
Jose Hermosilla Rodrigo