16

我正在尝试使用 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)')
...

但是,我认为它正在尝试插入文本“ST_GeomFromText('POINT ...”并且失败而不是评估表达式并插入表达式的结果。有谁知道这里可能发生了什么以及我如何获得插入了实际的几何图形?

4

4 回答 4

31

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

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

确实有一种直接的方法可以做到这一点(至少在 PostGIS 1.5.2+ 中)。您可以通过这种方式简单地为您的复制语句重写数据,对您的几何数据使用简单的 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)

如果您在几何列上实施了 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)

结束语:“POINT”和左括号“(”之间不能有空格,否则 COPY 仍会返回错误,说明您的几何数据格式无效。

于 2012-06-21T11:18:37.733 回答
2

您可以省略包装文本的函数,导入到带有文本列的临时表中,然后使用在该步骤中进行转换的函数将 INSERT/SELECT 运行到永久表中。

INSERT INTO "WeatherStations"
  ("Station_ID", "Station_Code", "Station_Name", "Station_Location")
  SELECT "Station_ID", "Station_Code", "Station_Name",
         ST_GeomFromText("Station_Location")
    FROM "TempWeatherStations";
于 2012-04-18T20:17:13.220 回答
0

您将所有值保留在.csv文件中并尝试如下:

CAT /path/file/demo.csv | psql -u <username> -h <localhost> -d<database> 
-c "COPY "WeatherStations" ("Station_ID", "Station_Code", "Station_Name", 
"Station_Location") FROM stdin;"

这将起作用。

于 2018-04-04T12:56:43.450 回答
-1

Point 的值如下所示:0101000020E6100000DA722EC555552B40CDCCCCCCCC0C4840.

我通常在我的表中保留latitudelongitude列,并使用触发器构建空间数据。

我不知道如何POINT从 stdin 复制 s 。

于 2012-04-18T19:57:03.870 回答