Pierwszą rzeczą do zrobienia jest określenie nakładającego się prostokąta we współrzędnych geoprzestrzennych. Aby to zrobić, otrzymasz geotransformę dla każdego obrazu źródłowego:
gt1 = ds1.GetGeoTransform()
# r1 has left, top, right, bottom of dataset's bounds in geospatial coordinates.
r1 = [gt1[0], gt1[3], gt1[0] + (gt1[1] * ds1.RasterXSize), gt1[3] + (gt1[5] * ds1.RasterYSize)]
# Do the same for dataset 2 ...
intersection = [max(r1[0], r2[0]), min(r1[1], r2[1]), min(r1[2], r2[2]), max(r1[3], r2[3])]
Następnie przekonwertuj ten prostokąt na piksele dla każdego obrazu, odejmując górne i lewe współrzędne i dzieląc przez rozmiar pikseli, zaokrąglając w górę.
Stąd możesz wywoływać ReadRaster()
każdy obraz, nadając mu zakres pikseli, który właśnie obliczyłeś:
band.ReadRaster(px1[0], px1[1], px1[2] - px1[0], px1[3] - px1[1], px1[2] - px1[0], px1[3] - px1[1],
# <band's datatype here>
)
Jestem trochę zmęczony, więc jeśli to nie ma sensu, daj mi znać!
gt1[1]
igt2[1]
(lubgt1[5]
igt2[5]
) mają przeciwne znaki? (Jak sądzę, który przewróciłby jeden z rastrów w pionie lub w poziomie). Albo jeśliabs(gt1[2])
iabs(gt1[4])
są większe niżabs(gt1[1])
iabs(gt1[5])
aleabs(gt2[2])
iabs(gt2[4])
są mniejsze niżabs(gt2[1])
iabs(gt2[5])
(co prawdopodobnie przewróciłoby jeden z rastrów po przekątnej)?Trzecim elementem przecięcia powinno być min (r1 [2], r2 [2]):
Ponadto zaleciłbym pewną logikę, aby sprawdzić, czy zbiory danych faktycznie się przecinają.
To jest jedno podejście:
źródło