Jestem naprawdę nowy w Pythonie i chciałbym wiedzieć, czy istnieje szybka metoda uzyskiwania wartości komórek piksela rastrowego piksel po pikselu i współrzędnych (współrzędna mapy XY środka każdego piksela) za pomocą Pythona w ArcGIS 10?
Aby opisać to dokładniej, muszę uzyskać mapę X, mapę Y i wartość komórki pierwszego piksela, przypisać te trzy wartości do trzech zmiennych i powtórzyć ten krok dla pozostałych pikseli (pętla przez cały raster).
Myślę, że muszę bardziej opisać moje pytanie. Problem w tym, że muszę uzyskać lokalizację XY piksela pierwszego rastra i uzyskać wartości komórek kilku innych rastrów odpowiadających tej lokalizacji XY. Proces ten powinien przebiegać w pętli przez każdy piksel pierwszego rastra bez tworzenia pliku kształtu pośredniego punktu, ponieważ zajmie to naprawdę dużo czasu, ponieważ muszę obsługiwać raster z prawie 8 miliardami pikseli. Ponadto muszę to zrobić za pomocą Pythona w ArcGIS 10.
@JamesS: Dziękuję bardzo za sugestię. Tak, to zadziałałoby dla jednego rastra, ale muszę również zebrać wartości komórek dla kilku innych rastrów. Problem polega na tym, że po uzyskaniu współrzędnych X i Y pierwszego piksela pierwszego rastra muszę uzyskać wartość komórki drugiego rastra odpowiadającą lokalizacji X, Y pierwszego rastra, a następnie trzeciego rastra i tak dalej. Tak więc myślę, że podczas zapętlania pierwszego rastra pobieranie lokalizacji X i Y piksela i uzyskiwanie wartości komórek drugiego rastra odpowiadających tej lokalizacji powinno odbywać się jednocześnie, ale nie jestem pewien. Można to zrobić, konwertując pierwszy raster na plik kształtu punktu i wykonując Wyodrębnij wielowartościowe do funkcji punktowej w ArcGIS 10, ale ja '
@hmfly: Dzięki, tak, ta metoda (RastertoNumpyarray) zadziała, jeśli uda mi się uzyskać współrzędne znanej wartości wiersza i kolumny tablicy.
@ whuber: Nie chcę wykonywać żadnych obliczeń, wszystko, co muszę zrobić, to zapisać współrzędne XY i wartości komórek w pliku tekstowym i to wszystko
źródło
Odpowiedzi:
Zgodnie z pomysłem @ Dango stworzyłem i przetestowałem (na małych rastrach o tym samym zasięgu i rozmiarze komórki) następujący kod:
Na podstawie kodu @hmfly możesz uzyskać dostęp do pożądanych wartości:
Niestety istnieje jedno „ale” - kod jest odpowiedni dla tablic NumPy, które mogą być obsługiwane przez pamięć systemową. W moim systemie (8 GB) największa tablica wynosiła około 9000,9000.
Ponieważ moje doświadczenie nie pozwala mi zapewnić więcej pomocy, możesz rozważyć kilka sugestii dotyczących postępowania z dużymi tablicami: /programming/1053928/python-numpy-very-large-matrices
arcpy.RasterToNumPyArray
Metoda pozwala określić podzbiór rastra przekonwertowanego na tablicę NumPy ( strona pomocy ArcGIS10 ), co może być przydatne, gdy fragmentuje się duży zestaw danych w podmacierze.źródło
Jeśli chcesz tylko uzyskać wartości w pikselach (wiersz, kolumna), możesz napisać arkadowy skrypt w następujący sposób:
Ale jeśli chcesz uzyskać współrzędną piksela, NumPyArray nie może ci pomóc. Możesz przekonwertować raster na punkt za pomocą narzędzia RasterToPoint, a następnie możesz uzyskać współrzędne według pola Kształt.
źródło
Najprostszym sposobem na wyprowadzenie współrzędnych i wartości komórek do pliku tekstowego w ArcGIS 10 jest funkcja przykładowa , bez potrzeby kodu, a zwłaszcza bez potrzeby zapętlania każdej komórki. W kalkulatorze rastrowym ArcGIS <= 9,3x był tak prosty, jak to,
outfile.csv = sample(someraster)
że generowałby plik tekstowy zawierający wszystkie wartości (nie zerowe) komórek i współrzędne (w formacie z, x, y). W ArcGIS 10 wygląda na to, że argument „in_location_data” jest teraz obowiązkowy, więc musisz użyć składniSample(someraster, someraster, outcsvfile)
.Edit: Można również określić wiele rastrów:
Sample([someraster, anotherraster, etc], someraster, outcsvfile)
. Czy to zadziała na 8 miliardach komórek, nie mam pojęcia ...Edycja: Uwaga, nie testowałem tego w ArcGIS 10, ale od lat korzystałem z przykładowej funkcji w <= 9,3 (i stacji roboczej).
Edycja: Testowałem już w ArcGIS 10 i nie będzie on wysyłany do pliku tekstowego. Narzędzie automatycznie zmienia rozszerzenie pliku na „.dbf”. Jednak ... następujący kod python działa, ponieważ instrukcje ArcMIS 10 są nadal obsługiwane przez instrukcje algebry map SOMA i MOMA :
źródło
Jednym ze sposobów jest użycie narzędzia Raster_To_Point , a następnie narzędzia Add_XY_Coordinates . Otrzymasz plik kształtu, w którym każdy wiersz w tabeli atrybutów reprezentuje piksel z twojego rastra z kolumnami dla X_Coord , Y_Coord i Cell_Value . Następnie możesz zapętlić tę tabelę za pomocą kursora (lub wyeksportować ją do czegoś takiego jak Excel, jeśli wolisz).
Jeśli masz tylko jeden raster do przetworzenia, prawdopodobnie nie warto pisać skryptów - po prostu skorzystaj z narzędzi ArcToolbox. Jeśli musisz to zrobić dla wielu rastrów, możesz spróbować czegoś takiego:
[ Uwaga: nie mam ArcGIS 10 i nie znam ArcPy, więc jest to bardzo ogólny zarys. Jest nieprzetestowany i prawie na pewno będzie wymagał modyfikacji, aby go uruchomić.]
Następnie można zapętlić tabele atrybutów shapefile za pomocą Search Cursor lub (być może prostszego) za pomocą dbfpy . Umożliwi to odczyt danych z twojego rastra (teraz zapisanego w tabeli shapefile .dbf) do zmiennych python.
źródło
Może mógłbyś utworzyć plik światowy dla rastra, ukryć raster w tablicy numpy. następnie, jeśli zapętlisz się nad tablicą, otrzymasz wartości komórek, a jeśli stopniowo zaktualizujesz x, y z pliku świata, będziesz również mieć współrzędne dla każdej wartości komórki. mam nadzieję, że się przyda.
źródło
Kod Marcina działał dobrze, z wyjątkiem tego, że problem z funkcjami rasCentrX i rasCentrY powodował, że współrzędne wyjściowe pojawiały się w innej rozdzielczości (jak zaobserwowała Grazia). Moją poprawką była zmiana
do
i
do
Użyłem tego kodu do konwersji siatki ESRI do pliku CSV. Osiągnięto to poprzez usunięcie odwołania do inRaster2, a następnie użycie csv.writer do wyprowadzenia współrzędnych i wartości:
Nie znalazłem też potrzeby transpozycji
więc przekonwertowałem to na
źródło
Brzydki, ale bardzo skuteczny:
źródło
Proste rozwiązanie z wykorzystaniem pakietów Pythona typu open source:
Fiona jest przydatna, ponieważ możesz otworzyć plik kształtu, iterować funkcje i (jak mam) dołączyć je do
dict
obiektu. Rzeczywiście,feature
sama Fiona również jest podobnadict
, więc łatwo jest uzyskać dostęp do właściwości. Gdyby moje punkty miały atrybuty, pojawiałyby się w tym dykcie wraz ze współrzędnymi, identyfikatorem itp.Rasterio jest przydatny, ponieważ jest łatwy do odczytu w rastrze jako tablica liczb liczbowych, lekki i szybki typ danych. Mamy również dostęp do jednej
dict
z właściwości rastra, w tym doaffine
wszystkich danych potrzebnych do przekształcenia współrzędnych x, y rastra na współrzędne wiersza tablic i kolumn. Zobacz doskonałe wyjaśnienie @ perrygeo tutaj .W efekcie powstaje
pt_data
typ,dict
który zawiera dane dla każdego punktu i jest wyodrębnianyraster_value
. Gdybyśmy chcieli, moglibyśmy również łatwo przepisać plik kształtu z wyodrębnionymi danymi.źródło