Rasterden değerleri nasıl puan elde edebilirim?
Arcgis'i tercih etmiyorum.
Qgis, Mapwindow veya diğer açık kaynaklı gis'leri tercih ederim.
Rasterden değerleri nasıl puan elde edebilirim?
Arcgis'i tercih etmiyorum.
Qgis, Mapwindow veya diğer açık kaynaklı gis'leri tercih ederim.
Yanıtlar:
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/
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).
Bu iş parçacığında bahsedilen QGIS ve SAGA GUI araçlarıyla ilgili sorunlar yaşıyordum ( Raster values to points
bir nedenden dolayı başarısız oluyordu ve yararsız hatalar atıyordu ve GRASS v.sample
yararlı 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 pts
ve başka adında bir katmanınız olduğunu varsayalım rast
. rast
Temsil 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:
pts
Örneklemek istediğiniz katmanın nitelik tablosunu açın .
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 pts
tabakasının.
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))
raster_value()
Raster katman adı 'rast'
, bant numarası 1
ve adresindeki nokta geometrisini sağlamalısınız make_point()
. $x
ve $y
nitelik 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_rast
dan rast
GUI 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
, rast
ve other_rast
çalışma, bu yöntem için, aynı koordinat sisteminde olmalıdır.
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.
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")
GRASS GIS'te, haritayı GUI'de sorgulayabilir veya http://grass.osgeo.org/gdp/html_grass64/r.what.html kullanabilirsiniz
http://gis-techniques.blogspot.com/2012/10/extract-raster-values-from-points.html , R Raster paketinin raster değerlerini noktalardan kullanmak için adım adım kılavuz içerir.
Bunu kullanabilirsiniz: http://www.saga-gis.org/saga_module_doc/2.1.3/shapes_grid_3.html
Qgis'in SAGA Araç Kutusunda! Her şeyi tek adımda yapar :)
İş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')
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.")
Hızlı düşünce: