2012-04-18 10 views
13

Estoy intentando usar COPY FROM STDIN para importar datos en mi tabla. Una de las columnas en mi tabla es de tipo geometría. Mi mando se ve algo como esto ...PostgreSQL COPY FROM STDIN Expresiones

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)') 
... 

Sin embargo, creo que está tratando de insertar el texto "ST_GeomFromText (" punto de ..." y no en lugar de evaluar la expresión e insertando el resultado de la expresión . ¿alguien sabe qué podría estar pasando aquí y cómo puedo conseguir el Geoms reales insertan valor

Respuesta

25

que tenían un mal momento encontrar la manera de copia de datos de la geometría/carga a granel en PostGIS utilizando el comando COPIA DE STDIN, no pude encontrar documentación oficial sobre este tema.

La alteración de la columna durante la carga a granel (the ALTER TABLE/SET DATA TYPE/USING) no era una opción para mí porque es only supported in PostGIS 2.0+ para el tipo de geometría, ni era aceptable el use of a temporary table.

De hecho, hay una manera directa de hacerlo (al menos en PostGIS 1.5.2+). simplemente Puede volver a escribir los datos para su declaración copia de esta manera, el uso de un WKT sencilla (conocido texto) la representación de los datos de geometría:

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) 

Si ha aplicado una restricción SRID en la columna de la geometría que' Tendrá que utilizar la siguiente sintaxis (en este ejemplo el SRID es de 4326), conocido como EWKT (Extended texto notoriamente conocida, que es 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) 

cierre nota: no debe haber ningún espacio entre "PUNTO "y el paréntesis de apertura" (", o el COPY aún devolverá el error indicando que los datos de su geometría tienen un formato no válido.

+2

Para cualquiera que esté jugando en casa, esto también funcionará para 'COPY FROM' para CSV. Esto debería estar mejor documentado en PostGIS. Me llevó una buena parte de una tarde encontrar tu publicación. Muchas gracias por su contribución. – apocryphalauthor

+0

Aún válido en 2017. Al menos puedo evitar la función lenta 'wkb_hex' de' shapely'. – Michael

-1

de Punto ve algo como esto:?. 0101000020E6100000DA722EC555552B40CDCCCCCCCC0C4840

me suelen mantener latitude y longitude columnas en mis tablas y construir espacial datos con factores desencadenantes

No sé cómo copiar POINT s de stdin en caso contrario.

2

Puede omitir la función que envuelve el texto, importar en una tabla temporal con columna de texto y luego ejecutar INSERT/SELECT en la tabla permanente con la función que realiza la conversión en ese paso.

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

Esto es básicamente lo que terminé haciendo. Agrego los datos en una columna de texto, creo una columna de geometría temporal, convierto los datos, luego dejo caer la columna anterior y renombro la nueva. No es el más bonito, pero funciona. – denaje

+1

Si va a hacer eso en una tabla, puede simplificar el proceso ligeramente, creo, alterando el tipo de columna usando la cláusula USING para la conversión. – kgrittn

+0

No sabía acerca de ALTER TABLE/SET DATA TYPE/USING ¡sintaxis! Mucho más bonito que agregar y eliminar columnas. – denaje