Przejdź do treści
Wróć do bloga
AI Agent
QGIS
Samouczek

Jak georeferencjonować mapę lub obraz w QGIS

Published

Mapa topograficzna USGS z 1947 roku przedstawiająca San Francisco podzielona na dwie części: po lewej zwykły skan, po prawej ta sama mapa zgeoreferencjonowana i nałożona na OpenStreetMap, z mostem Bay Bridge wychodzącym poza krawędź mapy, pod tytułem Georeferencing in QGIS.
Arkusz San Francisco North z 1947 roku, przed i po. Mapa: USGS, domena publiczna. Podkład mapowy: współtwórcy OpenStreetMap.

Aby georeferencjonować mapę lub obraz w QGIS, otwórz Layer > Georeferencer, wczytaj skan przez Open Raster, kliknij co najmniej cztery punkty, które potrafisz zidentyfikować, i wpisz ich rzeczywiste współrzędne, wybierz Polynomial 1 oraz odwzorowany docelowy CRS w Transformation Settings, a następnie naciśnij Start Georeferencing. QGIS zapisuje GeoTIFF i dodaje go do twojego projektu.

Umieszczenie punktów to łatwa część. Część, którą pomija większość poradników, to ocena wyniku, bo liczba, którą pokazuje QGIS, może wynosić zero na mapie przesuniętej o setki metrów. Zgeoreferencjonowałem mapę USGS z 1947 roku przedstawiającą San Francisco i zmierzyłem każdy wynik względem punktów, których dopasowanie nigdy nie widziało. Poniższe liczby pochodzą z tego testu.

Krótka odpowiedź

Twoje dane wejścioweMetodaCzas lub koszt
Skan ze współrzędnymi nadrukowanymi na nim (siatka geograficzna, znaczniki siatki, wartości w narożnikach)Metoda 1, wpisz nadrukowane wartościBezpłatnie. 8 punktów, a potem 34-sekundowy warp skanu 6,888 x 8,933 px
Skan bez współrzędnych albo zdjęcie mapyMetoda 1, From Map Canvas na podkładzie mapowymBezpłatnie. Licz na 10 lub więcej punktów
GeoPDF z USGS lub innej agencjiOtwórz go bezpośrednio, jest już umiejscowionyBezpłatnie, zero punktów
Punkty już odczytane, a chcesz, żeby dopasowanie sprawdził ktoś za ciebieMetoda 2, agent AI1 wiadomość, 99 s w moim teście
Szybka nakładka wizualna, bez potrzeby dokładnościMetoda 3, plugin Freehand raster georeferencerBezpłatny plugin

Zanim zaczniesz

Potrzebujesz QGIS 3.26 lub nowszego, w którym Georeferencer znajduje się w menu Layer. Użyłem QGIS 3.44.7. Starsze poradniki odsyłają do Raster > Georeferencer, gdzie narzędzie znajdowało się wcześniej, jako plugin GDAL Georeferencer.

Przeczytaj informacje pozaramkowe mapy, zanim cokolwiek klikniesz. Podają trzy rzeczy, które później wpiszesz: układ współrzędnych nadrukowanych wartości, datum i skalę. Moja próbka to arkusz USGS San Francisco North, CA z 1947 roku, w skali 1:24,000, który każdy może pobrać z topoView. W jego informacji pozaramkowej widnieje "Polyconic projection. 1927 North American datum", a w narożnikach podane są szerokości i długości geograficzne co 7'30". Historyczne mapy USGS są w domenie publicznej.

Aby test był uczciwy, wziąłem własny GeoTIFF USGS tego arkusza i usunąłem z niego georeferencję, więc tym, co wczytałem do QGIS, był zwykły plik JPEG o rozmiarze 9.2 MB i wymiarach 6,888 x 8,933 pikseli. To około 300 dpi, czyli 2.03 m terenu na piksel. Georeferencja USGS została z boku jako klucz odpowiedzi.

Gdzie internet się tu myli

"Im niższe RMSE, tym lepszy wynik." Nie w przypadku thin plate spline. Ta transformacja wygina obraz, aż przejdzie dokładnie przez każdy punkt, więc jej reszty są zawsze zerowe. Celowo wpisałem jedną szerokość geograficzną błędnie, 37°47' zamiast 37°47'30", i uruchomiłem obie transformacje na tych samych ośmiu punktach. Polynomial 1 pokazał RMSE 297 m i umieścił 762 m z tego na błędnym punkcie. Thin plate spline pokazał 0.00 m, a mapa była oddalona nawet o 594 m w punktach, których nie dostała.

"Wprowadź współrzędne w WGS 84." Nadrukowane wartości na starszych mapach amerykańskich to często NAD27 i informacja pozaramkowa to mówi. W San Francisco ta sama szerokość i długość geograficzna w NAD27 i w WGS 84 dzieli 93 m, z czego 92 m w kierunku wschód–zachód. Wpisz je jako EPSG:4326, a cały arkusz wyląduje o przecznicę dalej, z resztami, które wyglądają idealnie, bo wszystkie punkty przesunęły się razem. W oknie dialogowym Enter Map Coordinates ustaw CRS punktów na to, co podaje informacja pozaramkowa: EPSG:4267 dla NAD27.

"Zostaw docelowy CRS w stopniach." Możesz, ale płaskie dopasowanie afiniczne w szerokości i długości geograficznej nie odpowiada temu, jak narysowano mapę w odwzorowaniu. Na tych samych ośmiu punktach Polynomial 1 dał 2.98 m RMSE przy docelowym EPSG:4267 i 0.72 m przy NAD27 / UTM zone 10N (EPSG:26710). Wybierz odwzorowany CRS w datum mapy, a dopasowanie też będzie wyrażone w metrach.

Metoda 1: Georeferencer w QGIS

To wbudowane narzędzie i to, którego warto nauczyć się najpierw. Działa zarówno dla skanów z nadrukowanymi współrzędnymi, jak i bez nich.

Otwórz skan

Layer > Georeferencer, potem File > Open Raster i wybierz obraz. JPEG, PNG i TIFF działają.

Dodaj punkt kontrolny

Kliknij Add GCP Point, przybliż i kliknij miejsce, które potrafisz dokładnie zidentyfikować: narożnik ramki mapy, przecięcie siatki geograficznej, znacznik siatki. Otworzy się okno dialogowe Enter Map Coordinates. Wpisz nadrukowaną współrzędną. Przyjmuje stopnie, minuty i sekundy z odstępami (-122 25 0), stopnie dziesiętne albo metry w odwzorowaniu. Ustaw CRS pod polami na ten, który podaje informacja pozaramkowa.

Albo pobierz współrzędną z kanwy mapy

Gdy skan nie ma współrzędnych, najpierw wczytaj podkład mapowy w głównym oknie QGIS (przewodnik po podkładach mapowych pokazuje kliknięcia), potem naciśnij From Map Canvas i kliknij to samo miejsce na podkładzie. QGIS wypełni współrzędne i CRS za ciebie.

Rozłóż punkty

Umieść po jednym blisko każdego narożnika i kilka w środku. Punkty skupione w jednym obszarze dopasowują ten obszar i pozwalają reszcie arkusza dryfować. Użyłem czterech narożników ramki mapy i czterech przecięć siatki geograficznej wewnątrz niej.

Góra: Georeferencer przybliżony na znaczniku 25 minut ramki mapy, zielona kropka na znaczniku. Dół: okno dialogowe Enter Map Coordinates z wpisanymi -122 25 0 i 37 52 30 oraz wybranym EPSG:4267 NAD27.
Jedno kliknięcie na znaczniku 25' na górnej krawędzi, potem jego nadrukowana wartość wpisana w stopniach, minutach i sekundach, w NAD27.

Każdy dodany punkt trafia do pliku .points obok obrazu. Zachowaj go: Georeferencer wczyta go sam przy następnym otwarciu tego samego skanu, a ty możesz poprawić punkt, zamiast zaczynać od nowa.

Wybierz transformację

Settings > Transformation Settings zawiera najważniejszy wybór. Podręcznik QGIS 3.44 wymienia siedem transformacji z takimi minimalnymi liczbami punktów:

TransformacjaMinimalna liczba punktówDo czego
Linear2Czysty skan, który wymaga tylko przesunięcia i skalowania. Zapisuje world file, bez warp
Helmert2To samo plus obrót
Polynomial 13Większość płaskich skanów map drukowanych. Linie proste pozostają proste
Projective4Zdjęcie mapy wykonane pod kątem
Polynomial 26Zawinięty lub wygięty arkusz. Zniekształca krawędzie poza twoimi punktami
Polynomial 310To samo, mocniej. Rzadko warte zachodu
Thin plate spline10 według podręcznikaUszkodzone lub ręcznie rysowane mapy z wieloma punktami. Ukrywa błędy, patrz wyżej

Moja zasada: zacznij od Polynomial 1. Przechodź na coś bardziej elastycznego tylko wtedy, gdy reszty pokazują wzorzec, na przykład wszystkie punkty po jednej stronie ciągną w tę samą stronę, i nigdy dlatego, że wyższy numer wypadł gorzej.

Okno dialogowe Transformation Settings z Polynomial 1, docelowym CRS EPSG:26710 NAD27 / UTM zone 10N, plikiem wyjściowym kończącym się na _modified.tif i resamplingiem Cubic.
Ustawienia, których użyłem: Polynomial 1, własny datum mapy w odwzorowanym CRS, resampling Cubic dla gładszego skanu.

Dwa ustawienia w tym oknie oszczędzają później kłopotów. Resampling method zmienia wygląd przepróbkowanych pikseli: nearest neighbour zachowuje oryginalne kolory, cubic czyta się lepiej na skanie. A wynik domyślnie nie ma kompresji: mój plik JPEG 9.2 MB stał się GeoTIFF-em 187 MB. Otwórz Raster creation options i wybierz profil kompresji, jeśli plik będzie podróżować.

Odczytaj reszty

Gdy masz więcej punktów, niż wymaga transformacja, QGIS pokazuje resztę każdego punktu w tabeli GCP oraz błąd średni na pasku stanu, oba w pikselach dla skanu bez współrzędnych.

Okno Georeferencer ze skanem San Francisco North 1947 i ośmioma czerwonymi punktami kontrolnymi, tabelą GCP z listą współrzędnych źródłowych i docelowych oraz resztami między 0.15 a 0.46 piksela, a na pasku stanu odczyt Transform: Polynomial 1 Mean error: 0.447243.
Osiem punktów, Polynomial 1: reszty od 0.15 do 0.46 piksela i błąd średni 0.447 piksela, czyli około 0.9 m w terenie.

Aby ocenić wartość w pikselach, zamień ją na metry i porównaj z tym, co sama mapa może zaoferować.

  1. Metry na piksel. Pomnóż mianownik skali przez rozmiar zeskanowanego piksela. Przy 300 dpi jeden piksel to 0.0847 mm, więc na mapie 1:24,000 pokrywa 2.03 m. Moje 0.447 piksela to 0.9 m.
  2. Co mapa może obiecać. Amerykańskie National Map Accuracy Standards wymagają, aby 90 procent dobrze zdefiniowanych punktów na arkuszu 1:24,000 mieściło się w granicach 1/50 cala, co USGS podaje jako 12.2 m. Bardziej rygorystyczna zasada praktyczna to szerokość narysowanej linii, 0.2 mm na arkuszu, czyli 4.8 m przy 1:24,000.
  3. Punkty, których dopasowanie nigdy nie widziało. Reszta mówi tylko, że punkty zgadzają się ze sobą. Osiem znaczników siatki geograficznej wzdłuż krawędzi trzymałem poza dopasowaniem i zmierzyłem, gdzie wynik je umieścił: średnio 1.0 m błędu, w najgorszym razie 1.6 m.

Georeferencja dodała więc około metra błędu do mapy, która obiecuje tylko 12 m. Na starym arkuszu ograniczeniem jest prawie zawsze mapa, a nie twoje kliknięcia.

Start Georeferencing zapisał następnie GeoTIFF w 34 sekundy i dodał go do projektu. Na OpenStreetMap ulice z 1947 roku trafiają na dzisiejsze:

OpenStreetMap dzielnicy Marina i Fort Mason w San Francisco, a potem ten sam widok z zgeoreferencjonowaną mapą USGS z 1947 roku przy 55 procentach krycia, z Lombard Street i linią brzegową pokrywającymi się (after)
OpenStreetMap dzielnicy Marina i Fort Mason w San Francisco, a potem ten sam widok z zgeoreferencjonowaną mapą USGS z 1947 roku przy 55 procentach krycia, z Lombard Street i linią brzegową pokrywającymi się (before)
OpenStreetMapmapa z 1947
Przeciągnij, aby porównać
Marina i Fort Mason, San Francisco. Przesuń, aby nałożyć arkusz z 1947 roku na dzisiejszą mapę.

Użyj jej, gdy: chcesz wynik, którego możesz bronić, z resztami, plikiem .points i GeoTIFF-em, który odczyta każde GIS.

Pomiń ją, gdy: potrzebujesz tylko zgrubnego tła na kilka minut. Metoda 3 jest do tego szybsza.

Metoda 2: Punkty kontrolne sprawdzone przez agenta AI

Tworzymy AI Agent, bezpłatny plugin do QGIS z panelem czatu, który wykonuje kroki w twoim otwartym projekcie. Ta sekcja dotyczy naszego własnego narzędzia. Ma ono narzędzie do georeferencji, które przyjmuje punkty kontrolne jako pary piksel–współrzędna, dopasowuje jedną z transformacji Georeferencera przez GDAL i zwraca resztę każdego punktu w metrach, ocenianą względem skali mapy.

Potrafi też umiejscowić skan bez żadnych punktów, czytając jego nazwy miejscowe i dopasowując go do map referencyjnych: stara mapa Edynburga w przewodniku po AI Agent trafiła z błędem mediany 5.9 m. To wymaga czytelnych nazw, a bardzo stare arkusze często zawodzą. Dla mapy z nadrukowaną siatką geograficzną punkty są pewniejszą drogą, a ich odczyt jest szybki: obraz bez współrzędnych leży w QGIS z kolumną pikseli jako x i minus wierszem jako y, więc pasek stanu pokazuje piksel pod kursorem. Wczytałem skan, zostawiłem literówkę z powyższego testu w punkcie 8 i wysłałem jedną wiadomość:

Zgeoreferencjonuj layer sf-north-1947-scan. To arkusz USGS San Francisco North z 1947 roku, skala 1:24,000, współrzędne w NAD27. Odczytałem na skanie następujące punkty kontrolne (kolumna piksela, wiersz → szerokość, długość geograficzna): 1. 1022, 792 → 37°52'30"N, 122°30'W (narożnik NW) [...] 8. 4632, 5344 → 37°47'N, 122°25'W. Czy wynik jest wystarczająco dokładny dla mapy 1:24,000?

Uruchomienie zajęło 99 sekund, pokazane w panelu jako 14 akcji. Agent odczytał layer, dopasował osiem punktów w Pythonie, aby je sprawdzić, odkrył, że punkt 8 leżał 925 m od miejsca, w które wskazywał jego wiersz, pominął go i zapisał GeoTIFF z pozostałych siedmiu w NAD27 / UTM zone 10N.

Zapytało raz, przed uruchomieniem własnego sprawdzenia w Pythonie. Jego odpowiedź podała RMSE 0.73 m z maksimum 0.95 m wobec tolerancji 4.8 m i dodała, że mierzy to zgodność między punktami, a nie bezwzględną dokładność mapy.

QGIS z zgeoreferencjonowaną mapą San Francisco z 1947 roku przy 72 procentach krycia na OpenStreetMap oraz panel AI Agent po prawej, wyjaśniający, że punkt 8 został wykluczony, bo był oddalony o około 925 m, błąd RMS 0.73 m i tolerancję 4.8 m.
Jedna wiadomość, 99 sekund: literówka w punkcie 8 wychwycona i odrzucona, RMSE 0.73 m na pozostałych siedmiu, wynik na podkładzie mapowym.

Sprawdziłem jego GeoTIFF tak samo jak swój, na ośmiu znacznikach na krawędziach, których nigdy nie widział: średnio 1.0 m błędu, w najgorszym razie 1.6 m, tyle samo co Georeferencer. Różnica to literówka. W Georeferencerze musiałbym wypatrzyć ją sam w kolumnie reszt, a przy thin plate spline nie wypatrzyłbym jej wcale.

Zostawiło też punkty jako plik .points obok wyniku, więc to samo dopasowanie otwiera się w Georeferencerze, jeśli chcesz przesunąć punkt ręcznie. Każda wiadomość zostawia punkt kontrolny w panelu, a jedno kliknięcie cofa całe uruchomienie. Bezpłatny plan ma 10 wiadomości miesięcznie, bez klucza API i bez karty.

Użyj jej, gdy: masz punkty i chcesz dopasowanie, sprawdzenie wartości odstających oraz werdykt w jednym kroku, albo georeferencjonujesz arkusze seriami.

Pomiń ją, gdy: mapa nie ma ani czytelnych nazw miejscowych, ani punktów, które możesz odczytać, jak ręcznie rysowany szkic. Ręczne umieszczenie punktów w Metodzie 1 jest wtedy jedyną drogą.

Wypróbuj AI Agent za darmo w QGIS

Metoda 3: Nakładka odręczna z pluginem

Plugin Freehand raster georeferencer, w wersji 0.8.3, gdy czytałem jego dokumentację, pozwala upuścić obraz na mapę i przesuwać, obracać oraz skalować go ręcznie, aż się dopasuje, tak jak w Google Earth. Wynik od razu pokazuje się na wierzchu twoich innych layers, a po zakończeniu plugin eksportuje obraz z plikiem world file.

Jego README jasno mówi o ograniczeniach: tylko transformacje afiniczne, bez rubber sheeting, bez reszt i tylko pliki BMP, JPEG, PNG oraz TIFF. Nie dostajesz żadnej liczby, która mówi, jak bardzo się mylisz.

Użyj jej, gdy: potrzebujesz zgrubnie umiejscowionego zeskanowanego planu, aby obrysować kilka obiektów albo pokazać klientowi, gdzie co było.

Pomiń ją, gdy: ktokolwiek będzie mierzył na wyniku. Użyj Metody 1.

Co zapamiętać

  • W QGIS 3.26 i nowszych narzędzie to Layer > Georeferencer. Zacznij od czterech dobrze rozłożonych punktów, Polynomial 1 i odwzorowanego docelowego CRS w datum mapy.
  • RMSE równe zero niczego nie dowodzi: thin plate spline zawsze je osiąga, a w moim teście zrobił to na mapie oddalonej o 594 m.
  • Przelicz reszty na metry (piksele x rozmiar jednego piksela w terenie) i porównaj je z tym, co obiecuje mapa: 12.2 m dla arkusza USGS 1:24,000.
  • Sprawdź wynik na punktach, które zostawiłeś poza dopasowaniem. Moje były średnio 1.0 m błędne na arkuszu San Francisco z 1947 roku.
  • Wpisuj punkty w datum, które podaje informacja pozaramkowa. NAD27 leży 93 m od WGS 84 w San Francisco, więc arkusz USGS z 1947 roku przyjmuje EPSG:4267.

Częste pytania

Gdzie jest Georeferencer w QGIS?

W QGIS 3.26 i nowszych znajduje się w Layer > Georeferencer. W starszych wersjach było to Raster > Georeferencer, dostarczane przez plugin GDAL Georeferencer, który trzeba było włączyć w menedżerze pluginów. Jeśli żadne z menu go nie pokazuje, plugin lub profil dostosowania mógł zmienić twoje menu.

Ile punktów kontrolnych potrzebuję?

Minimum to 2 dla Linear i Helmert, 3 dla Polynomial 1, 4 dla Projective, 6 dla Polynomial 2 i 10 dla Polynomial 3, a podręcznik QGIS prosi o 10 lub więcej dla thin plate spline. W praktyce używaj około dwa razy więcej niż minimum, rozłożonych do narożników, i trzymaj kilka dodatkowych jako punkty sprawdzające. Ja użyłem 8 dla Polynomial 1 i jeszcze 8 do sprawdzenia.

Polynomial, Helmert czy thin plate spline: który wybrać?

Helmert dla czystego, płaskiego skanu, który wymaga tylko obrotu i skalowania. Polynomial 1 dla prawie każdej mapy drukowanej, bo pochłania też niewielkie ścięcie ze skanera. Thin plate spline tylko dla uszkodzonej lub ręcznie rysowanej mapy z wieloma dobrymi punktami, a potem sprawdź go na punktach, których nie użyłeś, bo jego reszty są zawsze zerowe.

Co to jest dobre RMSE?

Takie, które jest małe w porównaniu z tym, co mapa może zaoferować. Przelicz je na metry i porównaj z 0.2 mm razy mianownik skali (4.8 m przy 1:24,000) albo z oficjalnym standardem mapy (12.2 m dla arkuszy USGS 1:24,000). Poniżej jednego piksela na czystym skanie to norma. Pojedynczy punkt z resztą znacznie większą od pozostałych to zwykle literówka albo błędne kliknięcie, a nie zła mapa.

Jak zgeoreferencjonować PDF?

Najpierw sprawdź, czy już nim jest. Mapy topograficzne USGS i wiele planów agencji to GeoPDF-y, a QGIS otwiera je na miejscu: PDF San Francisco z 1947 roku wczytał się ze swoimi współrzędnymi i bez punktów kontrolnych, renderowany przez GDAL przy 150 dpi, chyba że ustawisz GDAL_PDF_DPI wyżej. Zwykły PDF nie ma współrzędnych: wyeksportuj stronę do PNG lub TIFF przy 300 dpi, a potem użyj Metody 1.

Jak zgeoreferencjonować mapę bez współrzędnych?

Użyj obiektów, które nie przesunęły się od czasu narysowania mapy, takich jak skrzyżowania dróg, mosty, kościoły i załamania linii brzegowej, i odczytaj ich współrzędne za pomocą From Map Canvas na podkładzie mapowym albo na twojej narodowej ortofotomapie. Rozłóż 10 lub więcej z nich po całym arkuszu. Spodziewaj się większych reszt niż przy nadrukowanej siatce, bo stara mapa i dzisiejszy świat nie wszędzie się już zgadzają.

Centrum AI w QGIS zbiera to, co AI potrafi, a czego nie potrafi w QGIS, a przewodnik po AI Agent opisuje resztę pluginu. Gdy stara mapa jest już na miejscu, możesz pobrać dane OpenStreetMap, aby porównać ją z dzisiejszymi ulicami, ściągnąć obraz Sentinel-2 tego samego obszaru albo zamienić skan na wektory.

Wypróbuj AI Agent za darmo w QGIS