QGIS, Postgis: Kiểu hình học không khớp với loại cột


30

Tôi đang cố gắng nhập một số shapefiles đa giác cho Postgis trong QGIS thông qua SPIT. Một trong số chúng không thể được nhập và trả về lỗi này:

ERROR: Geometry type (Polygon) does not match column type (MultiPolygon)

Tôi đã cố gắng thay đổi thuộc tính "Lớp tính năng" trong bảng đó trong SPIT widnow, từ MULTIPOLYGON sang POLYGON, nhưng không có gì xảy ra.

Có cách nào để khiến Postgis chấp nhận cả hai loại (đa giác và đa giác) không? Hoặc có lẽ bằng cách nào đó tôi có thể chuyển đổi hình học shapefile từ đa giác sang đa giác? Có ý kiến ​​gì không?

Tôi đã thử Qgis 2.0.1 trong Windows và Qgis 2.3 trong ArchLinux.

Câu trả lời:


14

Nhổ nước bọt là không rõ ràng và không được đề nghị nữa. Tôi khuyên bạn nên sử dụng hộp công cụ xử lý và chọn thuật toán "Nhập vào PostGIS". Tôi đã có nhiều may mắn hơn khi sử dụng thói quen đó. Một số điều cần lưu ý:

  • Tham số cơ sở dữ liệu (tên kết nối) phải khớp với những gì bạn đã đặt tên cho kết nối cơ sở dữ liệu của mình từ hộp thoại "Thêm lớp PostGIS".
  • Lược đồ phải tồn tại - nó sẽ không được tạo tự động

Nó hoạt động hoàn hảo. Cảm ơn. Ngoài ra tôi đã tải shapefile này với DB Manager. Đầu tiên tôi đã tải lớp khác bằng Multipolygon bằng SPIT, sau đó tôi ghi đè lên nó bằng lớp POLYGON trong DBM (Nhập lớp / tệp). Nó hoạt động quá.
dmh126

Cơ sở dữ liệu sẽ không hiển thị (ngay cả khi nó có cùng tên trong QGIS 2.10 trên Windows)
Menelaos Kotsollaris

19

Đây có vẻ là một vấn đề đã biết sẽ không được khắc phục: xem http://hub.qgis.org/issues/5328

Nếu bạn cần một cách giải quyết, hãy thử thay đổi loại cột hình học của bảng thành 'hình học' chung:

ALTER TABLE my_table ALTER COLUMN geom SET DATA TYPE geometry;

Sau khi nhập xong, bạn có thể quay lại MultiPolygon:

ALTER TABLE my_table ALTER COLUMN geom 
    SET DATA TYPE geometry(MultiPolygon) USING ST_Multi(geom);

Ngoài ra, hãy thử tải dữ liệu của bạn bằng cách sử dụng ogr2ogr .


nâng cao câu trả lời của bạn @dbaston. nó tốt hơn của tôi :)
sfletche

19

Tôi sử dụng ogr2ogr để tự động hóa việc nhập shapefiles vào cơ sở dữ liệu PostGIS. Cụ thể liên quan đến câu hỏi, sử dụng tùy chọn:

-nlt PROMOTE_TO_MULTI

Điều này sẽ buộc ogr2ogr quảng bá hình học POLYGON lên MULTIPOLYGON, tránh lỗi. Một ví dụ rất đơn giản:

ogr2ogr -f "PostgreSQL" PG:"dbname='<my_db>'" -nlt PROMOTE_TO_MULTI <shapefile>

Tôi đã bỏ qua chi tiết máy chủ / auth pssql. Để bó nhiều shapefile, bạn có thể làm một cái gì đó như:

find ./ -name *.shp | xargs -n1 ogr2ogr <ogr2ogr args omitting the shapefile>

Điều này hoạt động và dễ dàng hơn các câu trả lời khác. Nó xứng đáng được nâng cấp.
Joe Germuska

5

Mặc dù tôi đã cố gắng giải quyết nó bằng thuật toán "Nhập vào PostGis", tôi đã không thành công (cơ sở dữ liệu của tôi không xuất hiện trong danh sách - Tôi đang sử dụng QGIS 2.10).

Thay vào đó, tôi đã sử dụng shp2pgsql , đây là một tác vụ Command Prompt đơn giản như được mô tả dưới đây:

  • Mở Command Prompt ( với tư cách quản trị viên )
  • Truy cập thư mục PostgreSQL / bin trông giống như thế này: C:\Program Files\PostgreSQL\9.4\bin>
  • Chỉ cần sao chép và dán các .shptập tin của bạn vào thư mục này. (Tôi đã sao chép toàn bộ thư mục của mình với .shpcác tập tin của tôi .
  • Trên Dấu nhắc lệnh, hãy nhập như sau: shp2pgsql -s 4326 MyShpDir/MySHPFile.shp> MYSQLFile.sqltrong đó MyShpDirthư mục của bạn, 4326 là SRID của WGS84 để thay đổi nếu bạn đang sử dụng SSID khác, MySHPFile.shptệp cụ thể của bạn ( MYSQLFilesẽ được tạo tự động). Rõ ràng làm điều này cho tất cả các tệp bạn muốn chuyển đổi. Các tập tin sẽ được lưu trong thư mục hiện tại của bạn ( C:\Program Files\PostgreSQL\9.4\bintrong trường hợp của tôi)

Sau đó, chỉ cần sao chép và dán các tệp SQL trong PLQuery DataBase của bạn.

Hơn nữa, một điều thú vị nữa shp2pgsqllà bạn có thể ngay lập tức tạo một chỉ mục trong bảng của mình bằng cách chỉ cần thêm Itham số trong lệnh, như sau:

shp2pgsql -s 4326 -I MyShpDir/MySHPFile.shp> MYSQLFile.sql

Lợi nhuận! :)


3

Có, bạn có thể yêu cầu PostGIS chấp nhận bất kỳ loại hình học nào (đa giác, đa giác, điểm, linestring, v.v.) bằng cách thêm các ràng buộc sau vào bảng của bạn.

Đối với PostGIS 2.x (sử dụng kiểu chữ Hình học chung)

ALTER TABLE my_table ALTER COLUMN geom TYPE geometry(Geometry,4326);

Câu trả lời trước (đối với PostGIS 1.x sử dụng ràng buộc)

CONSTRAINT enforce_geometry_type CHECK (geometrytype(geom) = 'MULTIPOLYGON'::text OR geometrytype(geom) = 'POLYGON'::text OR geom IS NULL)

Lỗi cú pháp tại hoặc gần CONSTRAINT. Tôi đã thử cài đặt CONSTRAINTS nhưng thay vào đó tôi gặp lỗi tương tự gần KIỂM TRA.
dmh126

bạn đang sử dụng phiên bản nào của postgis?
sfletche

Postgis 2.1 cho PostgreSQL 9.3
dmh126

thử sử dụng enforce_geotype_geomchứ không phải enforce_geometry_type. cho tôi biết nếu nó hoạt động, và tôi sẽ chỉnh sửa phản hồi của mình nếu có.
sfletche

Nó không hoạt động. Lỗi tương tự.
dmh126

2

Tôi đã thử giải pháp thuật toán 'Nhập vào PostGIS' nhưng thấy rằng nó cũng không hoạt động. Giải pháp đơn giản nhất tôi tìm thấy là vào Cơ sở dữ liệu > Trình quản lý DB , điều hướng đến cơ sở dữ liệu của bạn và nhấp vào nút Nhập lớp / tệp (mũi tên xuống) .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.