2012-04-18 37 views
13

Tôi đang cố gắng sử dụng COPY FROM STDIN để nhập dữ liệu vào bảng của tôi. Một trong các cột trong bảng của tôi có dạng hình học. lệnh của tôi trông giống như thế này ...PostgreSQL COPY FROM STDIN Expressions

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)') 
... 

Tuy nhiên, tôi nghĩ rằng đó là cố gắng để chèn văn bản "ST_GeomFromText ('POINT ..." và thất bại thay vì đánh giá sự biểu hiện và chèn kết quả của biểu thức . có ai biết những gì có thể xảy ra ở đây và làm thế nào tôi có thể nhận được geoms thực tế chèn giá trị

Trả lời

25

Tôi đã có thời gian xấu để tìm cách sao chép/tải dữ liệu hình học vào PostGIS bằng lệnh COPY FROM STDIN, tôi không thể tìm thấy tài liệu chính thức về chủ đề này.

Thay đổi cột trong khi tải trọng số lượng lớn (the ALTER TABLE/SET DATA TYPE/USING) không phải là một tùy chọn đối với tôi vì nó là only supported in PostGIS 2.0+ đối với loại Hình học, cũng không được chấp nhận là use of a temporary table.

Có thực sự là một cách trực tiếp để làm điều đó (ít nhất là trong PostGIS 1.5.2+). Bạn chỉ có thể viết lại các dữ liệu cho tuyên bố bản sao của bạn theo cách này, sử dụng một WKT đơn giản (văn bản nổi tiếng) đại diện cho dữ liệu hình học của bạn:

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) 

Nếu bạn đã áp dụng một chế SRID trên cột hình học bạn' sẽ phải sử dụng cú pháp sau (trong ví dụ này SRID là 4326) được biết đến như EWKT (Extended chữ nổi tiếng, mà là một 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) 

Đóng lưu ý: phải có không gian giữa "POINT "và dấu ngoặc đơn mở" ("hoặc COPY sẽ vẫn trả lại lỗi cho biết dữ liệu hình học của bạn có định dạng không hợp lệ.

+2

Đối với bất kỳ ai chơi cùng ở nhà, điều này cũng sẽ hoạt động cho 'COPY FROM' cho CSV. Điều này sẽ được tài liệu tốt hơn trong PostGIS. Nó đã cho tôi một phần tốt hơn của một buổi chiều để tìm bài viết của bạn. Cảm ơn bạn rất nhiều vì sự đóng góp của bạn. – apocryphalauthor

+0

Vẫn còn giá trị trong năm 2017. Ít nhất tôi có thể tránh chức năng 'wkb_hex' chậm 'shapely'. – Michael

-1

Point trông giống như sau:?. 0101000020E6100000DA722EC555552B40CDCCCCCCCC0C4840

tôi thường giữ latitudelongitude cột trong bảng của tôi và xây dựng không gian dữ liệu có trình kích hoạt.

Tôi không biết cách sao chép POINT s từ stdin nếu không.

2

Bạn có thể bỏ qua chức năng gói văn bản, nhập vào bảng tạm thời với cột văn bản và sau đó chạy INSERT/SELECT vào bảng vĩnh viễn với hàm thực hiện chuyển đổi trong bước đó.

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

Đây là cơ bản những gì tôi đã kết thúc. Tôi thêm dữ liệu vào cột văn bản, tạo cột hình học tạm thời, chuyển đổi dữ liệu, sau đó thả cột cũ và đổi tên cột mới. Không phải là đẹp nhất, nhưng nó hoạt động. – denaje

+1

Nếu bạn định làm điều đó trong một bảng, bạn có thể đơn giản hóa quá trình này một cách đơn giản, bằng cách thay đổi loại cột sử dụng mệnh đề USING cho chuyển đổi .. – kgrittn

+0

Không biết về LOẠI/DỮ LIỆU DỮ LIỆU ALTER/SET DATA TYPE/USING cú pháp! Đẹp hơn nhiều so với việc thêm và xóa cột. – denaje