오픈 소스 GIS를 사용하여 포인트에서 래스터 값을 추출 하시겠습니까?


21

포인트로 래스터에서 값을 추출하려면 어떻게해야합니까?

나는 Arcgis를 선호하지 않습니다.

Qgis 또는 Mapwindow 또는 다른 오픈 소스 gis를 선호합니다.


1
따라서 포인트가 있고 해당 포인트 아래의 래스터에서 값을 추출하거나 래스터 셀을 포인트로 변환해야합니다. 답변을 시도하기 전에 확인하십시오.
Nathan W

첫째, 나는 포인트를 가지고 있으며 그 포인트 아래에서 래스터에서 값을 추출해야합니다. THNX !!
Vassilis

답변:


37

QGIS "Point Sampling Tool"은 원하는 플러그인이어야합니다.

사용 방법에 대한 자세한 설명은 다음과 같습니다. http://pvanb.wordpress.com/2010/02/15/sampling-raster-values-at-point-locations-in-qgis/

Paolo의 의견을 기반으로 업데이트 :

플러그인이 유일한 솔루션은 아니며 더 이상 항상 가장 쉬운 솔루션은 아닙니다. 대안적인 솔루션은 처리 툴박스에서 Saga 함수 '포스터에 래스터 값 추가'입니다. 자세한 내용은 http://pvanb.wordpress.com/2014/07/01/sampling-raster-values-at-point-locations-in-qgis-an-update/ 를 참조 하십시오


5
사람들은 여전히이 Q & A를 통해 위에서 언급 한 게시물을 찾고 있습니다. 그러나 플러그인이 유일한 솔루션은 아니며 더 이상 가장 쉬운 솔루션은 아닙니다. 대안적인 솔루션은 처리 툴박스에서 Saga 기능 '지표에 그리드 값 추가'입니다. 이 게시물에 대한 자세한 내용을 참조하십시오 .
Ecodiv

주의. 방금 포인트 샘플링 도구를 실행했습니다. 60,000 포인트와 13 개의 래스터. 결과는 매년 30 개의 무작위 샘플 테스트에 실패했습니다. 이 도구에는 큰 데이터 세트에 문제가 있습니다. 나는 그것을 사용하지 않을 것입니다.
모르는 경우 GIS

대규모 데이터 세트에서 언급 된 문제에도 불구하고 한 번에 모든 다중 대역 값 을 추출하는 데 매우 유용합니다 . 다른 모든 QGIS 관련 솔루션은 GRASS r.what과 같은 한 대역의 추출 만 지원하거나 다중 대역 래스터 (예 : Saga-래스터 값-포인트)의 사용을 금지합니다.
EikeMike

7

PostGIS 2.0에서는 다음을 수행 할 수 있습니다.

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

래스터를로드 할 때 래스터가 매우 작은 타일로되어 있는지 확인하십시오 (로더의 경우 10x10).


6

QGIS 3.2.2 및 SAGA (QGIS에 기본적으로 설치됨)를 사용하십시오. "래스터 값을 포인트로"기능이 모든 기능을 수행합니다. 이미지 파일을 가져 와서 래스터 이미지의 정보를 사용하여 포인트 벡터 모양으로 변환합니다.


6

이 스레드에서 언급 한 QGIS 및 SAGA GUI 도구에 문제가 Raster values to points있었습니다 ( 어떤 이유로 실패하고 도움이되지 않는 오류가 발생하여 GRASS가 도움이되지 않는 v.sample완전히 새로운 계층을 만들었습니다). 잠시 동안 GUI 도구를 사용하지 못한 후에 필드 계산기에서이 작업을 시도했습니다. 그것은 잘 작동했고 GUI가 허용하는 것보다 프로세스를 조금 더 잘 제어하고 그 과정에서 다른 계산을 할 수있었습니다.

같은 좌표계에 pts이름이 지정된 레이어 와 이름이 다른 레이어가 있다고 가정합니다 rast. 로 rast표시된 각 X, Y 쌍에서 샘플링하고 싶습니다 pts.

이전에 필드 계산기를 사용해 본 적이 없다면 매우 간단합니다. "식"상자에 계산을 입력하면 Q가 중간 열에 여러 변수와 연산을 제공하고 오른쪽 열에 도움말 텍스트가 표시됩니다. 이 과정을 4 단계로 나눕니다.

  1. pts샘플링 하려는 레이어 의 속성 테이블을 엽니 다 .

  2. 필드 계산기 대화 상자 에 있으면 레이어 에서 새 필드를 만들지 또는 기존 필드수정 할지 선택 하십시오 pts.

  3. 다음으로, 새로운 또는 기존 pts속성 열 을 채우는 표현식을 작성하십시오 . 나를 위해 일한 표현식 코드를 수정하여 시작할 수 있습니다.

raster_value('rast', 1, make_point($x, $y))
  1. 당신은 제공해야 raster_value()래스터 레이어 이름으로 'rast', 밴드 번호 1및 지점 형상 make_point(). $x$y속성 테이블의 각 행에있는 점의 위치에 따라 기하학적 변수이다.

이 방법을 사용하면 other_rastfrom 이라는 다른 래스터 레이어의 값을 빼는 등의 산술 연산을 수행 할 수 rast있어 GUI 도구보다 시간이 많이 절약되었습니다. 아래 예 :

raster_value('rast', 1, make_point($x, $y)) - raster_value('other_rast', 1, make_point($x, $y))

다시 주 세 개의 층이 pts, rast그리고 other_rast일에이 방법에 대해 동일한 좌표 시스템에 있어야합니다.


1
이 질문에 대한 가장 좋은 답변입니다
BC B.

4

Hawthorne Beyer의 GME 도구는 명령 행을 통해이를 잘 수행하며 'for'루프를 사용하여 쉽게 일괄 처리 할 수 ​​있습니다.

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

GME isectpntrst 명령 참조





2

다음은 파이썬과 gdal을 사용하여 작성한 함수입니다. 이 함수는 점 좌표를 포함하는 래스터 및 팬더 데이터 프레임 목록을 가져와 점 좌표, 각 래스터 셀의 중심 및 각 셀 값이 포함 된 팬더 데이터 프레임을 반환합니다. 이 기능은 개발중인 패키지 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')

1

FME에 액세스 할 수 있으면 FME Workbench에서 두 개의 변압기 중 하나를 사용할 수 있습니다.

RasterCellCoercer는 ( "개인 점 또는 다각형으로 모든 숫자 입력 기능 래스터 분해. 일 특징 벡터 래스터에서 각 셀에 대해 출력된다.")

PointOnRasterValueExtractor는 ( "포인트 기능과 단일 참조 래스터 걸린다. 출력은 각 점의 위치에서의 주파수 대역과 팔레트 값 (들)로 구성된다.")


아니요 FME가 없거나 사용하지 않습니다. 독립형 응용 프로그램 또는 플러그인입니까?
Vassilis

0

빠른 생각 :

  1. gdal_polygonize.py-래스터 피처 다각형
  2. 포인트 피쳐 및 다각형을 PostGIS 데이터베이스에 삽입
  3. st_intersects 함수를 사용하여 지형지 물이 교차하는 모든 높이 값을 가져옵니다.

어제 Postgis를 사용하는 방법을 연구하기 시작했기 때문에 흥미로운 접근법.
Vassilis

고마워, 그것은 매우 단순하지만 작동합니다. 이 접근법으로 내가 생산할 수있는 것은 다음과 같습니다. i.imgur.com/h8CGJ.png
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.