Come viene calcolato ST_PointOnSurface?


21

La documentazione di PostGIS afferma che ST_PointOnSurfacerestituisce "un PUNTO garantito in superficie". Sembra che questa funzione possa essere banalmente implementata per dare risultati che soddisfino la documentazione ma forniscano poca utilità nel mondo reale, anche se sono certo che PostGIS fornisca un'implementazione non banale.

Questa introduzione a PostGIS fornisce un buon confronto e contrasto ST_Centroidcon ST_PointOnSurfacee afferma che "[ST_PointOnSurface] è sostanzialmente più costoso dal punto di vista computazionale rispetto all'operazione centroide".

C'è una spiegazione più approfondita di come ST_PointOnSurfaceviene calcolata? Ho usato ST_Centroid, ma ho riscontrato alcuni casi limite nei miei dati in cui il centroide è al di fuori della geometria. Credo che ST_PointOnSurfacesia il sostituto corretto, ma il nome e la documentazione della funzione lasciano spazio all'incertezza.

Inoltre, la spesa computazionale è ST_PointOnSurfacesostenuta anche se il centroide giace già all'interno della geometria?


Esiste proprio perché il centroide dei poligoni non convessi non è sempre incluso in esso. Non ha nulla a che fare con altezze e DEM se questa è la parte confusa del nome. I dettagli di implementazione sono meglio verificati nel codice, ma credo che otterresti una risposta migliore su GIS.se.
lynxlynxlynx,

Buon punto su GIS.se. C'è un modo per migrare questa domanda lì? Capisco perché entrambe le funzioni esistono. Trovo il nome confuso perché ci sono infiniti punti sulla superficie dei poligonali con cui sto lavorando. Tuttavia, solo un piccolo sottoinsieme di questi punti serve al mio scopo. Voglio sapere che sto ottenendo un punto che ha senso per come voglio usarlo.

Risposte:


24

Sulla base di alcuni esperimenti, penso che ST_PointOnSurface()funzioni più o meno in questo modo, se la geometria è un poligono:

  1. Traccia un raggio est-ovest, che si trova a metà strada tra le estensioni nord e sud del poligono.
  2. Trova il segmento più lungo del raggio che interseca il poligono.
  3. Restituisce il punto che si trova a metà strada lungo detto segmento.

Questo potrebbe non avere senso, quindi ecco uno schizzo di un poligono con un raggio che lo divide in una parte settentrionale e una meridionale:

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

Quindi, ST_PointOnSurface()e di ST_Centroid()solito sono punti diversi, anche su poligoni convessi.

L'unica ragione per la "superficie" nel nome, penso, è che se la geometria ha linee 3D, il risultato sarà semplicemente uno dei vertici.

Concordo sul fatto che ulteriori spiegazioni (e una migliore denominazione) sarebbero state utili e spero che un programmatore GEOS possa far luce sulla questione.


3
Guardando il codice libgeos , credo che tu abbia ragione. Viene trovata la bisettrice orizzontale, quindi viene utilizzato il punto medio dell'intersezione più ampia.
mjobrien,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.