Làm thế nào để lớp phủ shapefile và raster?


17

Tôi có một shapefile với đa giác. Và tôi có một tập tin raster toàn cầu. Tôi muốn phủ các đa giác của shapefile lên lưới raster và tính giá trị raster trung bình cho mỗi đa giác.

Làm thế nào tôi có thể làm điều này bằng cách sử dụng GDAL, viết kết quả vào shapefile?


4
GDAL có phải là công cụ duy nhất bạn muốn sử dụng không?
Simbamangu

@Simbamangu không, về cơ bản mọi thứ đều ổn, và sẽ thật tuyệt nếu nó ở trong Python
andreash

Câu trả lời:


9

Trong R bạn có thể làm

library(raster)
library(rgdal)
r <- raster('raster_filename')
p <- readOGR('shp_path', 'shp_file')
e <- extract(r, p, fun=mean)

e là một vectơ với giá trị trung bình của các giá trị ô raster cho mỗi đa giác.


Đây không phải là con trăn như được hỏi trong câu hỏi
GM

6

Theo lời khuyên tôi nhận được trong danh sách gửi thư của gdal-dev, tôi đã sử dụng StarSpan :

starspan --vector V --raster R1 R2 ... --stats mystats.csv avg mode

Kết quả được lưu vào định dạng CSV. Vào thời điểm đó, điều đó đã là quá đủ đối với tôi, nhưng bằng cách nào đó có thể giả mạo một Shapefile từ thông tin đó.


StarSpan dường như đã chuyển sang GitHub. Nhận nó ở đây .
Richard

4

Tải shapefile và raster của bạn trong PostGIS 2.0 và thực hiện:

SELECT (ST_SummaryStats(ST_Clip(rast, geom))).*
FROM rastertable, geomtable

4

Tôi không nghĩ GDAL là công cụ tốt nhất cho việc này, nhưng bạn có thể sử dụng gdal_rasterize để "xóa" tất cả các giá trị bên ngoài đa giác.

Cái gì đó như:

gdal_translate -a_nodata 0 original.tif work.tif
gdal_rasterize -burn 0 -b 1 -i work.tif yourpolygon.shp -l yourpolygon
gdalinfo -stats work.tif
rm work.tif

Chương trình gdal_rasterize sửa đổi tệp, vì vậy chúng tôi tạo một bản sao để làm việc. Chúng tôi cũng đánh dấu một số giá trị cụ thể (không trong trường hợp này) là gật đầu. "-Burn 0 -b 1" có nghĩa là ghi giá trị 0 vào băng 1 của tệp đích (work.tif). "-I" có nghĩa là đảo ngược quá trình rasterization để chúng ta ghi các giá trị bên ngoài đa giác thay vì bên trong nó. Lệnh gdalinfo với -stats báo cáo về thống kê băng tần. Tôi tin rằng nó sẽ loại trừ giá trị nốt (mà chúng tôi đã đánh dấu trước đó bằng -a_nodata).


4

Kịch bản sau đây cho phép bạn thực hiện tác vụ với GDAL: http://pcjericks.github.io/py-gdalogr-cookbook/raster_layers.html#calculate-zonal-statistic

# Calculates statistics (mean) on values of a raster within the zones of an polygon shapefile

import gdal, ogr, osr, numpy

def zonal_stats(input_value_raster, input_zone_polygon):

    # Open data
    raster = gdal.Open(input_value_raster)
    driver = ogr.GetDriverByName('ESRI Shapefile')
    shp = driver.Open(input_zone_polygon)
    lyr = shp.GetLayer()

    # get raster georeference info
    transform = raster.GetGeoTransform()
    xOrigin = transform[0]
    yOrigin = transform[3]
    pixelWidth = transform[1]
    pixelHeight = transform[5]

    # reproject geometry to same projection as raster
    sourceSR = lyr.GetSpatialRef()
    targetSR = osr.SpatialReference()
    targetSR.ImportFromWkt(raster.GetProjectionRef())
    coordTrans = osr.CoordinateTransformation(sourceSR,targetSR)
    feat = lyr.GetNextFeature()
    geom = feat.GetGeometryRef()
    geom.Transform(coordTrans)

    # Get extent of geometry
    ring = geom.GetGeometryRef(0)
    numpoints = ring.GetPointCount()
    pointsX = []; pointsY = []
    for p in range(numpoints):
            lon, lat, z = ring.GetPoint(p)
            pointsX.append(lon)
            pointsY.append(lat)
    xmin = min(pointsX)
    xmax = max(pointsX)
    ymin = min(pointsY)
    ymax = max(pointsY)

    # Specify offset and rows and columns to read
    xoff = int((xmin - xOrigin)/pixelWidth)
    yoff = int((yOrigin - ymax)/pixelWidth)
    xcount = int((xmax - xmin)/pixelWidth)+1
    ycount = int((ymax - ymin)/pixelWidth)+1

    # create memory target raster
    target_ds = gdal.GetDriverByName('MEM').Create('', xcount, ycount, gdal.GDT_Byte)
    target_ds.SetGeoTransform((
        xmin, pixelWidth, 0,
        ymax, 0, pixelHeight,
    ))

    # create for target raster the same projection as for the value raster
    raster_srs = osr.SpatialReference()
    raster_srs.ImportFromWkt(raster.GetProjectionRef())
    target_ds.SetProjection(raster_srs.ExportToWkt())

    # rasterize zone polygon to raster
    gdal.RasterizeLayer(target_ds, [1], lyr, burn_values=[1])

    # read raster as arrays
    banddataraster = raster.GetRasterBand(1)
    dataraster = banddataraster.ReadAsArray(xoff, yoff, xcount, ycount).astype(numpy.float)

    bandmask = target_ds.GetRasterBand(1)
    datamask = bandmask.ReadAsArray(0, 0, xcount, ycount).astype(numpy.float)

    # mask zone of raster
    zoneraster = numpy.ma.masked_array(dataraster,  numpy.logical_not(datamask))

    # calculate mean of zonal raster
    return numpy.mean(zoneraster)

2

Chuyển đổi tệp hình dạng trong raster bằng gdal_rasterize và sử dụng mã trong http://www.spatial-ecology.net/dokuwiki/doku.php?id=wiki:geo_tools để tính toán thống kê khu vực cho mỗi đa giác. Bạn có thể chạy http://km.fao.org/OFwiki/index.php/Oft-reclass nếu bạn muốn có được một tif với thống kê raster của bạn. Thưởng thức mã Ciao Giuseppe


Bạn có tình cờ có một bản sao của mã bạn tham khảo không? Thật không may, liên kết đến tệp Python đã chết.
ustroetz

1

Điều này là không thể sử dụng GDAL. Tuy nhiên, bạn có thể sử dụng các công cụ miễn phí khác, ví dụ: saga gis:

saga_cmd shapes_grid "Grid Values to Shapes" -GRIDS=grid.sgrd -POLYGONS=in.shp -SHAPES=out.shp-NODATA -TYPE=1

Tôi đã thực hiện theo cách tiếp cận này, mặc dù tên hàm thực sự là "Grid Statistics for Polygons".
bananafish

1

Bạn cũng có thể sử dụng rasterstats thas là một mô-đun Python được thiết kế cho mục đích này:

from rasterstats import zonal_stats
listofzones = zonal_stats("polygons.shp", "elevation.tif",
            stats="mean")

nhập mô tả hình ảnh ở đây

Sau đó, bạn có thể truy cập thuộc tính của vùng đầu tiên bằng cách sử dụng:

mean_of_zone1 = listofzones[0]['mean']

-2

bạn có thể sử dụng công cụ thống kê điểm tính toán trong arc gis và công cụ này có thể được tải xuống từ http://ianbroad.com/arcgis-toolbox-calculate-point-statistic-polygon-arcpy/


2
"Công cụ Thống kê Điểm tính toán có một lớp tính năng Đa giác và Điểm đầu vào và sử dụng trường đã chọn để tìm mức tối thiểu, tối đa và trung bình của các điểm và thêm kết quả vào tính năng đa giác." nhưng câu hỏi này là về một lớp tính năng Đa giác và Raster nên có vẻ như không phù hợp.
PolyGeo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.