Czy przywracasz atrybuty linii dotykających linii do warstwy linii za pomocą QGIS?

12

Używam QGIS 2.14.4-Essen. Mam dwie warstwy:

  • points.shp, który zawiera punkty z kolumną ROK
  • lines.shp, który zawiera linie, które dokładnie łączą punkty z points.shp

Chciałbym uzyskać atrybut YEAR z punktów.shp z powrotem do lines.shp. Każda linia jest pojedynczym segmentem z jednym punktem na każdym końcu (patrz rysunek poniżej). Chciałbym uzyskać ROK od pierwszego punktu i ROK od drugiego punktu z powrotem do atrybutów każdej linii.

Na przykład: linia 1 dotyka pierwszego punktu z ROK = 2010, a drugiego punktu z ROK = 2011. Chciałbym przywrócić coś takiego jak „2010-2011” do atrybutów wiersza 1. Wynik powinien wyglądać następująco:

id  | points
----+-----------------
1   | 2010-2011
2   | 2011-2012
3   | 2012-2016

wprowadź opis zdjęcia tutaj

Czy istnieje sposób na osiągnięcie tego za pomocą QGIS?

wiltomap
źródło

Odpowiedzi:

9

Chociaż odpowiedź @radouxju jest prawidłowa, wyjaśnię ją nieco bardziej szczegółowo.

  1. Musisz upewnić się, że funkcja polilinii jest podzielona dokładnie nad lokalizacjami punktów.
  2. Zastosowanie Join attribute by location. Wybierz linię podziału w punktach jako warstwę docelową - w moim przypadku nazywam ją „rozłożoną”.
  3. W sekcji podsumowania wybierz „Zrób podsumowanie przecinającego obiektu”. Tutaj zamiast dwa razy uruchomić narzędzie; jeden dla Min, a drugi dla Max, możesz uruchomić go raz i wybrać zarówno Min, jak i Max.

wprowadź opis zdjęcia tutaj

  1. Plik wyjściowy będzie miał następujący atrybut:

wprowadź opis zdjęcia tutaj

  1. Dodaj nowe pole typu ciągu o nazwie „Rok” do nowego pliku kształtu z kroku 4.
  2. Użyj Kalkulatora pola i przejdź do aktualizacji istniejącego pola. Wybierz „Rok” i wpisz następujące wyrażenie:

    to_string („MINYEAR2”) + '-' + to_string („MAXYEAR2”)

  3. Ostateczny atrybut wyjściowy będzie wyglądał następująco:

wprowadź opis zdjęcia tutaj

  1. Ostateczne wyjście będzie wyglądało tak:

wprowadź opis zdjęcia tutaj


Oto wynik po przetestowaniu danych:

wprowadź opis zdjęcia tutaj

Tabela po lewej to dane punktowe po utworzeniu nowego pola typu liczba całkowita, a tabela po prawej następuje po połączeniu linii z danymi punktowymi przy użyciu kroku 2 wspomnianego powyżej. Następnie użyłem kroków 5-6, aby utworzyć ostateczne dane.

Aktualizacja

Próbowałem przekonwertować pole YEAR z łańcucha na liczbę całkowitą za pomocą wyrażenia to_int () i zadziałało. Więc nie musisz tego robić ręcznie. Jednak typ pola powinien być typu „ Integernie” Integer64. Upewnij się, że pole ma długość do 9. Jeśli wybierzesz pole o długości 10, zostanie ono przekonwertowane na Interger64i nie będzie działać Interger64. Następnie możesz wykonać proces od kroku 2-6

Oto końcowe dane wyjściowe po użyciu wyrażenia to_int ():

wprowadź opis zdjęcia tutaj

W powyższej tabeli atrybutów po lewej stronie YEAR ma ciąg typu, a YEAR2 jest liczbą całkowitą typu przekonwertowaną za pomocą wyrażenia to_int (). Możesz zobaczyć w tabeli atrybutów po prawej stronie po wykonaniu kroków 2-6, otrzymałem MINYEAR2 i MAXYEAR2, a następnie ponownie przekonwertowałem na ciąg znaków, aby połączyć wszystko razem w polu ROK.

ahmadhanb
źródło
Wielkie dzięki! Właśnie to zrobiłem kilka razy. Myślę, że funkcje polilinii są podzielone dokładnie nad lokalizacjami punktów, ponieważ utworzyłem linie z warstw punktów za pomocą wtyczki Points2One. Czy możesz wypróbować ten podzbiór danych: drive.google.com/file/d/0B7ZWEFkkfYgheG92Q29sa0I3LW8/view ? Dzięki jeszcze raz!
wiltomap
Pole YEAR w tabeli atrybutów ma ciąg znaków. Musisz dodać nowe pole typu liczba całkowita i ręcznie wprowadzić lata. Po utworzeniu pola typu liczby całkowitej i zapisaniu zmian usuń stare pole ciągu. Następnie postępuj zgodnie z powyższym szczegółowym procesem.
ahmadhanb
Próbowałem przekonwertować pole YEAR z łańcucha na liczbę całkowitą za pomocą wyrażenia to_int (), ale też nie działało. Kiedy ręcznie wprowadziłem lata, działało to zgodnie z oczekiwaniami.
ahmadhanb
Jasne wyjaśnienie @ahmadhanb
Shiko
Dzięki @ahmadhanb! Faktem jest, że dane, które udostępniłem powyżej, są podzbiorem. Mam kilka tysięcy linii i punktów, więc ręczne wprowadzanie lat będzie dość pracochłonne! Czy to błąd?
wiltomap
5

Po dołączeniu punktów łączenia do linii będziesz mieć wiele relacji. Dzięki opcji „dołącz atrybut według lokalizacji” będziesz mógł poprosić o daną metodę podsumowania. W twoim przypadku zrób to dwa razy: raz z minimum i raz z maksimum. Następnie możesz połączyć dwa pola w nowe pole i skończyć z tym, czego potrzebujesz.

wprowadź opis zdjęcia tutaj

Kalkulator polowy:

tostring(minYEAR) + '-' + tostring(maxYEAR)
radouxju
źródło
Ta metoda zwraca dodatkową kolumnę o nazwie COUNTi zawierającą wartość 2dla każdego wiersza. Opcje Min i Max zwracają te informacje. Wybrałem warstwę linii jako warstwę docelową, a warstwę punktów jako warstwę łączenia, prawda?
wiltomap
czy rok jest polem numerycznym czy tekstowym?
radouxju,
YEARPole jest liczbą całkowitą. Próbowałem utworzyć nową kolumnę, to_string("YEAR")ale wynik jest dokładnie taki sam ...
wiltomap
Zrobiłem szybki test, aby się upewnić (QGIS 2.8.3) i zadziałał. Jeśli liczba wynosi 2, oznacza to, że masz 2 punkty za każdy segment, co jest poprawne. Ale ze mną mam wartości atrybutu MINYEAR MAXYEAR w nowym wektorze linii utworzonym przez połączenie przestrzenne. Nie rozumiem, dlaczego to nie działa w twoim przypadku. Czy możesz spróbować z innym plikiem?
radouxju,
4

Zakładając, że topologia jest idealna, tworzymy pole „WKT” z wyrażeniem

geom_to_wkt( $geometry) 

w warstwie punktowej możesz użyć wyrażenia:

min( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))||'-'|| max( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))

w polu kalkulatora warstwy rury, tworząc ciąg tekstowy.

  • atrybut (cecha, nazwa_atrybutu) Zwraca wartość określonego atrybutu z cechy, tutaj rok
    uzyskanej cechy punktowej .
  • get_feature (warstwa, atrybut, wartość) zwraca pierwszą cechę warstwy pasującą do podanej wartości atrybutu. Tutaj sprawdzamy, czy możemy znaleźć punkt o tych samych współrzędnych (w formacie WKT), jak
    te na początku i na końcu linii twojej linii.
  • punkt_początkowy (geometria) zwraca pierwszy węzeł z geometrii. Tutaj pierwszy wierzchołek twojej linii.
  • end_point (geometria) zwraca ostatni węzeł z geometrii. Tutaj ostatni wierzchołek twojej linii.
  • geom_to_wkt (geometria) zwraca reprezentację geometrii w dobrze znanym tekście (WKT). wprowadź opis zdjęcia tutaj

Możesz nawet zaktualizować go do:

CASE
WHEN attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year') = attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year')
THEN attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year')
ELSE min( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))||'-'|| max( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))
END

aby pokazać tylko jeden rok, jeśli połączone są dwa punkty z tym samym rokiem (uzyskanie 200X zamiast 200X-200X).

Główną zaletą tej metody jest to, że jeśli dane zmienią się w punktach, możesz je bardzo szybko zaktualizować za pomocą tylko jednego kalkulatora pola.
Możesz nawet dodać tę regułę jako Autofield do tworzenia nowych linii.
Twoje zdrowie,

Zwycięzca
źródło