2012-04-18 29 views
13

COPY FROM STDINを使用してテーブルにデータをインポートしようとしています。私のテーブルの列の1つはジオメトリタイプです。私のコマンドは、しかし、私は「... ST_GeomFromText( 'POINT」テキストを挿入しようとすると、式を評価し、式の結果を挿入するのではなく、失敗していると思います。このような何か...PostgreSQL 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)') 
... 

に見えます。誰もがここで起こっかもしれないものを知っていて、私は実際のgeomが挿入され得ることができる方法

答えて

25

私はSTDINコマンドからCOPYを使用してPostGISのにどのように一括コピー/ロードジオメトリデータに考え出すの悪い時間を過ごして、私はこのトピックに関する公式ドキュメントを見つけることができませんでした。

バルクロード(the ALTER TABLE/SET DATA TYPE/USING)中の列の変更は、ジオメトリタイプの場合はonly supported in PostGIS 2.0+であり、use of a temporary tableでは許容されなかったため、私にとってはオプションではありませんでした。

実際には(少なくとも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制約を施行している場合」を

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) 

閉会ノート:EWKT(PostGIS specific formatある拡張well-knownテキスト、)として知られている、次の構文を(この例では、SRIDが4326である)を使用することがあるでしょうPOINT」の間にスペースがあってはなりません"と開き括弧"( "、またはCOPYは、ジオメトリデータが無効な形式であるとエラーを返します。

+2

家で遊んでいる人にとっては、これはCSVの 'COPY FROM'でも有効です。 これはPostGISでよりよく説明されています。あなたの投稿を見つけるためには、午後のほうが良いところでした。あなたの貢献に感謝します。 – apocryphalauthor

+0

まだ有効です2017.少なくとも私は 'shapely'の遅い' wkb_hex'関数を避けることができます。 – Michael

-1

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

私は通常私のテーブルにlatitudelongitude列を維持し、空間を構築しますトリガーのあるデータ

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

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"; 
+0

これは基本的に私がやったことです。データをテキスト列に追加し、一時的なジオメトリ列を作成し、データを変換してから、古い列を削除して新しい列の名前を変更します。一番きれいではありませんが、それは機能します。 – denaje

+1

これを1つのテーブルで行う場合は、変換にUSING句を使用して列の型を変更することで、プロセスをわずかに簡素化できます。 – kgrittn

+0

ALTER TABLE/SET DATA TYPE/USING構文!列の追加と削除よりもずっときれいです。 – denaje

関連する問題