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


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.