ฉันจะดึงค่าจากแรสเตอร์ตามคะแนนได้อย่างไร
ฉันไม่ชอบ Arcgis
ฉันชอบใน Qgis หรือ Mapwindow หรือ GIS โอเพนซอร์ซอื่น ๆ
ฉันจะดึงค่าจากแรสเตอร์ตามคะแนนได้อย่างไร
ฉันไม่ชอบ Arcgis
ฉันชอบใน Qgis หรือ Mapwindow หรือ GIS โอเพนซอร์ซอื่น ๆ
คำตอบ:
QGIS "เครื่องมือเก็บตัวอย่างจุด" ควรเป็นปลั๊กอินที่คุณกำลังมองหา
นี่คือรายละเอียดของวิธีการใช้งาน: 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/
ใน PostGIS 2.0 คุณสามารถทำได้:
SELECT ST_Value(rast, geom) val
FROM yourrastertabe, yourpointtable
WHERE ST_Intersects(rast, geom)
ตรวจสอบให้แน่ใจว่าแรสเตอร์ของคุณมีขนาดเล็กมากเมื่อคุณโหลด (-t 10x10 พร้อมตัวโหลด)
ฉันมีปัญหากับเครื่องมือ QGIS และ SAGA GUI ที่กล่าวถึงในหัวข้อนี้ ( Raster values to points
ล้มเหลวด้วยเหตุผลบางอย่างและทิ้งข้อผิดพลาดที่ไม่ช่วยเหลือและ GRASS v.sample
สร้างเลเยอร์ใหม่ทั้งหมดซึ่งไม่เป็นประโยชน์) หลังจากล้มเหลวด้วยเครื่องมือ GUI ชั่วครู่หนึ่งฉันลองทำเช่นนี้ใน Field Calculator มันใช้งานได้ค่อนข้างดีและฉันสามารถควบคุมกระบวนการได้ดีกว่า GUI ที่อนุญาตเล็กน้อยและทำการคำนวณอื่น ๆ ตามทาง
สมมติว่าคุณมีเลเยอร์ชื่อpts
และอีกชื่อหนึ่งrast
ซึ่งทั้งคู่อยู่ในระบบพิกัดเดียวกัน คุณต้องการตัวอย่างrast
ในแต่ละ X, Y pts
คู่ตัวแทนใน
หากคุณไม่เคยใช้ Field Calculator มาก่อนมันค่อนข้างง่าย คุณจะเข้าสู่การคำนวณของคุณในกล่อง "Expression" และ Q ให้ตัวแปรและการดำเนินงานจำนวนหนึ่งในคอลัมน์กลางพร้อมข้อความช่วยเหลือในคอลัมน์ขวา ฉันจะแบ่งกระบวนการนี้เป็นสี่ขั้นตอน:
เปิดตารางแอตทริบิวต์ของpts
เลเยอร์ที่คุณต้องการตัวอย่างด้วย
เมื่อคุณอยู่ในกล่องโต้ตอบ Field Calculator ให้เลือกว่าคุณต้องการสร้างฟิลด์ใหม่หรือปรับเปลี่ยนฟิลด์ที่มีอยู่ในpts
เลเยอร์ของคุณ
จากนั้นสร้างนิพจน์เพื่อเติมpts
คอลัมน์แอตทริบิวต์ใหม่หรือที่มีอยู่ คุณอาจเริ่มต้นด้วยการปรับเปลี่ยนรหัสการแสดงออกที่เหมาะกับฉัน:
raster_value('rast', 1, make_point($x, $y))
raster_value()
ด้วยชื่อแรสเตอร์ชั้น'rast'
จำนวนวงดนตรีและรูปทรงเรขาคณิตจุด1
และเป็นตัวแปรเรขาคณิตที่ขึ้นอยู่กับตำแหน่งของจุดในแต่ละแถวของตารางแอตทริบิวต์make_point()
$x
$y
วิธีนี้ยังช่วยให้การดำเนินการทางคณิตศาสตร์เช่นการลบค่าของเลเยอร์แรสเตอร์อื่นที่เรียกว่าother_rast
จากrast
ซึ่งช่วยให้ฉันประหยัดเวลาในเครื่องมือ GUI ตัวอย่างด้านล่าง:
raster_value('rast', 1, make_point($x, $y)) - raster_value('other_rast', 1, make_point($x, $y))
หมายเหตุอีกครั้งว่าสามชั้นpts
, rast
และother_rast
จะต้องอยู่ในเดียวกันระบบพิกัดสำหรับวิธีการทำงาน
ลองใช้ QGIS 3.2.2 และ SAGA (ติดตั้งโดยค่าเริ่มต้นใน QGIS): ฟังก์ชั่น "Raster Values to Points" จะทำทุกอย่างให้คุณ: ใช้ไฟล์ภาพและแปลงเป็นรูปเวกเตอร์ข้อมูลจากภาพแรสเตอร์
เครื่องมือ GME ของ Hawthorne Beyer's ทำสิ่งนี้ได้อย่างดีผ่านทางบรรทัดคำสั่งและอนุญาตให้ทำการแบตช์ได้ง่ายด้วยลูป 'for'
isectpntrst(in="path/to/shapefile", raster="path/to/raster", field="fieldname")
ใน GRASS GIS คุณสามารถสืบค้นแผนที่ใน GUI หรือใช้http://grass.osgeo.org/gdp/html_grass64/r.what.html
http://gis-techniques.blogspot.com/2012/10/extract-raster-values-from-points.html มีคำแนะนำทีละขั้นตอนในการใช้แพคเกจ R Raster แยกค่า raster จากจุด
คุณสามารถใช้สิ่งนี้: http://www.saga-gis.org/saga_module_doc/2.1.3/shapes_grid_3.html
มันอยู่ในกล่องเครื่องมือ SAGA ของ Qgis! มันทำทุกอย่างในขั้นตอนเดียว :)
นี่คือฟังก์ชั่นที่ฉันเขียนโดยใช้ python และ gdal ฟังก์ชั่นใช้รายการ rasters และดาต้าดาต้าแพนด้าที่มีพิกัดจุดและส่งคืนดาต้าดาต้าแพนด้าที่มีพิกัดจุดเซนทรอยด์สำหรับเซลล์แรสเตอร์ที่เกี่ยวข้องและค่าเซลล์ตามลำดับ ฟังก์ชั่นเป็นส่วนหนึ่งของแพคเกจ 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
ตัวอย่างวิธีเรียกใช้เนื่องจาก rasters อยู่ในไดเรกทอรีการทำงานปัจจุบันของคุณ:
rasDf = getValuesAtPoint('.', ['raster1', 'raster2'], inPoints, 'x', 'y')
หากคุณมีสิทธิ์เข้าถึงFMEคุณสามารถใช้หนึ่งในสองหม้อแปลงใน FME Workbench
The RasterCellCoercer ("แยกคุณสมบัติ raster ตัวเลขอินพุตทั้งหมดออกเป็นแต่ละจุดหรือรูปหลายเหลี่ยมคุณลักษณะเวกเตอร์หนึ่งรายการจะถูกส่งออกสำหรับแต่ละเซลล์ในแรสเตอร์")
PointOnRasterValueExtractor ( "ใช้เวลาในลักษณะจุดและแรสเตอร์อ้างอิงเดียว. เอาท์พุทประกอบด้วยวงและจานคุ้มค่า (s) ที่สถานที่ของแต่ละจุด.")
ความคิดด่วน: