Selezione mediante riquadro di selezione con PostGIS


12

Ho un grande set di dati in un database PostGIS. Lo sto visualizzando tramite un'interfaccia web che carica i dati come GeoJSON. Ci sono troppi dati per fornire al client tutto in una volta (vale 10 decine di MB ...), quindi vorrei ottenere un'area di dati all'interno del riquadro di delimitazione formato dai bordi della finestra (la linea tratteggiata nell'immagine seguente ). Ottenere le coordinate per i punti feg è facile.

Domanda 1: è un buon modo di fare le cose? Dovrei pensare di memorizzarli nella cache come riquadri o è probabile che questo metodo sia abbastanza efficace?

Domanda 2: Come posso recuperare solo i dati all'interno di questo rettangolo di selezione?

Domanda 3: se una forma si sovrappone al bordo del rettangolo di selezione (ad es. Forma A in basso), esiste un modo semplice per ritagliarla mentre viene interrogata come nella seconda immagine?

inserisci qui la descrizione dell'immagine


Quale visualizzatore stai eseguendo sul client?
underdark

Mapstraction. Attualmente sto usando OpenLayers come provider.
Mr_Chimp,

Risposte:


8

basta cambiare l'ordine delle domande e hai una procedura:

2) Seleziona solo ciò che interseca bbox ( ST_Intersects).
3) Intersecalo con la bbox per tagliare i poligoni ( ST_Intersection).
1) Crea una nuova tabella con i risultati ( CREATE TABLE newtable AS SELECT...).

I documenti ST_Intersection contengono un esempio di codice. Dovrai adattarlo e utilizzare ST_PolygonFromText come bbox.


4

Penso che la maggior parte (tutti) i client Web (e anche i desktop gis) lo stiano facendo. Non è possibile inviare l'intero set di dati.

Se è necessario impostare una sorta di memorizzazione nella cache dipende dal fatto che i dati siano statici variabili o che stiano cambiando.

Per rendere questa casella di delimitazione selezionare per ottenere i dati sarà molto veloce (se si dispone di un indice spaziale), ma ovviamente non è gratuito. Pagherai con un po 'di potere cpu.

Come detto prima: per trovare i poligoni nella tua estensione, usi ST_Intersects.

Per ottenere solo la parte all'interno della tua estensione usa ST_Intersection, ma non farlo. ST_Intersection è un processo costoso. A meno che tu non abbia poligoni estremamente grandi, penso che sia meglio inviare interi poligoni.

Ma immagino che tu voglia farlo al volo invece di metterlo in un tavolo

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.