แยกค่าแรสเตอร์ที่จุดโดยใช้ Open Source GIS หรือไม่


21

ฉันจะดึงค่าจากแรสเตอร์ตามคะแนนได้อย่างไร

ฉันไม่ชอบ Arcgis

ฉันชอบใน Qgis หรือ Mapwindow หรือ GIS โอเพนซอร์ซอื่น ๆ


1
ดังนั้นคุณมีคะแนนและคุณต้องแยกค่าจากแรสเตอร์ภายใต้จุดเหล่านั้นหรือคุณต้องการแปลงเซลล์แรสเตอร์เป็นจุด เพียงตรวจสอบก่อนที่ฉันจะลองและหาคำตอบ
Nathan W

อย่างแรกฉันมีคะแนนและฉันต้องการแยกค่าจากแรสเตอร์ภายใต้คะแนนเหล่านั้น THNX !!
Vassilis

คำตอบ:


37

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/


5
ผู้คนยังคงค้นหาโพสต์ที่กล่าวถึงข้างต้นผ่าน Q&A นี้ อย่างไรก็ตามปลั๊กอินไม่ใช่ทางออกเดียวและไม่ใช่โซลูชันที่ง่ายที่สุดอีกต่อไป ทางเลือกอื่นคือฟังก์ชั่น Saga 'เพิ่มค่ากริดไปยังจุด' ในกล่องเครื่องมือการประมวลผล ดูรายละเอียดโพสต์นี้
Ecodiv

ความระมัดระวัง ฉันเพิ่งใช้เครื่องมือเก็บคะแนนจุด 60,000 คะแนนและ 13 rasters ผลลัพธ์ล้มเหลวในการทดสอบตัวอย่าง 30 ครั้งของฉันในแต่ละปี เครื่องมือนี้มีปัญหากับชุดข้อมูลขนาดใหญ่ ฉันจะไม่ใช้มัน
หากคุณไม่ทราบ - เพียงแค่ GIS

แม้จะมีปัญหาที่กล่าวถึงกับชุดข้อมูลขนาดใหญ่ แต่ก็มีประโยชน์อย่างมากสำหรับการแยกค่า multibandทั้งหมดในครั้งเดียว โซลูชันที่เกี่ยวข้องกับ QGIS อื่น ๆ สนับสนุนการสกัดหนึ่งวงดนตรี (เช่น GRASS r.what) หรือห้ามการใช้มัลติแรนด์แรสเตอร์ (เช่นค่า Saga - ค่าแรสเตอร์ไปยังคะแนน)
EikeMike

7

ใน PostGIS 2.0 คุณสามารถทำได้:

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

ตรวจสอบให้แน่ใจว่าแรสเตอร์ของคุณมีขนาดเล็กมากเมื่อคุณโหลด (-t 10x10 พร้อมตัวโหลด)


7

ฉันมีปัญหากับเครื่องมือ QGIS และ SAGA GUI ที่กล่าวถึงในหัวข้อนี้ ( Raster values to pointsล้มเหลวด้วยเหตุผลบางอย่างและทิ้งข้อผิดพลาดที่ไม่ช่วยเหลือและ GRASS v.sampleสร้างเลเยอร์ใหม่ทั้งหมดซึ่งไม่เป็นประโยชน์) หลังจากล้มเหลวด้วยเครื่องมือ GUI ชั่วครู่หนึ่งฉันลองทำเช่นนี้ใน Field Calculator มันใช้งานได้ค่อนข้างดีและฉันสามารถควบคุมกระบวนการได้ดีกว่า GUI ที่อนุญาตเล็กน้อยและทำการคำนวณอื่น ๆ ตามทาง

สมมติว่าคุณมีเลเยอร์ชื่อptsและอีกชื่อหนึ่งrastซึ่งทั้งคู่อยู่ในระบบพิกัดเดียวกัน คุณต้องการตัวอย่างrastในแต่ละ X, Y ptsคู่ตัวแทนใน

หากคุณไม่เคยใช้ Field Calculator มาก่อนมันค่อนข้างง่าย คุณจะเข้าสู่การคำนวณของคุณในกล่อง "Expression" และ Q ให้ตัวแปรและการดำเนินงานจำนวนหนึ่งในคอลัมน์กลางพร้อมข้อความช่วยเหลือในคอลัมน์ขวา ฉันจะแบ่งกระบวนการนี้เป็นสี่ขั้นตอน:

  1. เปิดตารางแอตทริบิวต์ของptsเลเยอร์ที่คุณต้องการตัวอย่างด้วย

  2. เมื่อคุณอยู่ในกล่องโต้ตอบ Field Calculator ให้เลือกว่าคุณต้องการสร้างฟิลด์ใหม่หรือปรับเปลี่ยนฟิลด์ที่มีอยู่ในptsเลเยอร์ของคุณ

  3. จากนั้นสร้างนิพจน์เพื่อเติมptsคอลัมน์แอตทริบิวต์ใหม่หรือที่มีอยู่ คุณอาจเริ่มต้นด้วยการปรับเปลี่ยนรหัสการแสดงออกที่เหมาะกับฉัน:

raster_value('rast', 1, make_point($x, $y))
  1. คุณต้องใส่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จะต้องอยู่ในเดียวกันระบบพิกัดสำหรับวิธีการทำงาน


1
นี่คือคำตอบที่ดีที่สุดสำหรับคำถามนี้
BC B.

6

ลองใช้ QGIS 3.2.2 และ SAGA (ติดตั้งโดยค่าเริ่มต้นใน QGIS): ฟังก์ชั่น "Raster Values ​​to Points" จะทำทุกอย่างให้คุณ: ใช้ไฟล์ภาพและแปลงเป็นรูปเวกเตอร์ข้อมูลจากภาพแรสเตอร์



3

ใน GRASS GIS คุณสามารถสืบค้นแผนที่ใน GUI หรือใช้http://grass.osgeo.org/gdp/html_grass64/r.what.html


2
สำหรับ Grass ฉันพบสิ่งนี้: pvanb.wordpress.com/2010/05/05/…
Vassilis

โมดูล GRASS อีกตัวที่สามารถสุ่มตัวอย่าง raster ได้คือ v.sample ซึ่งมีอยู่ในกล่องประมวลผล QGIS
user55937



2

นี่คือฟังก์ชั่นที่ฉันเขียนโดยใช้ 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')

1

หากคุณมีสิทธิ์เข้าถึงFMEคุณสามารถใช้หนึ่งในสองหม้อแปลงใน FME Workbench

The RasterCellCoercer ("แยกคุณสมบัติ raster ตัวเลขอินพุตทั้งหมดออกเป็นแต่ละจุดหรือรูปหลายเหลี่ยมคุณลักษณะเวกเตอร์หนึ่งรายการจะถูกส่งออกสำหรับแต่ละเซลล์ในแรสเตอร์")

PointOnRasterValueExtractor ( "ใช้เวลาในลักษณะจุดและแรสเตอร์อ้างอิงเดียว. เอาท์พุทประกอบด้วยวงและจานคุ้มค่า (s) ที่สถานที่ของแต่ละจุด.")


ไม่ฉันไม่มีหรือใช้ 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.