Вилучення растрових значень у точках за допомогою ГІС з відкритим кодом?


21

Як я можу витягувати значення з растру за балами?

Я вважаю за краще не в Аркгізі.

Я віддаю перевагу Qgis або Mapwindow або іншим відкритим вихідним кодам.


1
Отже, у вас є точки, і вам потрібно витягнути значення з растру під цими точками, або вам потрібно перетворити растрові комірки в точки. Тільки перевіряю, перш ніж спробувати і відпрацювати відповідь.
Nathan W

По-перше, у мене є бали, і мені потрібно витягнути цінні показники з растру під тими балами. THNX !!
Василіс

Відповіді:


37

QGIS "Інструмент відбору точок" повинен бути плагіном, який ви шукаєте.

Ось детальний опис його використання: 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/


5
Люди досі знаходять вищезгадану посаду за допомогою цього запитання. Однак плагін - це не єдине рішення, і не завжди найпростіше рішення. Альтернативним рішенням є функція Saga «Додавання значень сітки до точки» в панелі інструментів обробки. Детальніше дивіться у цій публікації .
Ecodiv

Обережність. Я щойно запустив інструмент точкового відбору проб. 60 000 балів і 13 растрових. Результати не вдалися до мого 30 випадкових вибіркових тестів на кожен рік Цей інструмент має проблеми з великими наборами даних. Я б не користувався цим.
Якщо ви не знаєте - просто ГІС

Незважаючи на згадані проблеми із великими наборами даних, це дуже корисно для вилучення всіх багатополосних значень за один раз. Усі інші рішення, пов'язані з QGIS, підтримують лише вилучення однієї смуги (наприклад, GRASS r.what) або забороняють використовувати багатосмуговий растр (як Saga - значення растрових точок).
EikeMike

7

У PostGIS 2.0 ви можете:

SELECT ST_Value(rast, geom) val
FROM yourrastertabe, yourpointtable
WHERE ST_Intersects(rast, geom)

Переконайтесь, що ваш растр є плитковим дуже маленьким, коли ви завантажуєте його (-t 10x10 з навантажувачем).


7

У мене виникли проблеми з інструментами QGIS та SAGA GUI, згаданими в цій темі ( Raster values to pointsз якихось причин вийшов з ладу і викинув непотрібні помилки; GRASS v.sampleстворив цілком новий шар, який не був корисним). Після деякого відмови від інструментів GUI деякий час я спробував це зробити в Field Calculator. Це спрацювало досить добре, і я зміг контролювати процес трохи краще, ніж дозволяють графічні інтерфейси, і робити деякі інші розрахунки на цьому шляху.

Скажімо, у вас є шар з ім'ям ptsта іншим назвою rast, обидва в одній і тій же системі координат. Ви хочете зробити вибірку rastдля кожної пари X, Y, представленої в pts.

Якщо ви раніше не використовували Field Calculator, це досить просто. Ви введете свій розрахунок у поле "Вираз", і Q дає ряд змінних та операцій у середньому стовпчику, з текстом довідки у правій колонці. Я розбию цей процес на чотири кроки:

  1. Відкрийте таблицю атрибутів ptsшару, з яким ви хочете пробувати вибірку.

  2. Після переходу до діалогового вікна «Калькулятор поля» виберіть, чи хочете ви створити нове поле або змінити наявне поле у вашому ptsшарі.

  3. Далі, побудуйте вираз для заповнення нового або існуючого ptsстовпця атрибутів. Ви можете почати, змінивши код виразу, який працював на мене:

raster_value('rast', 1, make_point($x, $y))
  1. Ви повинні надати 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повинні бути в одній системі координат, щоб цей метод працював.


1
це найкраща відповідь на це запитання
BC B.

6

Спробуйте використовувати QGIS 3.2.2 та SAGA (встановлені за замовчуванням у QGIS): Функція "Растрові значення для точок" зробить все за вас: він бере файл зображення та перетворює його у форму точкового вектора, беручи інформацію з растрового зображення.



3

У GRASS GIS можна або здійснити запит на карту в графічному інтерфейсі, або скористатися http://grass.osgeo.org/gdp/html_grass64/r.what.html


2
Для Grass я знайшов це: pvanb.wordpress.com/2010/05/05/…
Vassilis

Ще один модуль GRASS, який здатний вибирати растр, є v.sample, який також доступний через панель інструментів QGIS для обробки.
user55937



2

Ось функцію, яку я написав за допомогою python та gdal. Функція приймає список растрових даних і рамки даних панди, що містять точкові координати, і повертає кадр даних панди з точковими координатами, центроїдами для відповідних растрових комірок і відповідними значеннями комірок. Функція є частиною пакету хороспій, що розробляється, (знайдено тут ).

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')

1

Якщо у вас є доступ до FME, ви можете використовувати один з двох трансформаторів у робочому місці FME.

RasterCellCoercer ( «Розкладається все вхідні числовими особливості растрових точок на окремі або багатокутники. Один вектор ознак виводяться для кожного осередку в растрі.»)

PointOnRasterValueExtractor ( «приймає в точкових функцій і одного опорного растра. Висновок складається з смуги і палітри значення (ів) в місці розташування кожної точки.»)


Ні, я не маю або не використовую FME, це окрема програма або плагін?
Василіс

0

Швидка думка:

  1. gdal_polygonize.py - полігонізуйте функцію растру
  2. Вставте свої точкові функції та полігони в базу даних PostGIS
  3. Використовуйте функцію st_intersects, щоб витягнути всі значення висоти, де перетинаються функції

цікавий підхід, адже вчора почніть вивчати, як користуватися Postgis.
Василіс

Дякую, це досить спрощено, але це працює. Ось що мені вдалося створити за допомогою такого підходу: i.imgur.com/h8CGJ.png
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.