Açık Kaynak CBS kullanarak noktalarda raster değerleri çıkartılıyor mu?


21

Rasterden değerleri nasıl puan elde edebilirim?

Arcgis'i tercih etmiyorum.

Qgis, Mapwindow veya diğer açık kaynaklı gis'leri tercih ederim.


1
Yani puanlarınız var ve değerleri bu noktaların altındaki rasterden çıkarmanız gerekiyor veya raster hücrelerini noktalara dönüştürmeniz gerekiyor. Sadece cevabı bulmaya çalışmadan önce kontrol ediyorum.
Nathan W

Birincisi, puanlarım var ve bu puanların altındaki rasterden değerleri çıkarmam gerekiyor. THNX !!
Vassilis

Yanıtlar:


37

QGIS "Nokta Örnekleme Aracı" aradığınız eklenti olmalıdır.

İşte nasıl kullanılacağına dair ayrıntılı bir açıklama: http://pvanb.wordpress.com/2010/02/15/sampling-raster-values-at-point-locations-in-qgis/

Paolo'nun yorumuna göre güncelleme:

eklenti tek çözüm değildir ve artık her zaman en kolay çözüm değildir. Alternatif bir çözüm de işleme araç kutusundaki 'Noktaya raster değerleri ekle' Saga işlevidir. Ayrıntılar için bkz. Http://pvanb.wordpress.com/2014/07/01/sampling-raster-values-at-point-locations-in-qgis-an-update/


5
İnsanlar hala bu soru ve cevap aracılığıyla yukarıda belirtilen yayını buluyor. Ancak, eklenti tek çözüm değildir ve artık her zaman en kolay çözüm değildir. Alternatif bir çözüm, işleme araç kutusundaki Saga fonksiyonudur. Ayrıntılar için bu gönderiye bakın .
Ecodiv

Dikkat. Nokta Örnekleme Aracını çalıştırdım. 60.000 puan ve 13 raster. Sonuçlar, her yıl için 30 rastgele örnek testimde başarısız oldu. Bu araçta büyük veri kümeleriyle ilgili sorunlar var. Ben kullanmazdım.
Eğer bilmiyorsanız

Büyük veri kümelerinde belirtilen sorunlara rağmen, tüm çoklu bant değerlerini tek seferde çıkarmak için çok yararlıdır . QGIS ile ilgili diğer tüm çözümler yalnızca bir bandın çıkarılmasını destekler (GRASS r.what gibi) veya çok bantlı raster kullanımını (Saga - raster değerleri gibi noktalara) yasaklar.
EikeMike

7

PostGIS 2.0'da şunları yapabilirsiniz:

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

Rasterinizi yüklerken çok küçük döşendiğinden emin olun (yükleyici ile -t 10x10).


7

Bu iş parçacığında bahsedilen QGIS ve SAGA GUI araçlarıyla ilgili sorunlar yaşıyordum ( Raster values to pointsbir nedenden dolayı başarısız oluyordu ve yararsız hatalar atıyordu ve GRASS v.sampleyararlı olmayan yepyeni bir katman oluşturdu). GUI araçlarıyla bir süre başarısız olduktan sonra, bunu Field Calculator'da yapmayı denedim. Oldukça iyi çalıştı ve süreci GUI'lerin izin verdiğinden biraz daha iyi kontrol edebildim ve yol boyunca başka hesaplamalar yapabildim.

Her ikisinin de aynı koordinat sisteminde adında ptsve başka adında bir katmanınız olduğunu varsayalım rast. rastTemsil edilen her X, Y çiftinde örnekleme yapmak istersiniz pts.

Saha Hesaplayıcısını daha önce kullanmadıysanız, oldukça basittir. Hesaplamanızı "İfade" kutusuna girersiniz ve Q, orta sütunda, sağ sütunda yardım metni bulunan bir dizi değişken ve işlem verir. Bu süreci dört adıma ayıracağım:

  1. ptsÖrneklemek istediğiniz katmanın nitelik tablosunu açın .

  2. Field Hesaplama iletişim içindedir sonra aşağıdakileri istediğinizi belirtin yeni bir alan oluşturma veya varolan bir alanı değiştirme senin içinde ptstabakasının.

  3. Ardından, yeni veya mevcut ptsözellik sütununu doldurmak için bir ifade oluşturun . Benim için çalışan ifade kodunu değiştirerek başlayabilirsiniz:

raster_value('rast', 1, make_point($x, $y))
  1. raster_value()Raster katman adı 'rast', bant numarası 1ve adresindeki nokta geometrisini sağlamalısınız make_point(). $xve $ynitelik tablosunun her satırındaki noktanın konumuna bağlı geometri değişkenleridir.

Bu yöntem ayrıca adlı başka raster katmanın değeri çıkarılarak gibi aritmetik işlemler verir other_rastdan rastGUI araçları üzerinde bana zaman bir demet kurtardı. Aşağıdaki örnek:

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

Yine not üç katman olduğu pts, rastve other_rastçalışma, bu yöntem için, aynı koordinat sisteminde olmalıdır.


1
bu soru için en iyi cevap bu
BC B.

6

QGIS 3.2.2 ve SAGA (QGIS'de varsayılan olarak yüklü) kullanmayı deneyin: "Raster Değerleri Noktalara" fonksiyonu sizin için her şeyi yapar: Bir görüntü dosyası alır ve raster görüntüsünden bilgi alarak bir Nokta-vektör şekline dönüştürür.


4

Hawthorne Beyer'in GME araçları bunu komut satırı üzerinden güzelce yapar ve 'for' döngülerle kolay toplu işlem yapılmasına izin verir.

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

GME isectpntrst komut başvurusu





2

İşte python ve gdal kullanarak yazdığım bir fonksiyon. İşlev rasterlerin bir listesini ve nokta koordinatlarını içeren bir panda veri çerçevesini alır ve nokta koordinatlarını, ilgili raster hücrelerin merkezlerini ve ilgili hücre değerlerini içeren bir panda veri çerçevesini döndürür. İşlev, geliştirme aşamasında chorospy paketinin bir parçasıdır ( burada bulunur ).

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

Mevcut çalışma dizininizde bulunan rasterler göz önüne alındığında nasıl çalıştırılacağına örnek:

rasDf = getValuesAtPoint('.', ['raster1', 'raster2'], inPoints, 'x', 'y')

1

FME'ye erişiminiz varsa FME Workbench'teki iki transformatörden birini kullanabilirsiniz.

RasterCellCoercer ("Tüm giriş sayısal raster özelliklerini ayrı ayrı noktalara veya çokgenlere ayırır . Rasterdeki her hücre için bir vektör özelliği çıkar.")

PointOnRasterValueExtractor ( "nokta özellikleri ve tek bir referans raster alır. Çıkışı her bir noktanın konumda bant ve palet değer (ler) içerir.")


Hayır FME'm yok veya kullanmıyorum, bağımsız bir uygulama mı yoksa eklenti mi?
Vassilis

0

Hızlı düşünce:

  1. gdal_polygonize.py - tarama özelliğinizi çokgenleştirin
  2. Nokta özelliklerinizi ve çokgenlerinizi PostGIS veritabanına ekleyin
  3. Özelliklerin kesiştiği tüm yükseklik değerlerini çekmek için st_intersects işlevini kullanın

ilginç bir yaklaşım, çünkü dün Postgis'in nasıl kullanılacağını öğrenmeye başlıyor.
Vassilis

Teşekkürler, oldukça basit ama işe yarıyor. İşte bu yaklaşımla üretebildiklerim: i.imgur.com/h8CGJ.png
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.