Forum QGIS

Pełna wersja: Uzupełnianie geometrii oraz praca sieciowa.
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Witam,

1. Uzupełnianie geometrii.
Mam tabelę w PostGis, w której geometria obiektów nie jest kompletna, tzn są obiekty z geometria NULL. Pod QGIS chcę uzupełnić geometrię tym obiektom. Okazuje się, że QGIS nie daje takiej możliwości, gdyż w tabeli atrybutów nie pojawiają się rekordy z pustą geometrią. Jeżeli jest na to rozwiązanie, to bardzo proszę o przepis. W Internecie temat wygląda na nierozwiązany.

2. Praca w sieci.
Sprawa również dotyczy PostGis-a. W momencie rozpoczęcia edycji rekordu, nie jest zakładana blokada w bazie danych na ten rekord (Select for update). W rezultacie użytkownik QGIS-a nie wie, że dany rekord jest już modyfikowany przez innego użytkownika (w tym z poziomu innej aplikacji). To samo jest w drugą stronę. Inna aplikacja też nie wie, że rekord jest modyfikowany przez QGIS. W rezultacie prowadzi to do nieprawidłowości w danych.

Proszę osoby mające bliższy kontakt z twórcami QGIS o zasygnalizowanie w/w problemów.

Pozdrawiam
Ad1. Z poziomu postgresa uzupełnij puste pole geometrii jakąś wartością z innego obiektu, który geometrie posiada. W QGISie zobaczysz ten obiekt dokładnie w tym samym miejscu, z którego skopiowałeś geometrię i będziesz mógł już ją modyfikować.
Ad2. Są/były jakieś wtyczki ułatwiające pracę zbiorową w QGISie (pgVersion?) ale faktycznie przydałaby się taka standardowa funkcjonalność. Być może mechanizmy z bazy danych MVCC będą tu pomocne.
Pozdrawiam!
Witam.

Dzięki za odpowiedź.

Ad.1.
W międzyczasie problem opisany w tym punkcie rozwiązałem poprzez trigger o następującej składni:

CREATE OR REPLACE FUNCTION kb_trigger()
RETURNS trigger AS
$body$
DECLARE
Dok integer;
BEGIN
IF TG_OP='INSERT' THEN
IF NEW.geom_plg IS NULL
THEN
NEW.geom_plg := ST_GeomFromText('MULTIPOLYGON EMPTY');
END IF;

IF NEW.geom_wln IS NULL
THEN
NEW.geom_wln := ST_GeomFromText('MULTILINESTRING EMPTY');
END IF;

IF NEW.geom_pkt IS NULL
THEN
NEW.geom_pkt := ST_GeomFromText('MULTILIPOINT EMPTY');
END IF;

END IF;
RETURN NEW;
END;
$body$
LANGUAGE plpgsql;
ALTER FUNCTION kb_trigger() OWNER TO postgres;

DROP TRIGGER IF EXISTS kb_trg_01 ON kb CASCADE;
CREATE TRIGGER kb_trg_01 BEFORE INSERT
ON kb FOR EACH ROW
EXECUTE PROCEDURE kb_trigger();

W przypadku dodania rekordu i pustej geometrii, wprowadza geometrię EMPTY. Jest to oczywiście półśrodek, gdyż komplikuje późniejsze analizy obiektów bez geometrii.

Ad.2.
Pozostaje nierozwiązany.

Pozdrawiam
ML