PostgreSQL gặp sự cố khi chỉnh sửa điểm / đường / đa giác trong QGIS


14

Tôi có một vấn đề với postgresql và QGIS:

  • Tôi có thể thêm điểm / dòng / đa giác và trường điền

Nhưng tôi không thể:

  • xóa điểm / dòng / đa giác
  • sửa đổi điểm / đường / đa giác (di chuyển hoặc sửa đổi trường)

ex: dbname = 'Europe' host = localhost port = 5432 user = 'postgres' sslmode = vô hiệu hóa khóa = 'tid' valumetadata = true srid = 900913 type = Point table = "public". "hành tinh_osm_point" (cách) sql =

QGIS được kết nối như cấp quản trị viên vào cơ sở dữ liệu. Với pdAdmin III tôi có thể làm tất cả (tạo, xóa, sửa đổi ...)

Cơ sở dữ liệu postgresql được nhập từ OSM với osm2pgsql .

Trên lớp khác, như .shp, tôi không gặp phải vấn đề này.

Bất kỳ ý tưởng ?

Cấu hình: Ubuntu 14.04 / Posgresql 9.4 / QGIS 2.10


Xin chào Mathieu, bạn có thể làm rõ ý nghĩa chính xác của "Tôi không thể". Là các công cụ bị vô hiệu hóa, nó có thất bại trên lớp lưu không? Và quan trọng nhất: có thông báo lỗi không? Cũng có một cái nhìn vào bảng nhật ký tin nhắn trong tab postgis.
Matthias Kuhn

Tôi đang ở chế độ chỉnh sửa cho lớp liên quan (bút màu vàng). Các công cụ chỉnh sửa đều có màu Xám trừ việc thêm biểu tượng thực thể. thông điệp tôi nhận được là: Le dịch vụ uy tín ne supporte pas l'effocation: Le economataire de données ne supporte pas l'effocation des objets
Mathieu

1
thông báo lỗi bằng tiếng Anh: Nhà cung cấp không hỗ trợ xóa: Nhà cung cấp dữ liệu không hỗ trợ xóa các tính năng
Mathieu

1
Chỉnh sửa biểu tượng trên cùng: Tất cả các màu xám EXCEPT Thêm tính năng
Mathieu

1
2015-08-08T12: 10: 22 1 Khóa chính là ctid - thay đổi các tính năng hiện có bị vô hiệu hóa (cách; "công khai". "Planet_osm_point") 2015-08-08T12: 10: 23 1 Khóa chính là ctid - thay đổi các tính năng hiện có bị vô hiệu hóa (cách; "công khai". "hành tinh_osm_line") 2015-08-08T12: 10: 23 1 Loại tính năng hoặc srid cho cách "công khai". "hành tinh_osm_polygon" không thể được xác định hoặc không được yêu cầu.
Mathieu

Câu trả lời:


13

Đã sửa. Vấn đề là không có khóa chính.

Trong pgAdmin làm yêu cầu này.

ALTER TABLE bảng Tên THÊM KHÓA CHÍNH (id);

Ví dụ cho bảng Planet_osm_line và đặt cột osm_id, làm khóa chính:

ALTER TABLE hành tinh_osm_line THÊM KHÓA CHÍNH (osm_id);

cho đến khi osm_id là duy nhất.


Đó là cách bạn làm điều đó!
DPSSpatial

Bạn nghĩ là đúng?
Mathieu

Tôi nghĩ vậy! Tôi có thể kiểm tra nó tại nơi làm việc và báo cáo lại, nhưng bây giờ biết cách bạn nhập dữ liệu, đó là cách giải quyết của bạn. Tuy nhiên, có một vấn đề - tại sao bạn chỉnh sửa dữ liệu này trong QGIS cục bộ thay vì chỉnh sửa dữ liệu trực tiếp trong trình chỉnh sửa OSM và đóng góp lại?
DPSSpatial

1
Về OSM: là bởi vì chúng tôi chỉ cần tạo bản đồ đầu ra với các thông số thiết kế / đồ họa của chúng tôi và thêm một số dữ liệu phải trả tiền khác từ các nhà cung cấp (không thể công khai chúng). QGIS là một công cụ hoàn hảo cho điều đó. Đóng góp là một điều khác, chúng tôi sẽ thực hiện kịp thời.
Mathieu

9

Giải pháp là tạo một khóa chính, như đã đề cập.

Nhưng theo thiết kế, osm2pgsqlkhông đảm bảo rằng đó osm_idlà duy nhất. Nó có thể tạo ra một số hàng với cùng một osm_id .

Để chỉnh sửa planet_osm_*các bảng trong QGIS, chẳng hạn, hãy thêm một cột id khác gid.

Để thêm một gidcột duy nhất :

ALTER TABLE planet_osm_point ADD gid serial PRIMARY KEY;
ALTER TABLE planet_osm_line ADD gid serial PRIMARY KEY;
ALTER TABLE planet_osm_polygon ADD gid serial PRIMARY KEY;
ALTER TABLE planet_osm_roads ADD gid serial PRIMARY KEY;

QGIS có vấn đề nếu cột hình học chỉ là GEOMETRY. Một số truy vấn có thể thất bại. Tôi thấy hữu ích khi thay đổi planet_osm_polygonhình học thành MultiPolygon:

ALTER TABLE planet_osm_polygon
    ALTER COLUMN way TYPE geometry(MultiPolygon,3857) USING ST_Multi(way);

3

Tôi nghĩ rằng đây là một vấn đề quan trọng chính. Bảng của bạn nên có một bảng và được nhận ra khi bạn xem bảng thông qua PGAdmin.

Tôi gặp vấn đề tương tự, nhưng tải lại lớp với trường khóa chính gọi là ID (tùy ý) và tất cả các công cụ chỉnh sửa của tôi hiện đang hoạt động trên thanh công cụ.

Sử dụng SQL, bạn có thể thêm một cột OID có kiểu dữ liệu 'nối tiếp' và tạo khóa chính bằng cách sử dụng câu lệnh này:

ALTER TABLE schema."Tablename"

ADD ID serial NOT NULL

ALTER TABLE schema."Tablename" ADD PRIMARY KEY (id);

Sử dụng GUI, bạn có thể tải lại lớp của mình bằng khóa chính sẽ được cơ sở dữ liệu nhận ra và do đó PostGIS và QGIS:

  • mở Trình quản lý DB
  • kết nối với cơ sở dữ liệu của bạn
  • chọn 'nhập lớp / tệp'
  • đánh dấu vào ô Key Khóa chính 'và nhập tên cho cột' khóa chính 'sẽ lưu ID duy nhất sẽ cho phép chỉnh sửa:

nhập mô tả hình ảnh ở đây

Từ đó, quay lại PGAdmin, kết nối với cơ sở dữ liệu của bạn và nhấp vào bảng bạn vừa tạo lại - bây giờ bạn có thể xem liệu cột OID có được nhận ra không:

nhập mô tả hình ảnh ở đây


Trong PGAdmin không có khóa chính. Làm thế nào để tôi tải lại lớp?
Mathieu

@Mathieu Tôi sẽ sử dụng plugin DBManager trong QGIS và nhấp vào tùy chọn 'khóa chính' và đặt tên trường OBRIID hoặc một cái gì đó tương tự. Điều đó sẽ cho phép bạn có các tính năng có thể chỉnh sửa ... nếu bạn có trường ID duy nhất hiện có mà bạn muốn sử dụng làm khóa chính, bạn luôn có thể đặt lại sau đó ...
DPSSpatial

Tôi chắc chắn bị câm nhưng dưới DBmanager tôi đã không tìm thấy nơi để đặt khóa chính. Trên thực tế tôi có cho "đa giác PlanetOSM" (và những người khác) một cảnh báo nói rằng không có khóa chính.
Mathieu

ok - chỉ cập nhật câu trả lời của tôi, nhưng đó là cách làm GUI ... hãy cho tôi biết nếu nó phù hợp với bạn ...
DPSSpatial

Cảm ơn rất nhiều về thủ tục, và bây giờ tôi hiểu tại sao tôi không thể làm điều đó: cơ sở dữ liệu được nhập bằng osm2pgsql trực tiếp vào postgis từ tệp osm.pbf. Trong bạn thủ tục là một tập tin bên ngoài phải được tải. Trong trường hợp của tôi, cơ sở dữ liệu đã ở trạng thái hậu kỳ và không nói khóa chính như hiển thị trong ảnh chụp màn hình của bạn. Vì vậy, có một cách - khi cơ sở dữ liệu đã được nhập - để tạo theo pssql một khóa chính?
Mathieu
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.