Я действительно новичок в Python и хотел бы знать, существует ли быстрый метод получения значений ячеек растрового пикселя за пикселем и координат (координата XY центра каждого пикселя) с использованием Python в ArcGIS 10?
Чтобы описать это далее, мне нужно получить карту X, карту Y и значение ячейки первого пикселя, назначить эти три значения трем переменным и повторить этот шаг для остальных остальных пикселей (цикл по всему растру).
Я думаю, что мне нужно описать мой вопрос больше. Проблема в том, что мне нужно получить XY-расположение пикселя первого растра и получить значения ячеек нескольких других растров, соответствующих этому XY-расположению. Этот процесс должен проходить по циклу через каждый пиксель первого растра без создания шейп-файла промежуточной точки, так как он будет действительно очень трудоемким, поскольку мне приходится обрабатывать растр с почти 8 миллиардами пикселей. Кроме того, мне нужно сделать это с помощью Python в ArcGIS 10.
@JamesS: Большое спасибо за ваше предложение. Да, это будет работать для одного растра, но мне нужно также собрать значения ячеек для нескольких других растров. Проблема в том, что после получения координат X и Y первого пикселя первого растра мне нужно получить значение ячейки второго растра, соответствующее этому X, Y местоположению первого растра, затем третьего растра и так далее. Итак, я думаю, что при циклическом прохождении первого растра получение X и Y местоположения пикселя и получение значений ячеек другого растра, соответствующего этому местоположению, должно выполняться одновременно, но я не уверен. Это можно сделать, преобразовав первый растр в шейп-файл точки и выполнив Извлечение многозначностей в функцию точки в ArcGIS 10, но я
@hmfly: Спасибо, да, этот метод (RastertoNumpyarray) будет работать, если я смогу получить координату известного значения строки и столбца массива.
@whuber: я не хочу выполнять какие-либо вычисления, все, что мне нужно сделать, это записать координаты XY и значения ячеек в текстовый файл, и это все
источник
Ответы:
Следуя идее @ Dango, я создал и протестировал (на небольших растрах с одинаковым экстентом и размером ячейки) следующий код:
На основе кода @hmfly вы можете получить доступ к нужным значениям:
К сожалению, есть одно «но» - код подходит для массивов NumPy, которые могут обрабатываться системной памятью. Для моей системы (8 ГБ) самый большой массив был около 9000,9000.
Поскольку мой опыт не позволяет мне предоставлять дополнительную помощь, вы можете рассмотреть некоторые предложения по работе с большими массивами: /programming/1053928/python-numpy-very-large-matrices
arcpy.RasterToNumPyArray
метод позволяет указать подмножество растра, преобразованного в массив NumPy ( страница справки ArcGIS10 ), что может быть полезно при разбиении большого набора данных на подматрицы.источник
Если вы просто хотите получить значения пикселей (строка, столбец), вы можете написать скрипт arcpy так:
Но если вы хотите получить координату пикселя, NumPyArray вам не поможет. Вы можете преобразовать растр в точку с помощью RasterToPoint Tool, а затем вы можете получить координату по форме Shape.
источник
Самый простой способ вывода координат и значений ячеек в текстовый файл в ArcGIS 10 - это функция примера , не требующая кода и особенно не нуждающаяся в цикле по каждой ячейке. В ArcGIS <= 9.3x растровом калькуляторе раньше было так просто, как если
outfile.csv = sample(someraster)
бы он выводил текстовый файл со всеми (ненулевыми) значениями и координатами ячейки (в формате z, x, y). В ArcGIS 10 похоже, что аргумент «in_location_data» теперь является обязательным, поэтому вам нужно использовать синтаксисSample(someraster, someraster, outcsvfile)
.Изменить: Вы также можете указать несколько растров:
Sample([someraster, anotherraster, etc], someraster, outcsvfile)
. Будет ли это работать на 8 миллиардов ячеек, у меня нет идеи ...Редактировать: Обратите внимание, я не проверял это в ArcGIS 10, но использовал функцию примера в течение многих лет в <= 9.3 (и на рабочей станции).
Редактировать: сейчас я протестировал в ArcGIS 10, и он не будет выводиться в текстовый файл. Инструмент автоматически изменяет расширение файла на «.dbf». Однако ... следующий код Python работает как операторы алгебры карт SOMA и MOMA , все еще поддерживаются в ArcGIS 10:
источник
Один из способов сделать это - использовать инструмент Raster_To_Point , а затем инструмент Add_XY_Coordinates . В итоге вы получите шейп-файл, где каждая строка в таблице атрибутов представляет пиксель вашего растра со столбцами для X_Coord , Y_Coord и Cell_Value . Затем вы можете зациклить эту таблицу с помощью курсора (или экспортировать ее в что-то вроде Excel, если хотите).
Если у вас есть только один растр для обработки, он, вероятно, не стоит создавать сценарии - просто используйте инструменты из ArcToolbox. Если вам нужно сделать это для многих растров, вы можете попробовать что-то вроде этого:
[ Примечание: у меня нет ArcGIS 10 и я не знаком с ArcPy, так что это просто очень грубый набросок. Он не проверен и почти наверняка нуждается в настройке, чтобы заставить его работать.]
Затем вы можете перебирать таблицы атрибутов shapefile, используя курсор поиска, или (возможно, проще), используя dbfpy . Это позволит вам считывать данные из вашего растра (теперь хранящиеся в таблице .dbf в шейп-файле) в переменные python.
источник
Может быть, вы могли бы создать мировой файл для растра, преобразовать растр в пустой массив. затем, если вы зациклите массив, вы получите значения ячеек, и если вы постепенно обновите x, y из файла мира, у вас также будут координаты для каждого значения ячейки. надеюсь, что это полезно.
источник
Код Марцина работал нормально, за исключением проблемы в функциях rasCentrX и rasCentrY, которая приводила к тому, что выходные координаты появлялись с другим разрешением (как заметил Грация). Мое решение было изменить
в
и
в
Я использовал код для преобразования сетки ESRI в файл CSV. Это было достигнуто путем удаления ссылки на inRaster2, а затем использования csv.writer для вывода координат и значений:
Я также не нашел, что транспонирование было необходимо в
так преобразовал это в
источник
Уродливый, но очень эффективный:
источник
Простое решение с использованием пакетов Python с открытым исходным кодом:
Fiona удобна тем, что вы можете открывать шейп-файл, перебирать объекты и (как у меня) добавлять их к
dict
объекту. Действительно, сама Фионаfeature
похожа наdict
тоже нее, поэтому к ней легко получить доступ. Если бы у моих точек были какие-либо атрибуты, они появлялись бы в этой записи вместе с координатами, идентификатором и т. Д.Растерио удобно, потому что его легко читать в растре как простой массив, легкий и быстрый тип данных. У нас также есть доступ к a
dict
свойств растра, включаяaffine
все данные, которые нам нужны для преобразования координат x, y растра в строку массива, координаты col. Смотрите отличное объяснение @ Perrygeo здесь .Мы получаем
pt_data
тип,dict
который имеет данные для каждой точки и извлеченные данныеraster_value
. Мы можем легко переписать шейп-файл с извлеченными данными, если захотим.источник