1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 import os.path
33 import sys
34
35 from osgeo import gdal
36
37
39 print("""
40 gdal_sieve [-q] [-st threshold] [-4] [-8] [-o name=value]
41 srcfile [-nomask] [-mask filename] [-of format] [dstfile]
42 """)
43 sys.exit(1)
44
45
49
50
51 -def GetExtension(filename):
52 ext = os.path.splitext(filename)[1]
53 if ext.startswith('.'):
54 ext = ext[1:]
55 return ext
56
57
80
81
83 drv_list = GetOutputDriversFor(filename)
84 ext = GetExtension(filename)
85 if not drv_list:
86 if not ext:
87 return 'GTiff'
88 else:
89 raise Exception("Cannot guess driver for %s" % filename)
90 elif len(drv_list) > 1:
91 print("Several drivers matching %s extension. Using %s" % (ext if ext else '', drv_list[0]))
92 return drv_list[0]
93
94
96 threshold = 2
97 connectedness = 4
98 quiet_flag = 0
99 src_filename = None
100
101 dst_filename = None
102 frmt = None
103
104 mask = 'default'
105
106 gdal.AllRegister()
107 argv = gdal.GeneralCmdLineProcessor(argv)
108 if argv is None:
109 sys.exit(0)
110
111
112 i = 1
113 while i < len(argv):
114 arg = argv[i]
115
116 if arg == '-of' or arg == '-f':
117 i = i + 1
118 frmt = argv[i]
119
120 elif arg == '-4':
121 connectedness = 4
122
123 elif arg == '-8':
124 connectedness = 8
125
126 elif arg == '-q' or arg == '-quiet':
127 quiet_flag = 1
128
129 elif arg == '-st':
130 i = i + 1
131 threshold = int(argv[i])
132
133 elif arg == '-nomask':
134 mask = 'none'
135
136 elif arg == '-mask':
137 i = i + 1
138 mask = argv[i]
139
140 elif arg == '-mask':
141 i = i + 1
142 mask = argv[i]
143
144 elif arg[:2] == '-h':
145 Usage()
146
147 elif src_filename is None:
148 src_filename = argv[i]
149
150 elif dst_filename is None:
151 dst_filename = argv[i]
152
153 else:
154 Usage()
155
156 i = i + 1
157
158 if src_filename is None:
159 Usage()
160
161
162
163
164 try:
165 gdal.SieveFilter
166 except AttributeError:
167 print('')
168 print('gdal.SieveFilter() not available. You are likely using "old gen"')
169 print('bindings or an older version of the next gen bindings.')
170 print('')
171 sys.exit(1)
172
173
174
175
176
177 if dst_filename is None:
178 src_ds = gdal.Open(src_filename, gdal.GA_Update)
179 else:
180 src_ds = gdal.Open(src_filename, gdal.GA_ReadOnly)
181
182 if src_ds is None:
183 print('Unable to open %s ' % src_filename)
184 sys.exit(1)
185
186 srcband = src_ds.GetRasterBand(1)
187
188 if mask == 'default':
189 maskband = srcband.GetMaskBand()
190 elif mask == 'none':
191 maskband = None
192 else:
193 mask_ds = gdal.Open(mask)
194 maskband = mask_ds.GetRasterBand(1)
195
196
197
198
199
200 if dst_filename is not None:
201 if frmt is None:
202 frmt = GetOutputDriverFor(dst_filename)
203
204 drv = gdal.GetDriverByName(frmt)
205 dst_ds = drv.Create(dst_filename, src_ds.RasterXSize, src_ds.RasterYSize, 1,
206 srcband.DataType)
207 wkt = src_ds.GetProjection()
208 if wkt != '':
209 dst_ds.SetProjection(wkt)
210 gt = src_ds.GetGeoTransform(can_return_null=True)
211 if gt is not None:
212 dst_ds.SetGeoTransform(gt)
213
214 dstband = dst_ds.GetRasterBand(1)
215 else:
216 dstband = srcband
217
218
219
220
221
222 if quiet_flag:
223 prog_func = None
224 else:
225 prog_func = gdal.TermProgress_nocb
226
227 result = gdal.SieveFilter(srcband, maskband, dstband,
228 threshold, connectedness,
229 callback=prog_func)
230
231 src_ds = None
232 dst_ds = None
233 mask_ds = None
234
235 return result
236
237 if __name__ == '__main__':
238 sys.exit(main(sys.argv))
239