PostgreSQL从STDIN表达式复制

ely*_*aie 16 postgresql postgis

我试图使用COPY FROM STDIN将数据导入到我的表中.我表中的一列是几何类型.我的命令看起来像这样......

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)')
...
Run Code Online (Sandbox Code Playgroud)

不过,我认为它正试图插入文本"ST_GeomFromText('POINT ...",而是未能计算表达式和插入表达式的结果的.有谁知道什么可能怎么回事,我怎么能得到插入实际的geoms?

Ful*_*vio 30

我很难弄清楚如何使用COPY FROM STDIN命令将几何数据批量复制/加载到PostGIS中,我找不到关于此主题的官方文档.

在批量加载期间更改列(ALTER TABLE/SET DATA TYPE/USING)对我来说不是一个选项,因为它仅在PostGIS 2.0+中支持 Geometry类型,也不能使用临时表.

确实有一种直接的方法(至少在PostGIS 1.5.2+中).您只需使用Geometry数据的简单WKT(已知文本)表示,就可以通过这种方式重写复制语句的数据:

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)
Run Code Online (Sandbox Code Playgroud)

如果您在几何列上强制执行SRID约束,则必须使用以下语法(在此示例中SRID为4326),称为EWKT(扩展的已知文本,这是PostGIS特定格式):

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)
Run Code Online (Sandbox Code Playgroud)

结束注释:"POINT"和左括号"("之间必须没有空格,否则COPY仍会返回错误,表示您的几何数据格式无效.

  • 对于在家里玩的任何人来说,这也适用于CSV的"COPY FROM".这应该在PostGIS中更好地记录.我花了一个下午的时间来找到你的帖子.非常感谢您的贡献. (2认同)