2012-04-18 2 views
13

Sto tentando di utilizzare COPY FROM STDIN per importare dati nella mia tabella. Una delle colonne nella mia tabella è di tipo geometria. Mio comando simile a questa ...PostgreSQL COPY FROM STDIN Expressions

COPY "WeatherStations" ("Station_ID", "Station_Code", "Station_Name", "Station_Location") FROM stdin; 
1  KAVP WILKES-BARRE ST_GeomFromText('POINT(41.338055 -75.724166)') 
2  KOKV WINCHESTER  ST_GeomFromText('POINT(39.143333 -78.144444)') 
3  KSHD SHENANDOAH  ST_GeomFromText('POINT(38.263611 -78.896388)') 
... 

Tuttavia, penso che sta tentando di inserire il testo "ST_GeomFromText ('PUNTO ..." e non riuscendo invece di valutare l'espressione e inserendo il risultato dell'espressione . qualcuno sa cosa potrebbe essere in corso qui e come posso ottenere i GEOMs effettivi inseriti valore

risposta

25

ho avuto un brutto momento per capire come i dati geometrici copia/caricamento di massa in PostGIS usando il comando COPY FROM STDIN, non riuscivo a trovare documentazione ufficiale su questo argomento.

Alterare la colonna durante il carico di massa (the ALTER TABLE/SET DATA TYPE/USING) non era un'opzione per me perché è only supported in PostGIS 2.0+ per il tipo Geometry, né era accettabile il use of a temporary table.

Esiste davvero un modo diretto per farlo (almeno in PostGIS 1.5.2+). Si può semplicemente riscrivere i dati per la sua dichiarazione la copia in questo modo, utilizzando un semplice WKT (Testo ben noto) la rappresentazione per i dati Geometria:

1  KAVP WILKES-BARRE POINT(41.338055 -75.724166) 
2  KOKV WINCHESTER  POINT(39.143333 -78.144444) 
3  KSHD SHENANDOAH  POINT(38.263611 -78.896388) 

Se è stato imposto un vincolo SRID sulla colonna di geometria' ll deve utilizzare la seguente sintassi (in questo esempio lo SRID è 4326), noto come EWKT (Extended Testo Well-Known, che è un PostGIS specific format):

1  KAVP WILKES-BARRE SRID=4326;POINT(41.338055 -75.724166) 
2  KOKV WINCHESTER  SRID=4326;POINT(39.143333 -78.144444) 
3  KSHD SHENANDOAH  SRID=4326;POINT(38.263611 -78.896388) 

chiusura nota: ci deve essere spazio tra "PUNTO "e la parentesi aperta" (", o il COPY restituirà ancora un errore dicendo che i dati della geometria hanno un formato non valido.

+2

Per chi gioca a casa, funziona anche per 'COPY FROM' per CSV. Questo dovrebbe essere meglio documentato in PostGIS. Mi ci è voluta una parte migliore di un pomeriggio per trovare il tuo post. Grazie mille per il tuo contributo. – apocryphalauthor

+0

Ancora valido nel 2017. Almeno posso evitare la funzione 'wkb_hex' di' shapely'. – Michael

-1

Point simile a questa:?. 0101000020E6100000DA722EC555552B40CDCCCCCCCC0C4840

io di solito tenere latitude e longitude colonne nelle mie tabelle e costruire spaziale dati con trigger

Non so come copiare POINT da stdin altrimenti.

2

È possibile omettere la funzione che avvolge il testo, importarlo in una tabella temporanea con colonna di testo e quindi eseguire INSERT/SELECT nella tabella permanente con la funzione che esegue la conversione in tale passaggio.

INSERT INTO "WeatherStations" 
    ("Station_ID", "Station_Code", "Station_Name", "Station_Location") 
    SELECT "Station_ID", "Station_Code", "Station_Name", 
     ST_GeomFromText("Station_Location") 
    FROM "TempWeatherStations"; 
+0

Questo è fondamentalmente quello che ho finito per fare. Aggiungo i dati in una colonna di testo, creo una colonna geometrica temporanea, converti i dati, quindi rilascia la vecchia colonna e rinomina quella nuova. Non è il più bello, ma funziona. – denaje

+1

Se lo farai in una tabella, potresti semplificare leggermente il processo, penso, alterando il tipo di colonna usando la clausola USING per la conversione. – kgrittn

+0

Non sapevo ALTER TABLE/SET DATA TYPE/USING sintassi! Molto più carino dell'aggiunta e rimozione di colonne. – denaje