Я хочу создать растр с разрешением 25 х 25 м, в котором каждая ячейка содержит расстояние до ближайшей береговой линии, рассчитанное по центру ячейки. Для этого у меня есть только шейп-файл побережья Новой Зеландии .
Я пытался следовать учебному пособию Доминика Роя для того, чтобы сделать это в R, что работает ... вроде. Это нормально до разрешения около 1 км × 1 км, но если я пытаюсь подняться выше, то ОЗУ, которое требуется, значительно превышает доступное на моем ПК (требуется ~ 70 ГБ ОЗУ) или любой другой, к которому у меня есть доступ. Говоря об этом, я думаю, что это ограничение R, и я подозреваю, что QGIS может иметь более вычислительно эффективный способ создания этого растра, но я новичок в этом и не могу понять, как это сделать.
Я пытался следовать Создание растра с расстоянием до объекта, используя QGIS? создать его в QGIS, но он возвращает эту ошибку:
_core.QgsProcessingException: не удалось загрузить исходный слой для INPUT: C: /..../ Coastline / nz-coastlines-and-Islands-polygons-topo-150k.shp не найден
и я не уверен почему.
У кого-нибудь есть какие-либо предположения о том, что может пойти не так или альтернативный способ сделать это?
Редактировать:
Растр, который я надеюсь создать, будет иметь около 59684 строк и 40827 столбцов, чтобы он перекрывался с годовым растром дефицита воды в LINZ. Если создаваемый растр больше, чем годовой растр с дефицитом воды, я могу отсечь его в R, хотя ...
Одна вещь, которая, я думаю, может быть потенциальной проблемой, состоит в том, что шейп-файл береговой линии Новой Зеландии имеет большое количество моря между островами, и я не заинтересован в расчете расстояния до побережья для этих ячеек. Я действительно хочу только рассчитать значения для ячеек, которые включают какой-то кусок земли. Я не уверен, как это сделать, или если это действительно проблема, хотя.
источник
Ответы:
С PyQGIS и библиотекой Python GDAL это не очень сложно сделать. Для создания результирующего растра нужны параметры геопреобразования (верхний левый x, разрешение в пикселях x, вращение, верхний левый y, вращение, разрешение в пикселях ns), а также количество строк и столбцов. Для расчета расстояния до ближайшей береговой линии необходим векторный слой для представления береговой линии.
С помощью PyQGIS вычисляется каждая растровая точка в качестве центра ячейки, а ее расстояние до береговой линии измеряется с помощью метода closestSegmentWithContext из класса QgsGeometry . Библиотека Python GDAL используется для создания растра с этими значениями расстояния в массиве строк х столбцов.
Следующий код был использован для создания растрового расстояния (разрешение 25 м х 25 м и 1000 строк х 1000 столбцов), начиная с точки (397106.7689872353, 4499634.06675821); недалеко от западного побережья США.
После выполнения кода выше полученный растр был загружен в QGIS и выглядит так, как показано на следующем рисунке (псевдоцвет с 5 классами и спектральной рампой). Проекция - UTM 10 N (EPSG: 32610)
источник
Может быть решение попробовать:
Теперь у вас должен быть новый точечный слой с расстоянием до побережья, как в этом примере
источник
В QGIS вы можете попробовать плагин GRASS. Насколько я знаю, он управляет памятью лучше, чем R, и я ожидаю, что другое решение даст сбой на больших площадях.
Команда GRASS называется r.grow.distance, которую вы можете найти на панели инструментов обработки. Обратите внимание, что вам нужно сначала преобразовать вашу линию в растр.
Одной из ваших проблем может быть размер выходных данных, поэтому вы можете добавить некоторые полезные параметры создания, такие как (для файла TIF) BIGTIFF = YES, TILED = YES, COMPRESS = LZW, PREDICTOR = 3
источник
Я бы попробовал другой путь. Если вы используете полигон NZ, тогда преобразуйте ребра полигона в линию. После этого создайте буфер на границе на каждые 25 метров расстояния от границы (возможно, Centorid может помочь определить, когда остановиться). Затем вырежьте буферы с помощью многоугольника и затем конвертируйте эти многоугольники в растр. Я не уверен, что это сработает, но определенно вам понадобится меньше оперативной памяти. И PostGiS великолепен, когда у вас есть проблемы с производительностью.
Надеюсь, это поможет хоть немного :)
источник
Изначально я не собирался отвечать на свой вопрос, но мой коллега (который не использует этот сайт) написал мне кучу кода на Python, чтобы делать то, что я делаю; включая ограничение ячеек расстоянием до побережья только для наземных ячеек и оставление морских ячеек в качестве NA. Следующий код должен быть в состоянии работать с любой консоли Python, единственное, что нужно изменить:
1) Поместите файл скрипта в ту же папку, что и интересующий вас файл формы;
2) измените имя шейп-файла в скрипте Python на любое имя вашего шейп-файла;
3) установить желаемое разрешение и;
4) измените экстент, чтобы соответствовать другим растрам.
Большие шейп-файлы, чем те, которые я использую, потребуют большого объема оперативной памяти, но в противном случае скрипт будет быстро запущен (около трех минут для создания растра с разрешением 50 м и десяти минут для растра с разрешением 25 м).
источник