Как извлечь значения из растра по точкам?
Я предпочитаю не в Arcgis.
Я предпочитаю в Qgis или Mapwindow или других открытых источниках ГИС.
Как извлечь значения из растра по точкам?
Я предпочитаю не в Arcgis.
Я предпочитаю в Qgis или Mapwindow или других открытых источниках ГИС.
Ответы:
QGIS "Point Sampling Tool" должен быть тем плагином, который вы ищете.
Вот подробное описание того, как его использовать: http://pvanb.wordpress.com/2010/02/15/sampling-raster-values-at-point-locations-in-qgis/
Обновление на основе комментария Паоло:
плагин - не единственное решение и не всегда самое простое решение. Альтернативным решением является функция Saga «Добавить растровые значения в точку» на панели инструментов обработки. Подробнее см. Http://pvanb.wordpress.com/2014/07/01/sampling-raster-values-at-point-locations-in-qgis-an-update/
В PostGIS 2.0 вы можете сделать:
SELECT ST_Value(rast, geom) val
FROM yourrastertabe, yourpointtable
WHERE ST_Intersects(rast, geom)
Убедитесь, что ваш растр очень маленький, когда вы загружаете его (-t 10x10 с загрузчиком).
У меня были проблемы с инструментами графического интерфейса QGIS и SAGA, упомянутыми в этой теме ( Raster values to points
по какой-то причине произошел сбой и возникли бесполезные ошибки, а GRASS v.sample
создала совершенно новый слой, который не помог). После некоторого сбоя инструментов GUI я попытался сделать это в Калькуляторе поля. Это сработало довольно хорошо, и я смог контролировать процесс немного лучше, чем позволяют графические интерфейсы, и по пути делать некоторые другие вычисления.
Скажем, у вас есть слой с именем pts
и другим именем rast
, оба в одной системе координат. Вы хотите сделать выборку rast
для каждой пары X, Y, представленной в pts
.
Если вы раньше не пользовались полевым калькулятором, это довольно просто. Вы введете свой расчет в поле «Выражение», а Q предоставит вам ряд переменных и операций в среднем столбце, с текстом справки в правом столбце. Я разделю этот процесс на четыре этапа:
Откройте таблицу атрибутов pts
слоя, с которым вы хотите выполнить выборку.
В диалоговом окне «Калькулятор полей» выберите, хотите ли вы создать новое поле или изменить существующее поле в своем pts
слое.
Затем создайте выражение, чтобы заполнить новый или существующий pts
столбец атрибута. Вы могли бы начать с изменения кода выражения, который работал для меня:
raster_value('rast', 1, make_point($x, $y))
raster_value()
имя растрового слоя 'rast'
, номер полосы 1
и геометрию точки в make_point()
. $x
и $y
являются геометрическими переменными, зависящими от местоположения точки в каждой строке таблицы атрибутов.Этот метод также позволяет выполнять арифметические операции , такие как вычитая значение другого растрового слоя под названием other_rast
от rast
, который спас мне кучу времени над инструментами графического интерфейса. Пример ниже:
raster_value('rast', 1, make_point($x, $y)) - raster_value('other_rast', 1, make_point($x, $y))
Отметим еще раз , что в три слоя pts
, rast
и other_rast
должны находиться в одной и той же системе координат , для этого метода к работе.
Попробуйте использовать QGIS 3.2.2 и SAGA (установленные по умолчанию в QGIS): функция «Растровые значения в точки» сделает все за вас: она берет файл изображения и преобразует его в форму вектора точек, получая информацию из растрового изображения.
GME-инструменты Hawthorne Beyer делают это красиво через командную строку и позволяют легко группировать циклы for.
isectpntrst(in="path/to/shapefile", raster="path/to/raster", field="fieldname")
В GRASS GIS вы можете запросить карту в графическом интерфейсе или использовать http://grass.osgeo.org/gdp/html_grass64/r.what.html
http://gis-techniques.blogspot.com/2012/10/extract-raster-values-from-points.html содержит пошаговое руководство по использованию пакета R Raster для извлечения растровых значений из точек.
Вы можете использовать это: http://www.saga-gis.org/saga_module_doc/2.1.3/shapes_grid_3.html
Это в SAGA Toolbox от Qgis! Делает все за один шаг :)
Вот функция, которую я написал, используя python и gdal. Функция берет список растров и кадр данных pandas, содержащий координаты точки, и возвращает кадр данных pandas с координатами точки, центроидами для соответствующих растровых ячеек и соответствующими значениями ячеек. Эта функция является частью пакета chorospy, находящегося в стадии разработки (находится здесь ).
import pandas
import numpy
from osgeo import gdal
def getValuesAtPoint(indir, rasterfileList, pos, lon, lat):
#gt(2) and gt(4) coefficients are zero, and the gt(1) is pixel width, and gt(5) is pixel height.
#The (gt(0),gt(3)) position is the top left corner of the top left pixel of the raster.
for i, rs in enumerate(rasterfileList):
presValues = []
gdata = gdal.Open('{}/{}.tif'.format(indir,rs))
gt = gdata.GetGeoTransform()
band = gdata.GetRasterBand(1)
nodata = band.GetNoDataValue()
x0, y0 , w , h = gt[0], gt[3], gt[1], gt[5]
data = band.ReadAsArray().astype(numpy.float)
#free memory
del gdata
if i == 0:
#iterate through the points
for p in pos.iterrows():
x = int((p[1][lon] - x0)/w)
Xc = x0 + x*w + w/2 #the cell center x
y = int((p[1][lat] - y0)/h)
Yc = y0 + y*h + h/2 #the cell center y
try:
if data[y,x] != nodata:
presVAL = [p[1][lon],p[1][lat], '{:.6f}'.format(Xc), '{:.6f}'.format(Yc), data[y,x]]
presValues.append(presVAL)
except:
pass
df = pandas.DataFrame(presValues, columns=['x', 'y', 'Xc', 'Yc', rs])
else:
#iterate through the points
for p in pos.iterrows():
x = int((p[1][lon] - x0)/w)
y = int((p[1][lat] - y0)/h)
try:
if data[y,x] != nodata:
presValues.append(data[y,x])
except:
pass
df[rs] = pandas.Series(presValues)
del data, band
return df
Пример того, как его запустить, учитывая, что растры находятся в вашем текущем рабочем каталоге:
rasDf = getValuesAtPoint('.', ['raster1', 'raster2'], inPoints, 'x', 'y')
Если у вас есть доступ к FME, вы можете использовать один из двух трансформаторов в FME Workbench.
RasterCellCoercer ( «Разлагается все входные числовыми особенности растровых точек на отдельные или многоугольники. Один вектор признаков выводятся для каждой ячейки в растре.»)
PointOnRasterValueExtractor ( «принимает в точечных функций и одного опорного растра. Вывод состоит из полосы и палитры значения (ов) в месте расположения каждой точки.»)
Быстрая мысль: