Forum QGIS

Pełna wersja: kilka typów na jednej warstwie
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Stron: 1 2
czeŚĆ,

Przy imporcie z innych programów / formatów (na pewno z DXF i z MapInfo)
na jednej warstwie potrafią znaleźć się obiekty o różnych typach (punkt, linia, poligon).
Warstwa jest wyświetlana w całości, ale jej typ jest rozpoznawany
według pierwszego elementu znalezionego przy imporcie.

Ujawnia się to dopiero przy zapisywaniu do SHP.
Czy jest jakiś prosty (automatyczny) sposób podzielnia takiej "wielotypowej" warstwy według typów?
Rozumiem że pracujesz na SHP.
Jeżeli masz w atrybutach jakiś parametr określający co jest czym (punktem, linią czy poligonem) możesz we właściwościach warstwy "->ogólne-kreator zapytań" ograniczyć zapytaniem wyświetlany wynik do żądanych elementów. Np. jeżeli wszystkie punkty mają jakiś charakterystyczny tylko sobie atrybut ogranicz wyświetlany wynik do elementów spełniających warunek. Następnie zapisz warstwę jako SHP i efektem końcowym powinien być plik tylko z elementami spełniającymi warunek.

Jeżeli nie masz takiej możliwości spróbuj wrzucić całą warstwę do postgisa a wtedy będziesz mógł rozdzielić typy obiektów zapytaniem (przykład dla punktu)
GeometryType("the_geom") IN ('POINT','MULTIPOINT')
Pytanie czy przejdzie eksport do postgisa z takiego SHP i czy jest to wystarczająco automatycznie na Twoje potrzeby??
PS. Na pewno są jeszcze szybsze sposoby... ja tak bym to ugryzł!
(23-05-2011, 11:48)sebaq napisał(a): [ -> ]Jeżeli nie masz takiej możliwości spróbuj wrzucić całą warstwę do postgisa a wtedy będziesz mógł rozdzielić typy obiektów zapytaniem (przykład dla punktu)
GeometryType("the_geom") IN ('POINT','MULTIPOINT')
Pytanie czy przejdzie eksport do postgisa z takiego SHP i czy jest to wystarczająco automatycznie na Twoje potrzeby??
PS. Na pewno są jeszcze szybsze sposoby... ja tak bym to ugryzł!

PostGISa jeszcze w ogóle nie ćwiczyłem.

Przy DXFie radzę sobie przepuszczając przez MicroStation.
Przy plikach z MapInfo jak na razie (odpukać) problem był jednostkowy,
więc się nie wgłębiałem i poprawiłem dane ręcznie usuwając "błędne" rekordy.

Sposób "na bazę danych" jest dla mnie w miarę oczywistym, ale jednak "rękodzielniczym".
Chodzi mi o odpowiednik 'podziel warstwę wektorową' - niewymagający dodatkowych kroków.

Pomysł do rozważenia:
Przy imporcie plików dołożyć możliwość generowania trzech shp
- jeden punktowy, jeden liniowy, jeden poligonowy.
Wtedy nie będzie się trzeba wdrażać co jest na której warstwie, bo i tak import przerobi wszystko.
W tej chwili o 'typie' wczytanej warstwy najwyraźniej decyduje pierwszy znaleziony obiekt.
Jest wtyczka ShapefileSplitter która trochę automatyzuje rękodzieło. Zadajesz szejpa i kolumnę po której ma go podzielić. Nie testowałem.
(25-05-2011, 10:04)PanKuleczka napisał(a): [ -> ]Jest wtyczka ShapefileSplitter która trochę automatyzuje rękodzieło. Zadajesz szejpa i kolumnę po której ma go podzielić. Nie testowałem.
Zdaję sobie sprawę z jej istnienia i nawet korzystam z radością.

Problem w tym, że wymaga ona na wejściu jakiegoś unikalnego pola, po którym można by rozsortować geometrię,
a tego właśnie w zadaniu nie mamy.
Przyszło mi do głowy coś takiego:

1. Tworzymy kolumnę, w której będziemy zapisywali typ geometrii
2. Kalkulatorem pól wyliczamy w tej kolumnie powierzchnię obiektów ($area)
3. Obiekty, dla których powierzchnia obliczona jest większa od zera to poligony - zamieniamy kalkulatorem tą powierzchnię na jakiś wpis, np 'poligon'
4. Dla obiektów z powierzchnią zero wyliczamy kalkulatorem długość ($length)
5. Obiekty z długością większą od zera to linie, ustawiamy im zamiast długości odpowiedni znacznik, np. 'linia'
6. Obiekty z zerową długością to punkty. Im też możemy teraz ustawić znacznik.

Po znacznikach można teraz w prosty sposób odfiltrować obiekty określonego typu.
Nie testowałem zbytnio tego pomysłu (oprócz obliczania powierzchni i długości), ale powinno się sprawdzić.
(26-05-2011, 10:09)Rayo napisał(a): [ -> ]Przyszło mi do głowy coś takiego:

1. Tworzymy kolumnę, w której będziemy zapisywali typ geometrii
2. Kalkulatorem pól wyliczamy w tej kolumnie powierzchnię obiektów ($area)
3. Obiekty, dla których powierzchnia obliczona jest większa od zera to poligony - zamieniamy kalkulatorem tą powierzchnię na jakiś wpis, np 'poligon'
4. Dla obiektów z powierzchnią zero wyliczamy kalkulatorem długość ($length)
5. Obiekty z długością większą od zera to linie, ustawiamy im zamiast długości odpowiedni znacznik, np. 'linia'
6. Obiekty z zerową długością to punkty. Im też możemy teraz ustawić znacznik.

Po znacznikach można teraz w prosty sposób odfiltrować obiekty określonego typu.
Nie testowałem zbytnio tego pomysłu (oprócz obliczania powierzchni i długości), ale powinno się sprawdzić.

Właśnie sprawdzałem coś podobnego i nie sprawdzi się niestety.

Żeby dodać kolumnę musi być możliwa edycja danej warstwy.
Warstwy zaimportowane z Mapinfo są wyświetlane, ale nie są edytowalne.
Jeśli możesz to wrzuć tu jako załącznik przykładową warstwę.
(26-05-2011, 10:51)Rayo napisał(a): [ -> ]Jeśli możesz to wrzuć tu jako załącznik przykładową warstwę.

Pierwszy z brzegu - format MapInfo, tak wyglądają oryginalne dane.
http://wiki.smutek.pl/wiki/poligon_point.rar

Otworzy się poprawnie, edycja warstwy nieaktywna,
przy próbie zapisu jako SHP dostaję:

Nieudany eksport do pliku wektorowego.
Błąd: Błąd zapisu obiektu:
Nie stworzono obiektu (błąd OGR: Attempt to write non-polygon (POINT) geometry to POLYGON type shapefile.)
Nie stworzono obiektu (błąd OGR: Attempt to write non-polygon (POINT) geometry to POLYGON type shapefile.)
Nie stworzono obiektu (błąd OGR: Attempt to write non-polygon (POINT) geometry to POLYGON type shapefile.)
Nie stworzono obiektu (błąd OGR: Attempt to write non-polygon (POINT) geometry to POLYGON type shapefile.)
Nie stworzono obiektu (błąd OGR: Attempt to write non-polygon (POINT) geometry to POLYGON type shapefile.)
Nie stworzono obiektu (błąd OGR: Attempt to write non-polygon (POINT) geometry to POLYGON type shapefile.)
Zapisano jedynie 12 z 18 obiektów.
Niezbyt to automatyczne, ale mozna zrobić tak:

1. Tworzysz ręcznie trzy warstwy (punktowa, poligonowa i liniowa) o takiej samej tabeli atrybutów jak importowany plik i otwierasz je w projekcie
2. Importujesz do projektu warstwę 'wielotypową'.
3. W tabeli atrybutów tej warstwy kreatorem zapytań wybierasz obiekty, które spełniają warunek '$area > 0'. Są to poligony, które teraz możes skopiować na wcześniej utworzoną warstwę poligonową i zapisać.
4. Następnie podobnie robisz dla zapytania '$area = 0 and $length >0' (linie)
5. I na końcu punkty - '$length = 0'

Wszystko razem można też zapisać jako SpatialLight, ale nie wszystko można potem z taką warstwą zrobić (przynajmniej na 1.6, wyżej nie sprawdzałem).
Stron: 1 2