Bagaimana ST_PointOnSurface dihitung?

21

Dokumentasi PostGIS menyatakan bahwa ST_PointOnSurfacemengembalikan "TITIK dijamin terletak di permukaan". Sepertinya fungsi ini bisa diimplementasikan secara sepele untuk memberikan hasil yang memuaskan dokumentasi tetapi menyediakan sedikit utilitas dunia nyata, meskipun saya yakin bahwa PostGIS menyediakan implementasi non-sepele.

Pengantar PostGIS ini memberikan perbandingan dan kontras yang bagus ST_Centroiddengan ST_PointOnSurfacedan mengatakan bahwa "[ST_PointOnSurface] jauh lebih mahal secara komputasi daripada operasi centroid".

Apakah ada penjelasan yang lebih menyeluruh tentang bagaimana cara ST_PointOnSurfacemenghitungnya? Saya telah menggunakan ST_Centroid, tetapi telah menemukan beberapa kasus tepi dalam data saya di mana centroid berada di luar geometri. Saya percaya itu ST_PointOnSurfaceadalah pengganti yang tepat, tetapi nama fungsi dan dokumentasi meninggalkan ruang untuk ketidakpastian.

Lebih lanjut, apakah biaya komputasi yang ST_PointOnSurfacedikeluarkan bahkan jika centroid memang berada dalam geometri?

mjobrien
sumber
Itu ada tepat karena centroid poligon non-cembung tidak selalu termasuk di dalamnya. Ini tidak ada hubungannya dengan ketinggian dan DEM jika itu adalah bagian yang membingungkan dari nama. Detail implementasi sebaiknya diperiksa dalam kode, tetapi saya yakin Anda akan mendapatkan jawaban yang lebih baik di GIS.se.
lynxlynxlynx
Poin bagus di GIS.se. Apakah ada cara untuk memigrasi pertanyaan ini di sana? Saya mengerti mengapa kedua fungsi itu ada. Saya menemukan nama membingungkan karena ada banyak poin tak terbatas pada permukaan goemetri poligon yang saya kerjakan. Namun, hanya sebagian kecil dari titik-titik itu yang melayani tujuan saya. Saya ingin tahu saya mendapatkan poin yang masuk akal untuk bagaimana saya ingin menggunakannya.

Jawaban:

24

Berdasarkan beberapa percobaan, saya kira ST_PointOnSurface()bekerja kira-kira seperti ini, jika geometri adalah sebuah poligon:

  1. Lacak sinar timur-barat, terbentang di tengah-tengah antara poligon utara dan selatan.
  2. Temukan segmen sinar terpanjang yang memotong poligon.
  3. Kembalikan titik yang setengah jalan di sepanjang segmen tersebut.

Itu mungkin tidak masuk akal, jadi inilah sketsa poligon dengan sinar yang membaginya menjadi bagian utara dan selatan:

             _
            / \             <-- northern extent
           /   \
          /     \
         /       \
        /         \      __
       /           \    /  \
      /_ _ _ P _ _ _\  / _ _\  P = point-on-surface
     /               \/      \
    /                         \
   /            C              \   C = centroid
  /                             \
 /                              /
/______________________________/  <-- southern extent

Jadi, ST_PointOnSurface()dan ST_Centroid()biasanya titik yang berbeda, bahkan pada poligon cembung.

Satu-satunya alasan "permukaan" dalam nama, saya pikir, adalah bahwa jika geometri memiliki garis 3D maka hasilnya akan menjadi salah satu verteks.

Saya setuju bahwa lebih banyak penjelasan (dan penamaan yang lebih baik) akan bermanfaat dan berharap seorang programmer GEOS dapat menjelaskan lebih banyak tentang masalah ini.

Martin F
sumber
3
Melihat kode libgeos , saya yakin Anda benar. Garis horisontal ditemukan, kemudian titik tengah dari persimpangan terluas digunakan.
mjobrien