16

COPYFROMSTDINを使用してデータをテーブルにインポートしようとしています。私のテーブルの列の1つは、geometry型です。私のコマンドは次のようになります...

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 FROMSTDINコマンドを使用してジオメトリデータをPostGISに一括コピー/ロードする方法を理解するのに苦労しました。このトピックに関する公式のドキュメントは見つかりませんでした。

バルクロード中に列を変更する(ALTER TABLE / SET DATA TYPE / USING )は、ジオメトリタイプのPostGIS 2.0+でのみサポートされており、一時テーブルの使用も受け入れられなかったため、私にはオプションではありませんでした。

確かにそれを行う直接的な方法があります(少なくともPostGIS 1.5.2+では)。ジオメトリデータの単純なWKT(Well-known text)表現を使用して、この方法でコピーステートメントのデータを簡単に書き換えることができます。

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制約を適用した場合は、EWKT(PostGIS固有の形式であるExtended Well-Known Text)と呼ばれる次の構文(この例ではSRIDは4326)を使用する必要があります。

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

ポイントの値は次のようになります0101000020E6100000DA722EC555552B40CDCCCCCCCC0C4840

私は通常、テーブルに列を保持latitudeし、トリガーを使用して空間データを作成します。longitude

POINTそれ以外の場合、stdinからsをコピーする方法がわかりません。

于 2012-04-18T19:57:03.870 に答える