¿Extrae valores ráster en puntos usando Open Source GIS?

18

¿Cómo puedo extraer valores de un ráster por puntos?

Prefiero no en Arcgis.

Prefiero en Qgis o Mapwindow u otros gis de código abierto.

    
pregunta Vassilis 16.11.2010 - 10:37

10 respuestas

34

QGIS "Point Sampling Tool" debe ser el complemento que está buscando.

Aquí hay una descripción detallada de cómo usarlo: enlace

Actualización basada en el comentario de Paolo:

el complemento no es la única solución, y ya no es la solución más fácil. Una solución alternativa es la función Saga "Agregar valores ráster al punto" en la caja de herramientas de procesamiento. Consulte para obtener más información enlace

    
respondido por el underdark 16.11.2010 - 14:07
6

En PostGIS 2.0 puedes hacer:

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

Asegúrese de que su ráster tenga un mosaico muy pequeño cuando lo cargue (-t 10x10 con el cargador).

    
respondido por el Pierre Racine 14.03.2012 - 10:09
4

Las herramientas GME de Hawthorne Beyer lo hacen muy bien a través de la línea de comandos, y permiten un fácil procesamiento por lotes con bucles 'for'.

isectpntrst(in="path/to/shapefile", raster="path/to/raster", field="fieldname")

referencia del comando GME isectpntrst

    
respondido por el jbaums 16.11.2010 - 23:39
3

En GRASS GIS, puede consultar el mapa en la GUI o usar enlace

    
respondido por el markusN 18.11.2010 - 20:47
3

enlace tiene una guía paso a paso para utilizar los valores ráster de extracción de paquetes R ráster de los puntos.

    
respondido por el EvilInside 11.10.2012 - 23:48
2

Puedes usar esto: enlace

¡Está en la caja de herramientas SAGA de Qgis! Lo hace todo en un solo paso :)

    
respondido por el Stophface 29.02.2016 - 18:36
2

Intente usar QGIS 3.2.2 y SAGA (instalado de manera predeterminada en QGIS): la función "Valores de ráster a puntos" hará todo por usted: toma un archivo de imagen y lo convierte en una forma de vector de punto tomando la información de imagen rasterizada.

    
respondido por el Fernando MM 06.09.2018 - 20:18
1

Si tiene acceso a FME , entonces puede usar uno de los dos transformadores en FME Workbench.

El RasterCellCoercer ("Descompone todas las características de ráster numéricas de entrada en puntos o polígonos individuales. Se genera una característica vectorial para cada celda en el ráster.")

El PointOnRasterValueExtractor ("Toma características de puntos y un ráster de referencia único. La salida consta de la banda y los valores de la paleta en la ubicación de cada punto.")

    
respondido por el Mark Ireland 17.11.2010 - 19:04
1

Aquí hay una función que escribí usando python y gdal. La función toma una lista de rásteres y un marco de datos de pandas que contiene las coordenadas del punto y devuelve un marco de datos de pandas con las coordenadas del punto, los centroides para las celdas ráster respectivas y los valores de celda respectivos. La función forma parte del paquete chorospy del paquete en desarrollo (se encuentra aquí ).

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

Ejemplo de cómo ejecutarlo, dado que los rásteres están en su directorio de trabajo actual:

rasDf = getValuesAtPoint('.', ['raster1', 'raster2'], inPoints, 'x', 'y')
    
respondido por el spyrostheodoridis 03.09.2017 - 11:25
0

Pensamiento rápido:

  1. gdal_polygonize.py - poligoniza tu función ráster
  2. Inserte sus características de punto y polígonos en la base de datos de PostGIS
  3. Use la función st_intersects para extraer todos los valores de elevación donde las entidades se intersecan
respondido por el user5584 12.03.2012 - 19:18

Lea otras preguntas en las etiquetas