def shift(wkt, dx, dy):
from qgis.core import QgsGeometry, QgsPointXY
= QgsGeometry.fromWkt(wkt)
geometry = geometry.type().name
geom_type = geometry.vertices()
vertices
= []
shifted for vertex in vertices:
= vertex.x() + dx
new_x = vertex.y() + dy
new_y
shifted.append(QgsPointXY(new_x, new_y))
if geom_type == "Point":
return shifted
elif geom_type == "Line":
= QgsGeometry.fromPolylineXY(shifted)
new_geom elif geom_type == "Polygon":
= QgsGeometry.fromPolygonXY([shifted])
new_geom else:
raise ValueError("Nieobsługiwana geometria!")
return new_geom
Algorytmy danych geoprzestrzennych
Transformacje
Krzysztof Dyba
Dane rastrowe
Dane rastrowe w systemach informacji geograficznej reprezentują przestrzeń geograficzną poprzez georeferencję, która składa się z:
- zakresu przestrzennego (określonego przez cztery współrzędne),
- rozdzielczości przestrzennej (np. metry na piksel),
- układu przestrzennego.
Znając te parametry możemy dokonać transformacji z układu rastra (definiowanego przez wiersze oraz kolumny) do układu geograficznego (definiowanego przez długość oraz szerokość geograficzną) w następujący sposób:
Można także przeprowadzić tę operację w drugą stronę, obliczając numer wiersza i kolumny na podstawie współrzędnych geograficznych:
Powyższe funkcje zakładają, że początek układu znajduje się w lewym górnym rogu.
Dane wektorowe
Transformacje wektorowe to operacje matematyczne, które modyfikują geometrię obiektów. Zaliczamy do nich:
Przesunięcie
Przesunięcie obiektu o określoną odległość w określonym kierunku (nie zmienia rozmiaru, kształtu ani orientacji obiektu).
Przeskalowanie
Zmiana rozmiaru obiektu używając punkt obrotu oraz współczynnik skalowania. Współczynnik może być jednakowy w obu kierunkach lub różny (wtedy dodatkowo zmianie ulegnie kształt obiektu).
Transpozycja
Zamiana współrzędnych X i Y obiektów.
Odbicie
Odbicie obiektu przez określoną linię (oś odbicia), tworząc obraz lustrzany.
Odbicie pionowe, w którym to linia wertykalna:
Odbicie poziome, w którym to linia horyzontalna:
Obrócenie
Obrócenie obiektu wokół określonego punktu (np. centroidu) o dany kąt wyrażony w radianach (zmienia orientację obiektu, ale zachowuje jego kształt i rozmiar).
Przykład
Spróbujmy stworzyć prostą funkcję shift()
, która pozwoli przesunąć geometrię o zadane współrzędne X (dx
) i Y (dy
). Jako wejście wykorzystajmy reprezentacje WKT. Najistotniejszym zadaniem jest przesunięcie każdego wierzchołka o określoną odległość, do czego niezbędne jest zastosowanie pętli. Aby odwołać się do wierzchołków należy wykorzystać metodę vertices()
. Ostatni etap działa funkcji związany jest z odtworzeniem właściwej geometrii linii lub poligonu i zwrócenie wyniku.
= "POLYGON ((40 30, 60 30, 50 40, 40 30))"
poly = shift(poly, dx = 10, dy = 5)
poly_shift print(poly_shift)
<QgsGeometry: Polygon ((50 35, 70 35, 60 45, 50 35))>
W kolejnym kroku możemy wyświetlić zmodyfikowaną geometrię używając biblioteki matplotlib
. Jednak, uprzednio musimy zdefiniować pomocniczą funkcję, która posłuży do konwersji obiektu QgsGeometry
(lub WKT) do współrzędnych zapisanych jako listy z liczbami.
def geometry_to_coords(geometry):
from qgis.core import QgsGeometry
# przypadek geometrii z WKT
if isinstance(geometry, str):
= QgsGeometry.fromWkt(geometry)
geometry
= geometry.type().name
geom_type
if geom_type == "Point":
= geometry.asPoint()
x, y elif geom_type == "Line":
= geometry.asPolyline()
points = zip(*points)
x, y elif geom_type == "Polygon":
= geometry.asPolygon()
points for p in points:
= zip(*p)
x, y else:
raise ValueError("Nieobsługiwana geometria!")
return x, y
Teraz wyświetlmy obie geometrie.
import matplotlib.pyplot as plt
= geometry_to_coords(poly)[0]
x1 = geometry_to_coords(poly)[1]
y1 = geometry_to_coords(poly_shift)[0]
x2 = geometry_to_coords(poly_shift)[1]
y2
= (4, 3))
plt.figure(figsize = "grey", linestyle = "dashed", zorder = 1)
plt.plot(x1, y1, color = "blue", zorder = 2)
plt.fill(x2, y2, color "Przesunięcie (dx = 10, dy = 5)")
plt.title( plt.show()
Zadania
- Napisz funkcje
xy_from_colrow()
orazcolrow_from_xy()
, które umożliwią transformację kolumn i wierszy na współrzędne geograficzne oraz transformację w drugą stronę. Uwzględnij warunek sprawdzający czy szukane parametry znajdują się w zakresie rastra, tj. nie wychodzą poza jego zasięg. - Zaimplementuj dwie wybrane operacje transformacji geometrii, a następnie wyświetl ich wyniki. Jako przykładowe dane wykorzystaj poligon
"POLYGON ((40 30, 60 30, 50 40, 40 30))"
.