Creare una cerchia in PostGIS?


22

Sto usando PostGIS 1.5.2, con geometrie in SRID: 900913. Ho bisogno di creare un cerchio usando un elenco di punti come centro, con un raggio di 600 chilometri. Sto usando questa query:

INSERT INTO circles (geom) (
   SELECT ST_Buffer(point, 600000, 'quad_segs=8') 
   FROM points
);

Ma i cerchi creati non hanno 600 chilometri di raggio (il raggio è vicino a questa lunghezza, ma non esattamente).

Esistono altri metodi per creare cerchie in PostGIS?

NOTA: le informazioni rappresentate provengono dalla Spagna. La proiezione corretta è 4326, ma il client utilizza i raster di Google, quindi sto archiviando i dati nel 900913 per evitare riproiezioni e aumentare le prestazioni.


1
Come hai misurato i raggi per scoprire che non sono 600 km?
underdark

1
@underdark So che la distanza tra due città e la cerchia generata usando come centro di questa città non si estende ad altre città. Verifico la
angelcervera


@underdark Usando il SELECT ST_Distance( (select point from points where id = 7), (select point from points where id = 42));ritorno più di 100 km di differenza rispetto a gmap-pedometer.com, ma se suppongo che questa lunghezza sia corretta, il raggio del cerchio è perfetto. Ma le persone usano la prima distanza come raggio, nessuna distanza restituita da st_distance. È possibile trasformare la prima distanza in seconda?
angelcervera,

Risposte:


15

Prova questo:

 SELECT ST_Transform(geometry( 
            ST_Buffer(geography( 
                ST_Transform( point, 4326 )), 
                600000)), 
            900913) FROM points`

Questo passa alla geografia, quindi utilizza la selezione SRID integrata per tornare (ironicamente) alla geometria in cui viene eseguito un buon buffer planare, quindi torna indietro. Il problema del tuo approccio in Mercator è che Mercator non mantiene la distanza. L'uso di una proiezione locale più appropriata fornisce risultati migliori, ed è quello che succede nel metodo sopra.


4

Puoi aumentare il valore di quad_seg per ottenere un cerchio più preciso. Per ottenere un cerchio reale devi lavorare con un tipo di geometria curva, ma non so quale software possa mostrarlo.

Anche l'accuratezza di srid 90013 è pessima poiché è una proiezione che copre tutto il mondo.

Otterrai un risultato più accurato con una proiezione locale.


@ nicklas-aven È possibile 100 km di differenza in una distanza di 600 km perché sto usando la proiezione 900913 e non 4326?
angelcervera,

1
sì, è possibile. controlla Pauls commentarla quando non potevo credere a quell'inesattezza gis.stackexchange.com/questions/3264/… . il fatto è che 4326 non è proiettato.
Nicklas Avén,

3

Dipende da dove vengono create le tue cerchie. Sono vicini all'equatore o più vicini ai poli?

Dai un'occhiata a questa mappa . Pensi che l'Antartica o la Groenlandia siano davvero così grandi? Questa è la proiezione che stai usando, giusto?

Ti consiglierei di fare una rapida lettura di questo documento USGS sulle proiezioni , in particolare la tabella seguente che ti dà una rapida idea di quali proiezioni sono buone per cosa.

E dopo tutto ciò, penso che dovrei finalmente rispondere alla tua domanda :)

Quello che Nicklas ha detto è stato un buon consiglio. Esiste una proiezione particolare per la tua zona che funzionerebbe meglio?

Altrimenti potresti voler guardare il nuovo tipo di Geografia PostGIS . Tuttavia, la risposta più appropriata dipende da dove si trovano i tuoi dati.

AGGIORNAMENTO: Da ora sappiamo che i tuoi dati sono in Spagna, hai cercato di memorizzarli in una proiezione locale come UTM Zone 31N , facendo le tue operazioni usando quello e poi proiettandoli di nuovo su Google Web Mercator?


1
+1 per l'utilizzo del tipo geografico per le mappe che coprono grandi aree. il problema qui è che non esiste una funzione buffer nativa per il tipo di geografia in PostGis. ma c'è un cast integrato per "best srid", costruendo il buffer e poi di nuovo a 4326. Quindi conoscere i tuoi dati e scegliere manualmente uno srid offre un controllo migliore.
Nicklas Avén,

Nicklas, hai ragione sul casting e sono d'accordo con te al 100% sulla proiezione locale (cioè conoscendo i tuoi dati). Tuttavia, se la risposta è che vuole solo avere dati "in tutto il mondo", IMHO, la logica di fusione all'interno del tipo Geografia farà un lavoro molto migliore nel capire quale SR è appropriato per quella particolare operazione a distanza piuttosto che qualsiasi altro logica personalizzata complicata. Un'altra cosa positiva del tipo di geografia è che sebbene molte delle operazioni siano attualmente affidate alla matematica cartesiana, le operazioni continuano ad essere aggiornate per usare la matematica della sfera.
Ragi Yaser Burhum,

2

È possibile utilizzare il nuovo tipo di geometria SQL / MM Parte 3 CIRCULARSTRING e / o CURVEPOLYGON.

Tuttavia, tieni presente che il supporto per questo tipo è limitato, sia con funzioni interne che con programmi esterni. Puoi usare ST_CurveToLine per aiutarti a visualizzarlo.

Inoltre, è un po 'scoraggiante (a partire da PostGIS 2.0 svn) che SELECT ST_Area('CURVEPOLYGON(CIRCULARSTRING(2 1, 1 2, 0 1, 1 0, 2 1))'::geometry)è solo una approssimazione approssimativa di π . (Confronta da 3.14033115695475 a 3.14159265358979 da pi()).


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.