2010-03-26 8 views
31

Sto provando a caricare un gruppo di coppie di latitudine/longitudine in un tipo di geografia PostGIS in modo da poter eseguire query per posizione.Come si converte una coppia di latitudine/longitudine in un tipo di geografia PostGIS?

In particolare, ho una tabella con colonne di latitudine e longitudine flottante e una colonna geography(Point, 4326). Vorrei fare

update mytable set geography = ??? 

La documentazione sembra suggerire che il seguente dovrebbe funzionare:

update mytable set geography = ST_GeogFromText('POINT(' || latitude || ' ' || 
                  longitude || ')'); 

E non lo fa. Non so cosa significhi interpretare questo punto, ma consente solo la longitudine di trovarsi tra -90 e 90, quindi non è chiaramente una longitudine.

Quindi, cosa devo fare?

+1

email l'elenco o andare su irc.freenode.net #postgis – dassouki

+0

Sono in #postgis. È silenzioso. Inviare la lista è il mio prossimo punto di riferimento. – DRMacIver

risposta

36

... sigh. Stupidità da parte mia. Apparentemente l'ordine corretto è longitudine, latitudine. Sono stato indotto a pensare che entrambe le coordinate avessero lo stesso intervallo (da -180 a 180), quindi ho pensato che stesse succedendo qualcosa di più sottile.

+7

longitudine, l'ordinamento della latitudine introduce sicuramente molti bug. – kbrock

+0

Questa è ancora una risposta orribile e dovresti aver accettato il consiglio di @MikeT con ST_MakePoint invece della concatenazione di stringhe che introduce errori di arrotondamento. –

+2

Vuoi dire quelli fatti tre e quattro anni dopo che ho postato la domanda e molto tempo dopo non ho più avuto il problema? – DRMacIver

5

Per eseguire lo scambio tra lat e lng si può usare:

update mytable set geography = ST_GeographyFromText('SRID=4326;POINT(' || st_x(geom) || ' ' || st_y(geom) || ')'); 

con o senza SRID.

+0

Questo metodo presenterà alcuni errori di arrotondamento con perdita (ad esempio, 'float8' →' testo' → 'float8'). Inoltre, 'ST_X' funziona solo con i tipi di geometria' POINT'. –

7

Ecco alcuni modi per rendere i tipi di geografia:

  1. Converti numerici long e lat colonne a un tipo geog geografia:

    UPDATE mytable SET geog = ST_SetSRID(ST_MakePoint(long, lat), 4326)::geography 
    
  2. Convert una colonna geom geometria (SRID=4326) ad un Tipo di geografia geog utilizzando un cast semplice:

    UPDATE mytable SET geog = geom::geography 
    
  3. trasformare una colonna geom geometria proiettata a un tipo geog geografia:

    UPDATE mytable SET geog = ST_Transform(geom, 4326)::geography 
    

nota che gli ultimi due esempi funzionano su qualsiasi tipo di geometria. Inoltre, la conversione dalla geometria alla geografia è spesso implicita e questi esempi funzionano senza ::geography, tuttavia i cast espliciti sono di solito una buona pratica per queste cose.

Problemi correlati