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:
Chociaż odpowiedź @radouxju jest prawidłowa, wyjaśnię ją nieco bardziej szczegółowo.
Musisz upewnić się, że funkcja polilinii jest podzielona dokładnie nad lokalizacjami punktów.
Zastosowanie Join attribute by location. Wybierz linię podziału w punktach jako warstwę docelową - w moim przypadku nazywam ją „rozłożoną”.
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.
Plik wyjściowy będzie miał następujący atrybut:
Dodaj nowe pole typu ciągu o nazwie „Rok” do nowego pliku kształtu z kroku 4.
Użyj Kalkulatora pola i przejdź do aktualizacji istniejącego pola. Wybierz „Rok” i wpisz następujące wyrażenie:
Ostateczny atrybut wyjściowy będzie wyglądał następująco:
Ostateczne wyjście będzie wyglądało tak:
Oto wynik po przetestowaniu danych:
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 ():
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.
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.
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
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).
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,
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.
Kalkulator polowy:
źródło
COUNT
i zawierającą wartość2
dla 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?YEAR
Pole jest liczbą całkowitą. Próbowałem utworzyć nową kolumnę,to_string("YEAR")
ale wynik jest dokładnie taki sam ...Zakładając, że topologia jest idealna, tworzymy pole „WKT” z wyrażeniem
w warstwie punktowej możesz użyć wyrażenia:
w polu kalkulatora warstwy rury, tworząc ciąg tekstowy.
uzyskanej cechy punktowej .
te na początku i na końcu linii twojej linii.
Możesz nawet zaktualizować go do:
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,
źródło