Jak łatwo edytować dane atrybutów za pomocą wyrażeń regularnych?

30

Piszę tutorial dla studentów mgr korzystających z QGIS. Jednym z zadań wymaga danych atrybutu być zmodyfikowany (patrz pdf projekt samouczka tutaj , jeśli interesuje).

Pytanie brzmi, jak zmusić ich do edycji danych atrybutów. Wiem, że to pytanie zostało już zadane , a odpowiedź była prosta: wystarczy użyć LibreOffice calc, aby go zmodyfikować, a następnie zapisać, upewniając się, że kolejność wierszy i tytuły kolumn są takie same. Użyłem tego podejścia wcześniej, aby uzyskać doskonały efekt.

Niestety rozwiązanie już nie działa: zapisanie pliku .dbf w LibreOffice (5.4.2) lub OpenOffice (3.4.1) Calc szyfruje dane z perspektywy QGIS (w tabeli atrybutów pojawiają się tylko losowe liczby całkowite) oraz zamiast tego tworzy dodatkowy plik .dbt.

Aby przejść do pytania: jak powiedzieć klasie studentów mgr, aby zrobili to w przyszłym tygodniu? Rozważyłem następujące opcje:

  1. Zamiast tego użyj R (świetne dla mnie, ale przerażające dla studentów)
  2. Edytuj plik jako .csv, a następnie dołącz na podstawie znacznika czasu (w porządku, ale wydaje się zbyt skomplikowany i może wprowadzić więcej błędów w ciągu 2 godzin)
  3. Użyj alternatywnego programu: wypróbowałem Gnumeric i Excel, ale żaden z nich nie wygenerował szybko dobrych wyników.

Aby pomóc odpowiedzieć na to pytanie, stworzyłem powtarzalny przykład . Otwórz plik „points.shp” w QGIS, obserwuj tabelę atrybutów, a następnie zamknij. Edytuj kilka komórek w tabeli atrybutów „points.dbf” w LibreOffice - zapisz. Ponownie otwórz plik „points.shp” w QGIS i obserwuj zaszyfrowaną tabelę atrybutów. Inne pliki kształtów w folderze .zip zostały już uszkodzone przez LibreOffice i OpenOffice, aby zilustrować, jak wygląda dla mnie problem.

Krótko mówiąc, jak najlepiej rozwiązać ten problem?

RobinLovelace
źródło
2
Witamy na stronie, chciałbym powiedzieć, że jest to bardzo dobrze zadane pytanie i mam nadzieję, że uda nam się wypracować kilka dobrych rozwiązań. Zakładam, że trochę python nie wchodzi w rachubę dla tych studentów, ponieważ w ten sposób podchodziłbym do tego problemu w pierwszej kolejności ...
sgrieve
13
Bezpośrednia edycja części pliku kształtu .DBF jest zbyt niebezpieczna, aby zalecać ją do rutynowego użytku i nie powinna być w ogóle używana przez początkujących - przynajmniej jeśli nikomu nie zależy na danych. Dostępne jest jednak bardziej niezawodne rozwiązanie o podobnym charakterze: utrzymuj unikalne pole identyfikatora w pliku kształtu. Nigdy go nie edytuj. Zamiast tego zachowaj atrybuty w powiązanej tabeli (w dowolnym formacie, który GIS może odczytać), połączone na tym samym identyfikatorze. Teraz w dużym stopniu możesz swobodnie edytować tabelę atrybutów, nie tracąc związku między kształtem a atrybutem - pod warunkiem, że chronisz pole identyfikatora.
whuber
1
Rozwiązania w języku Python byłyby w porządku, o ile są łatwe do wdrożenia i zrozumienia ... Jeśli chodzi o zachowanie numeru identyfikacyjnego, to dobra opcja - (opcja 2 w moim pytaniu) i prawdopodobnie moja domyślna odpowiedź.
Miał
3
Co masz na myśli, 5 na plik kształtu? Wypróbuj 9! :-) (Pliki indeksu mogą się kumulować, w zależności od używanego GIS.) Gdy potrzebujesz więcej niż jednego powiązanego pliku, aby utrzymać zestaw danych - a pliki kształtów wymagają co najmniej trzech - to naprawdę nie jest żaden dodatkowy problem wrzuć dodatkowe pliki. Dodaj też plik metadanych, gdy jesteś przy nim. :-) Czy po skonfigurowaniu łączenia nie następuje ono automatycznie? (Nie rozumiem jednak, w jaki sposób można użyć znacznika czasu dla sprzężenia. Byłoby to zamiast tego użyte w systemie kontroli wersji.)
whuber
3
Jeśli masz jakąkolwiek skłonność do wprowadzania ich do baz danych, spatiaLite ma GUI do edycji pola i narzędzi wiersza polecenia dla danych OSM. Wtedy możesz zaangażować trochę SQL, a twoi uczniowie prawdopodobnie wyprzedzą krzywą.
Scro,

Odpowiedzi:

18

Najprostsza odpowiedź, jaką znalazłem, na podstawie porady Ryana Garnetta, aby zrobić to w QGIS:

Użyj regexp_replace

Ta zdolność została dodana do kalkulatora pola 1 rok temu przez Jürgena Fischera (jak ilustruje ten raport o błędach ). Próbowałem przez jakiś czas dowiedzieć się, jak to zrobić, ale nie udało mi się znaleźć „qgis regex” i innych niejasnych terminów.

Jego funkcjonalność najlepiej obrazuje potrzeba standaryzacji wszystkich wartości w kolumnie „nazwa”. Na przykład, jeśli musimy zamienić wszystkie komórki zawierające wzorzec „Tesc” na „Tesco”, usuwając zbędne informacje, takie jak „Tesco, Infirmary Road” (często dodawane przez autorów OSM), można użyć następującej funkcji:

regexp_replace („nazwa”, „Tesc. *”, „Tesco”)

wprowadź opis zdjęcia tutaj

Wydaje mi się, że jest to funkcja wyrażeń regularnych w języku Python, ponieważ różni się nieco od grep, którego wcześniej używałem.

Myślę, że potrzebna jest większa dokumentacja (szczegóły na stronie QGIS jest ograniczona do kilku słów) na temat tego, jak to działa, dlatego dodałem do zakładek następujące strony do wykorzystania w przyszłości:

To rozwiązanie ma kilka zalet:

  1. Prostota: nie są potrzebne żadne dodatkowe programy ani dodatki
  2. Wprowadza uczniów w moc wyrażeń regularnych, korzystając z funkcji (Pythonic?) (Interesujący jest tekst reprezentujący „.”. Ostrzeżenie: „symbol nie zawiedzie”) oraz funkcji wiersza polecenia.

Przepraszam za odpowiedź na moje pytanie i wielkie podziękowania dla innych za to, że doprowadzili mnie do światła! Mam nadzieję, że ten wątek będzie przydatny w celach edukacyjnych innym osobom mającym podobne problemy.

RobinLovelace
źródło
3
Nie martw się, odpowiadanie na własne pytania nie stanowi problemu.
podmrok
Cieszę się, że znalazłeś coś, co ci pomoże. Dziękuję za udostępnienie, wiem, że z tego skorzystam.
Ryan Garnett
1
Zapytałem deweloperów QGIS, to jest wyrażenie regularne qt-project.org/doc/qt-4.8/qregexp.html
wildintellect
9

Może to być głupia odpowiedź, ponieważ może być celem nauki dla uczniów grad, ale czy istnieje powód, dla którego nie edytujesz atrybutów w QGIS za pomocą kalkulatora pola? W poprzednich wersjach QGIS (wcześniejszych niż 1.7) edycja atrybutów bezpośrednio w QGIS nie była możliwa; stąd potrzeba edycji plików .DBF w OpenOffice itp.

Od wersji 1.7 i 1.8 można edytować dane atrybutów bezpośrednio w kalkulatorze polowym, z możliwością wykonywania wyrażeń warunkowych. Dostępne są również wtyczki Python Attribute, które mogą zapewnić dodatkowe opcje edycji atrybutów. Może to być rozwiązanie lub opcja dla twojego samouczka.

Jako poprzedni student studiów magisterskich, a obecnie pracownik uniwersytetu, rozumiem ten problem, poprzedni wymóg wykonywania go poza QGIS, i teraz doceniam możliwość wykonywania wszystkich edycji atrybutów w QGIS. Byłbym szczęśliwy, mogąc ci w tym pomóc, jeśli chcesz.

Ryan Garnett
źródło
1
Cześć Ryan, tak, to byłoby idealne rozwiązanie. Możliwość wyszukiwania i zamiany tekstu w tabeli atrybutów, standaryzowania niechlujnych nazw OSM, popycha mnie do bezpośredniej edycji pliku .dbf. Wolę edytować go w QGIS. Spróbuje wtyczki Python Attribute - może być pomysłem. Powinienem był wyjaśnić fakt, że szukam możliwości wyszukiwania / zamiany wyrażeń regularnych w pytaniu.
RobinLovelace
@ user1694378 nadal możesz wyjaśnić swoje pytanie.
podmroku
Dzięki podmrok za nakłonienie mnie do zrobienia tego - lepiej odzwierciedla to, co naprawdę chciałem zrobić.
RobinLovelace
3

Możesz użyć bazy LibreOffice do modyfikacji plików dbf .

  1. Open Base (pobierz menu główne)
  2. Wybierz „Połącz z istniejącą bazą danych” i wybierz typ „dBASE”.
  3. Wybierz folder z plikami dbf.
  4. Wybierz ostateczne opcje według potrzeb i „Zakończ”.
  5. Nazwij plik połączenia z bazą danych, jak chcesz (np. „MyxBasefiles.odb) i zapisz go gdzieś. Odtąd uzyskaj dostęp do plików bazy danych, klikając ten plik. OoOoo, Nicea.
  6. Wybierz „Tabele” na lewym panelu, a tam są twoje pliki danych (zwane „tabelami”). Bałagan z nimi.

Możesz teraz zacząć je edytować. Mam nadzieję, że powinno to być wystarczające dla twoich celów.

Możesz także wypróbować DBF Explorer, chociaż jest to tylko system Windows. Ma jednak wyszukiwanie i zamianę.

wprowadź opis zdjęcia tutaj

RK
źródło
1
Cześć RK Dzięki za szybką odpowiedź: wydaje się być niezawodnym i bezpiecznym sposobem edycji plików .dbf. Właśnie próbowałem tego, co powiedziałeś i cieszę się, że to działa.
RobinLovelace
Dobrze wiedzieć. Miła lekcja, którą tam masz. :)
RK
Ale ... Właśnie próbowałem tego, co powiedziałeś iz przyjemnością stwierdzam, że działa on dla poszczególnych komórek. Niestety nie jest to rozwiązanie w 100% dla tej konkretnej aplikacji, ponieważ wydaje się, że OOBase nie ma funkcji zamiany wyszukiwania, która jest wymagana w samouczku z powodu [błędu] ( lists.freedesktop.org/archives/libreoffice-bugs/2010 - grudzień /… ). Zdecydowanie pracował na poszczególnych komórkach: przetestowany. To 90% rozwiązanie do edycji komórka po komórce, chyba że przegapiłem funkcję zamiany wyszukiwania. Na przykład jakieś pomysły na zastąpienie wszystkich pozycji „Tesc. *” Słowem „Tesco”?
RobinLovelace
Lepszy link do podstawowego błędu OO: bugs.freedesktop.org/show_bug.cgi?id=32506
RobinLovelace
Zaktualizowałem moją odpowiedź.
RK