Problemy z edycją punktów / linii / wielokątów w PostgreSQL w QGIS

15

Mam problem z Postgresql i QGIS:

  • Mogę dodawać punkty / linie / wielokąty i pola wypełnienia

Ale nie mogę:

  • usuń punkty / linie / wielokąty
  • modyfikuj punkty / linie / wielokąty (przesuń lub zmodyfikuj pole)

np .: dbname = 'Europa' host = port lokalny host = 5432 użytkownik = 'postgres' sslmode = wyłącz klucz = 'tid' szacowanymetadata = prawda srid = 900913 typ = Tabela punktów = „publiczny”. „planet_osm_point” (sposób) sql =

QGIS jest podłączony jako poziom administratora do bazy danych. Dzięki pdAdmin III mogę zrobić wszystko (tworzyć, usuwać, modyfikować ...)

Baza danych postgresql jest importowana z OSM za pomocą osm2pgsql .

Na innej warstwie, takiej jak .shp, nie mam tego problemu.

Dowolny pomysł ?

Konfiguracja: Ubuntu 14.04 / Posgresql 9.4 / QGIS 2.10

Mathieu
źródło
Cześć Mathieu, czy możesz wyjaśnić dokładne znaczenie „nie mogę”. Czy narzędzia są dezaktywowane, czy nie zapisuje się w warstwie składowania? I najważniejsze: czy pojawia się komunikat o błędzie? Zobacz także panel dziennika wiadomości na karcie postgis.
Matthias Kuhn
offcourse Jestem w trybie edycji do odpowiedniej warstwy (żółty długopis). Wszystkie narzędzia do edycji są szare, z wyjątkiem dodawania ikony bytu. wiadomość, którą otrzymuję, brzmi: Usługa serwisowa obsługiwana przez: Usługa informacyjna wspierająca organizację
Mathieu
1
komunikat o błędzie w języku angielskim: Dostawca nie obsługuje usuwania: Dostawca danych nie obsługuje usuwania funkcji
Mathieu
1
Edycja górnej ikony: Wszystkie szare Z WYJĄTKIEM Dodaj funkcję
Mathieu
1
2015-08-08T12: 10: 22 1 Klucz podstawowy to ctid - zmiana istniejących funkcji wyłączona (sposób; „public”. „Planet_osm_point”) 2015-08-08T12: 10: 23 1 Klucz podstawowy to ctid - zmiana istniejących funkcji disabled (way; „public”. „planet_osm_line”) 2015-08-08T12: 10: 23 1 Typ lub srid elementu dla sposobu „public”. „Planet_osm_polygon” nie mógł zostać określony lub nie został zgłoszony.
Mathieu,

Odpowiedzi:

13

Naprawiony. Problem polegał na tym, że nie ma klucza podstawowego.

W pgAdmin zrób to żądanie.

ALTER TABLE tableName ADD PRIMARY KEY (id);

Przykład tabeli planet_osm_line i ustawienia kolumny osm_id jako klucza podstawowego:

ALTER TABLE planet_osm_line DODAJ KLUCZ PODSTAWOWY (osm_id);

dopóki osm_id jest unikalny.

Mathieu
źródło
Tak to robisz!
DPSSpatial
Myślisz, że ma rację?
Mathieu
Chyba tak! Mogę to przetestować w pracy i złożyć raport, ale teraz wiem, jak zaimportowałeś dane, to jest twoje obejście. Jeden problem - dlaczego edytujesz te dane lokalnie w QGIS zamiast edytować dane bezpośrednio w edytorze OSM i odsyłać je z powrotem?
DPSSpatial
1
O OSM: ponieważ musimy wygenerować mapę wyników z naszymi specyfikacjami projektowymi / graficznymi i dodać inne płatne dane od dostawców (nie jest możliwe podanie ich do wiadomości publicznej). QGIS jest do tego idealnym narzędziem. Wnoszenie wkładu to inna sprawa, że ​​zrobimy to na czas.
Mathieu
10

Rozwiązaniem jest utworzenie klucza podstawowego, jak już wspomniano.

Ale z założenia osm2pgsqlnie gwarantuje, że osm_idjest wyjątkowy. Może wygenerować kilka wierszy o tym samym osm_id .

Aby edytować planet_osm_*tabele w QGIS, dobrze jest na przykład dodać kolejną kolumnę id, na przykład gid.

Aby dodać unikalną gidkolumnę:

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 ma problemy, jeśli kolumna geometrii to po prostu GEOMETRIA. Niektóre zapytania mogą się nie powieść. Przydało mi się zmienić planet_osm_polygongeometrię na MultiPolygon:

ALTER TABLE planet_osm_polygon
    ALTER COLUMN way TYPE geometry(MultiPolygon,3857) USING ST_Multi(way);
jgrocha
źródło
3

Myślę, że to podstawowy problem. Twój stół powinien go mieć i jest rozpoznawany, gdy przeglądasz go za pomocą PGAdmin.

Miałem ten sam problem, ale ponownie załadowałem warstwę za pomocą pola klucza podstawowego o nazwie ID (dowolne), a wszystkie moje narzędzia edycji są teraz aktywne na pasku narzędzi.

Za pomocą SQL można dodać kolumnę OID typu danych „serial” i utworzyć klucz podstawowy za pomocą tej instrukcji:

ALTER TABLE schema."Tablename"

ADD ID serial NOT NULL

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

Za pomocą GUI możesz ponownie załadować warstwę za pomocą klucza podstawowego, który zostanie rozpoznany przez bazę danych, a tym samym PostGIS i QGIS:

  • otwórz DB Managera
  • połącz się z bazą danych
  • wybierz „importuj warstwę / plik”
  • zaznacz pole „Klucz podstawowy” i wprowadź nazwę kolumny „klucz podstawowy”, w której będą przechowywane unikalne identyfikatory umożliwiające edycję:

wprowadź opis zdjęcia tutaj

Stamtąd wróć do PGAdmin, połącz się z bazą danych i kliknij tabelę, którą właśnie utworzyłeś - możesz teraz zobaczyć, czy kolumna OID jest rozpoznawana:

wprowadź opis zdjęcia tutaj

DPSSpatial
źródło
W PGAdmin nie ma klucza podstawowego. Jak ponownie załadować warstwę?
Mathieu,
@Mathieu Chciałbym użyć wtyczki DBManager w QGIS i kliknąć opcję „klucza podstawowego” i nazwać pole OBJECTID lub coś podobnego. To powinno pozwolić ci na edytowalne funkcje ... jeśli masz istniejące unikalne pole identyfikatora, którego chcesz użyć jako klucza podstawowego, zawsze możesz go ponownie ustawić później ...
DPSSpatial
Z pewnością jestem głupi, ale pod DBmanagerem nie znalazłem, gdzie ustawić klucz podstawowy. Właściwie mam dla „wielokąta planetOSM” (i innych) ostrzeżenie, że nie jest to klucz podstawowy.
Mathieu,
ok - właśnie zaktualizowałem moją odpowiedź, ale jest to sposób GUI ... daj mi znać, jeśli to działa dla ciebie ...
DPSSpatial
Wielkie dzięki za procedurę, a teraz rozumiem, dlaczego nie mogę tego zrobić: baza danych jest importowana za pomocą osm2pgsql bezpośrednio do postgis z pliku osm.pbf. W tobie jest zewnętrzny plik, który należy załadować. W moim przypadku baza danych jest już w postgis i nie mówi klucza podstawowego, jak pokazano na zrzucie ekranu. Czy istnieje sposób - gdy baza danych jest już zaimportowana - wygenerowanie w pgsql klucza podstawowego?
Mathieu