2012-04-18 24 views
13

我正在嘗試使用COPY FROM STDIN將數據導入到我的表中。我的表格中的一列是幾何類型。我的命令看起來是這樣的......PostgreSQL COPD 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 ...」和失敗,而不是計算表達式和插入表達式的結果。有誰知道什麼可能怎麼回事,我如何才能得到實際的geoms插入

回答

25

我有一個壞的時間搞清楚如何批量複製/負載幾何形狀數據轉換成使用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約束將不得不使用以下語法(在這個例子中,SRID是4326)被稱爲EWKT(擴展的熟知文本,這是一個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) 

閉注:必須有點之間」沒有空間「和左括號」(「,或COPY仍然會返回錯誤,表示您的幾何數據格式無效。

+2

對於任何在家裏玩的人來說,這也適用於CSV的「COPY FROM」。 這應該在PostGIS中更好地記錄。我花了一個下午的好時間找到你的帖子。非常感謝你的貢獻。 – apocryphalauthor 2013-10-18 19:59:59

+0

在2017年仍然有效。至少我可以避免'體形''慢'wkb_hex'功能。 – Michael 2018-01-22 12:14:24

-1

點的價值看起來是這樣的:?0101000020E6100000DA722EC555552B40CDCCCCCCCC0C4840

我通常保持latitudelongitude列在我的表,並建立空間數據與觸發器

我不知道如何從stdin複製POINT s否則。

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 2012-04-18 22:52:15

+1

如果你打算在一張表中做到這一點,我想可以通過使用USING子句改變列類型來簡化這個過程。 – kgrittn 2012-04-19 12:08:41

+0

不知道ALTER TABLE/SET DATA TYPE/USING句法!比添加和刪除列要漂亮多了。 – denaje 2012-04-23 18:21:34