Skip to content

Commit e47c64c

Browse files
committed
[processing] add Extract raster values to shapefile algorithm
1 parent 5a4eb16 commit e47c64c

File tree

1 file changed

+122
-0
lines changed

1 file changed

+122
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
##[Example scripts]=group
2+
##Input_raster=raster
3+
##Input_vector=vector
4+
##Transform_vector_to_raster_CRS=boolean
5+
##Output_layer=output vector
6+
7+
import os
8+
9+
from osgeo import gdal, ogr, osr
10+
11+
from processing.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
12+
13+
from processing.algs import QGISUtils as utils
14+
15+
raster = gdal.Open(Input_raster)
16+
17+
rasterBaseName = os.path.splitext(os.path.basename(Input_raster))[0]
18+
19+
bandCount = raster.RasterCount
20+
rasterXSize = raster.RasterXSize
21+
rasterYSize = raster.RasterYSize
22+
geoTransform = raster.GetGeoTransform()
23+
rasterCRS = osr.SpatialReference()
24+
rasterCRS.ImportFromWkt(raster.GetProjectionRef())
25+
26+
vector = ogr.Open(Input_vector, False)
27+
layer = vector.GetLayer(0)
28+
featureCount = layer.GetFeatureCount()
29+
if featureCount == 0:
30+
raise GeoAlgorithmExecutionException("There are no features in input vector.")
31+
32+
vectorCRS = layer.GetSpatialRef()
33+
34+
drv = ogr.GetDriverByName("ESRI Shapefile")
35+
if drv is None:
36+
raise GeoAlgorithmExecutionException("'ESRI Shapefile' driver is not available.")
37+
38+
outputDataset = drv.CreateDataSource(Output_layer)
39+
if outputDataset is None:
40+
raise GeoAlgorithmExecutionException("Creation of output file failed.")
41+
42+
outputLayer = outputDataset.CreateLayer(str(os.path.splitext(os.path.basename(Output_layer))[0]), vectorCRS, ogr.wkbPoint)
43+
if outputLayer is None:
44+
raise GeoAlgorithmExecutionException("Layer creation failed.")
45+
46+
featureDefn = layer.GetLayerDefn()
47+
for i in xrange(featureDefn.GetFieldCount()):
48+
fieldDefn = featureDefn.GetFieldDefn(i)
49+
if outputLayer.CreateField(fieldDefn) != 0:
50+
raise GeoAlgorithmExecutionException("Can't create field '%s'." % fieldDefn.GetNameRef())
51+
52+
columnName = str(rasterBaseName[:8])
53+
for i in xrange(bandCount):
54+
fieldDefn = ogr.FieldDefn(columnName + "_" + str(i + 1), ogr.OFTReal)
55+
fieldDefn.SetWidth(18)
56+
fieldDefn.SetPrecision(8)
57+
if outputLayer.CreateField(fieldDefn) != 0:
58+
raise GeoAlgorithmExecutionException("Can't create field '%s'." % fieldDefn.GetNameRef())
59+
60+
outputFeature = ogr.Feature(outputLayer.GetLayerDefn())
61+
62+
current = 0
63+
total = bandCount + featureCount * bandCount + featureCount
64+
65+
layer.ResetReading()
66+
feature = layer.GetNextFeature()
67+
while feature is not None:
68+
current += 1
69+
progress.setPercentage(int(current * total))
70+
71+
outputFeature.SetFrom(feature)
72+
if outputLayer.CreateFeature(outputFeature) != 0:
73+
raise GeoAlgorithmExecutionException("Failed to add feature.")
74+
feature = layer.GetNextFeature()
75+
76+
vector.Destroy()
77+
outputFeature.Destroy()
78+
outputDataset.Destroy()
79+
80+
vector = ogr.Open(Output_layer, True)
81+
layer = vector.GetLayer(0)
82+
83+
if Transform_vector_to_raster_CRS:
84+
coordTransform = osr.CoordinateTransformation(vectorCRS, rasterCRS)
85+
if coordTransform is None:
86+
raise GeoAlgorithmExecutionException("Error while creating coordinate transformation.")
87+
88+
for i in xrange(bandCount):
89+
current += 1
90+
progress.setPercentage(int(current * total))
91+
92+
rasterBand = raster.GetRasterBand(i + 1)
93+
data = rasterBand.ReadAsArray()
94+
layer.ResetReading()
95+
feature = layer.GetNextFeature()
96+
while feature is not None:
97+
current += 1
98+
progress.setPercentage(int(current * total))
99+
100+
geometry = feature.GetGeometryRef()
101+
x = geometry.GetX()
102+
y = geometry.GetY()
103+
if Transform_vector_to_raster_CRS:
104+
pnt = coordTransform.TransformPoint(x, y, 0)
105+
x = pnt[0]
106+
y = pnt[1]
107+
rX, rY = utils.mapToPixel(x, y, geoTransform)
108+
if rX > rasterXSize or rY > rasterYSize:
109+
feature = layer.GetNextFeature()
110+
continue
111+
value = data[rY, rX]
112+
113+
feature.SetField(columnName + '_' + str(i + 1), float(value))
114+
if layer.SetFeature(feature) != 0:
115+
raise GeoAlgorithmExecutionException("Failed to update feature.")
116+
117+
feature = layer.GetNextFeature()
118+
119+
rasterBand = None
120+
121+
raster = None
122+
vector.Destroy()

0 commit comments

Comments
 (0)