Georeferencyjna warstwa wektorowa z punktami kontrolnymi za pomocą QGIS?

29

Mam warstwę wektorową bez georeferencji, która wymaga georeferencji. W przypadku warstw rastrowych zadanie jest łatwe i jednoznaczne, ale nie mam pojęcia, co mam zrobić z moją warstwą wektorową. Mam kilka punktów kontrolnych o znanych współrzędnych, które powinny stanowić podstawę do transformacji. Powiedzmy, że znam punkty o id-s 1, 2 i 3 powinny mieć współrzędne x1, y1; x2, y2; x3, y3. Oprócz prostego przesuwania może wystąpić pewna transformacja obrotu i skali.

Jakieś pomysły?

Ahah
źródło
Próbowałeś już wtyczki qgsAffine? Podobne pytanie tutaj: gis.stackexchange.com/questions/22691/how-to-georeference-a-dxf
Rayner
Wtyczka Affine prawdopodobnie dokona transformacji, ale aby ją użyć, musisz znać parametry transformacji. Czy możesz opublikować współrzędne wektorowe i odpowiadające im współrzędne rzeczywiste dla swoich trzech punktów? N.
nhopton,
Czy możesz przekonwertować plik shapefile na tiff za pomocą gdal_rasterize, georeferencję tiff, a następnie wyodrębnić parametry z pliku świata?
klewis

Odpowiedzi:

10

Aby georeferencyjnie warstwę wektorową, wypróbuj wtyczkę qgsAffine.

Więcej informacji znajduje się w menu Gdzie znaleźć qgsaffine?

Rayner
źródło
3
Dziękuję za odpowiedzi. Chyba muszę wtedy użyć qgsAffine i ręcznie ustalić parametry transofrmacji. Miałem tylko nadzieję, że istnieje sposób na zautomatyzowanie tego procesu. Być może spróbuję napisać kod Pythona, aby to zrobić
AHaav,
1
Myśląc o tym, możesz uznać, że GRASS v.transform (jest w zestawie narzędzi Sextante) jest łatwiejszy w użyciu niż wtyczka qgsAffine. N.
nhopton,
1
Wygląda na to, że v.transform również zrobi dla ciebie sumy, zobacz grass.osgeo.org/gdp/html_grass63/v.transform.html
nhopton
8

Biorąc pod uwagę fakt, że masz pewne punkty kontroli, powinieneś być w stanie użyć transformacji afinicznej do przesunięcia danych wektorowych. Zobacz ten przepis . Proces ten składa się z dwóch części:

  1. Użyj punktów kontrolnych, aby zdefiniować wymagane współczynniki funkcji afinicznej
  2. weź współczynniki i zastosuj je do ST_Affine () w postgis.

Jeśli umieścisz punkty kontrolne w pliku CSV (old_x, old_y, new_x, new_y), możesz po prostu wyciąć i wkleić polecenia R z łącza, aby rozwiązać część współczynników.

użytkownik12398
źródło
7

Polecam wtyczkę Vector Bender dla QGIS. Próbowałem i działa dobrze i jest przyjazny dla użytkownika. W zależności od liczby par punktów, które zdefiniujesz, możesz albo:

  • tłumaczenia: tłumaczenie od jednego punktu początkowego do końcowego (1 para)
  • jednolity: tłumaczenie, skalowanie i obrót (2 pary)
  • zginanie: dodatkowe odkształcenie (3 pary lub więcej)

Można znaleźć krótki film tutaj i radzę Ci przeczytać pomoc Wektor Bender po zainstalowaniu wtyczki.

ZKB
źródło
Zgadzam się, wtyczka Vector bender jest intuicyjna i szybka w obsłudze. Jednak nie udało mi się zdublować / przerzucić wektorów. Do tej operacji używam wtyczki transformacji Affine (QGIS v2.18).
jurajb
2

Po prostu musiałem to zrobić i skończyłem na tym:

  1. Rasteryzuj plik kształtu
  2. Georeferencja rastra za pomocą wtyczki Georeferencer
  3. Zapisz GCP jako gcps.pointsplik
  4. Oblicz transformację afiniczną za pomocą tego pliku
  5. Zastosuj transformację afiniczną do pliku kształtu za pomocą qgsAffine

Poniższy skrypt oblicza macierz transformacji afinicznej przy użyciu zapisanych GCP:

# Computes an affine transform based on QGis GCPs
# Usage: gcp_affine.py gcps.points

import csv
import sys
import numpy as np
from skimage.transform import AffineTransform

u = list(csv.DictReader(open(sys.argv[1], "rb")))
source = [(d["pixelX"], d["pixelY"]) for d in u]
dest = [(d["mapX"], d["mapY"]) for d in u]
source = [map(float, s) for s in source]
dest = [map(float, s) for s in dest]
source = np.array(source)
dest = np.array(dest)
aft = AffineTransform()
aft.estimate(source, dest)
np.set_printoptions(suppress=True)
print aft._matrix
FX
źródło
2

Kontynuując moje komentarze do odpowiedzi Raynera, GRASS v.transform, który można uruchomić z przybornika Sextante, można wykorzystać do obliczenia parametrów transformacji i zastosowania ich do warstwy wektorowej w celu przeprowadzenia transformacji afinicznej. Wymagany jest plik tekstowy zawierający punkty kontrolne, w pokazanym tutaj formacie .

Jest bardzo łatwy w użyciu i działa dobrze.

nhopton
źródło
Może się starzeję, ale zastanawiam się, czy ludzie pamiętają dodatek użytkownika ShapeWarp w Arcview 3.0. To było takie łatwe w użyciu. Zawsze uważałem te inne narzędzia (v.transform / affine) za znacznie bardziej kłopotliwe. Czy ktoś nie próbował odtworzyć łatwości ShapeWarp w QGIS?
Sharad
2

Kilka podanych tutaj odpowiedzi nie jest już opcjami dla QGIS 3 i / lub pozwala jedynie na liniowe transformacje georeferencji pliku wektorowego. To może odpowiedzieć na pytanie PO, ale inni, którzy patrzą na ten post, mogą chcieć innych opcji transformacji plików wektorowych georeferencji.

Problemy z niektórymi rozwiązaniami dla plików wektorowych georeferencji:

  • Wtyczka qgsAffine pozwala tylko na transformacje liniowe. Oznacza to, że może skalować, obracać i przenosić plik wektorowy, ale nie może zginać ani wypaczać pliku wektorowego. Georeferencer dla plików rastrowych zapewnia więcej opcji i pozwala na różnorodne transformacje, w tym wielomian drugiego rzędu i splajn cienkiej blachy. Nie wydaje się też, aby wtyczka qgsAffine była nadal dostępna w QGIS 3.

  • Moduł GRASS v.transform jest podobny do wtyczki qgsAffine i pozwala tylko na transformacje liniowe.

  • Wtyczka Vector Bender wygląda na dobrą opcję, ale nie została w pełni przeniesiona do QGIS 3, więc obecnie nie jest opcją. Wygląda na to, że nie jest już utrzymywany.

Korzystanie z ogr2ogr, jak sugeruje post HeikkiVesanto, jest dobrą opcją. Umożliwia korzystanie z GCP (naziemnych punktów kontrolnych) i określenie, jakiego rodzaju transformacji chcesz. Nigdzie nie mogłem znaleźć instrukcji, jak to zrobić, dlatego zamieściłem kilka instrukcji poniżej:

  1. Wygeneruj zestaw par GCP, z których jeden punkt jest pierwotną lokalizacją w niegeoreferencyjnym pliku wektorowym, a drugi punkt jest pożądaną lokalizacją w georeferencyjnym obszarze roboczym.

  2. Istnieje wiele sposobów generowania GCP. Użyłem wtyczki Georeferencer GDAL w QGIS. Jest to dostępne w menu rozwijanym Raster po zainstalowaniu za pomocą Menedżera wtyczek. Działa tylko na plikach rastrowych, więc najpierw musisz przekonwertować plik wektorowy na plik rastrowy. Jest to możliwe dzięki „Processing Toolbox: GDAL: Konwersja wektorowa: Rasterize (wektor na raster)”. Ustaw rozdzielczość na liczbę, która nadal pozwala zobaczyć funkcje pliku wektorowego.

  3. Georeferencer ma ładny interfejs, który pozwala dodawać wiele punktów GCP. Możesz także przetestować różne transformacje i zobaczyć, które działa najlepiej. I możesz sprawdzić, czy któryś z twoich punktów GCP może być w błędzie, patrząc na ich resztki. Po dodaniu wszystkich punktów GCP i sprawdzeniu, czy podoba ci się wynik, możesz wyeksportować plik GCP z Georeferencji, aby użyć go do georeferencji oryginalnego pliku wektorowego.

  4. Plik GCP musi zostać zmieniony, aby mieć następujący format. Możesz dodać dowolną liczbę punktów GCP, każdy poprzedzony jest -gcp i oddzielony spacją. Uruchomiłem to z ponad 800 punktami GCP i działało świetnie.

    -gcp <ungeoref_x1> <ungeoref_y1> <georef_x1> <georef_y1> -gcp <ungeoref_x2> <ungeoref_y2> <georef_x2> <georef_y2>
  1. Istnieje wiele sposobów zmiany punktów GCP na odpowiedni format. Zaimportowałem je do Excela jako plik csv i utworzyłem kolumnę, aby wyświetlać właściwy format dla każdego punktu. Następnie wkleiłem tę kolumnę do TextEdit i zastąpiłem końce linii spacjami.

  2. Plik wektorowy, do którego chcesz dokonać georeferencji, powinien zostać zaimportowany do twojego obszaru roboczego przy użyciu tego samego SRS, który chcesz dla końcowego pliku georeferencyjnego, który powinien być taki sam SRS jak twój obszar roboczy. Może być daleko od miejsca, w którym powinien być, jeśli pierwotnie używał innego SRS, ale transformacja przeniesie go do właściwej lokalizacji.

  3. Wejdź do ogr2ogr poprzez „Processing Toolbox: GDAL: Konwersja wektorowa: Konwertuj format”. Pozwala to wybrać plik wektorowy, który chcesz georeferencją, oraz plik wyjściowy. W polu „Dodatkowe opcje tworzenia” dodaj polecenie określające żądany typ transformacji, a następnie linię ze wszystkimi punktami GCP.

  4. Polecenia dla różnych typów transformacji obejmują:

    • „-order 1” dla liniowego
    • „-order 2” dla wielomianu drugiego rzędu
    • „-order 3” dla wielomianu trzeciego rzędu
    • „-tps” dla cienkiego splajnu płytowego.
  5. Na przykład kod dodany do pola „Dodatkowe opcje tworzenia” może wyglądać następująco:

-order 2 -gcp <ungeoref_x1> <ungeoref_y1> <georef_x1> <georef_y1> -gcp <ungeoref_x2> <ungeoref_y2> <georef_x2> <georef_y2>
stu
źródło