def draw(file): # 1) opening maido geotiff as an array raster = gdal.OpenShared(file) data = raster.ReadAsArray() # 2) transformation of coordinates cols = raster.RasterXSize rows = raster.RasterYSize gt = raster.GetGeoTransform() x = (cols * gt[1]) + gt[0] y = (rows * gt[5]) + gt[3] X = np.arange(gt[0], x, gt[1] * 600) Y = np.arange(gt[3], y, gt[5] * 600) # 3) creation of a simple grid X, Y = np.meshgrid(X, Y) plt.title('2000') parameters = np.linspace(0, 110, 10) norm = matplotlib.colors.Normalize(vmin=np.min(parameters), vmax=np.max(parameters)) # choose a colormap c_m = matplotlib.cm.cool # create a ScalarMappable and initialize a data structure s_m = matplotlib.cm.ScalarMappable(cmap=c_m, norm=norm) s_m.set_array([]) fig = plt.figure(figsize=(12, 8)) plt.imshow(data, cmap=c_m) plt.colorbar(s_m)
def rststats(time,rasterfile): dataset = gdal.OpenShared(rasterfile) if dataset is None: print("Failed to open file: " + rasterfile) sys.exit(1) band = dataset.GetRasterBand(1) xsize = dataset.RasterXSize ysize = dataset.RasterYSize print "Output file %s size:" % rasterfile, xsize, ysize rastervalue = band.ReadAsArray(xoff=0, yoff=0, win_xsize=xsize, win_ysize=ysize) count1 = np.sum(rastervalue == 1) count2 = np.sum(rastervalue == 2) count3 = np.sum(rastervalue == 3) count4 = np.sum(rastervalue == 4) count5 = np.sum(rastervalue == 5) data = {} data["time"] = time data["class1"] = count1 data["class2"] = count2 data["class3"] = count3 data["class4"] = count4 data["class5"] = count5 stats_str = json.dumps(data) return stats_str
def vrtfilt_3(): ds = gdal.OpenShared('data/rgbsmall.tif') vrt_ds = gdal.GetDriverByName('VRT').CreateCopy('', ds) ds = None filterSourceXML = """ <KernelFilteredSource> <SourceFilename>data/rgbsmall.tif</SourceFilename> <SourceBand>1</SourceBand> <SrcRect xOff="0" yOff="0" xSize="50" ySize="50"/> <DstRect xOff="0" yOff="0" xSize="50" ySize="50"/> <Kernel> <Size>3</Size> <Coefs>0.111111 0.111111 0.111111 0.111111 0.111111 0.111111 0.111111 0.111111 0.111111</Coefs> </Kernel> </KernelFilteredSource>""" try: vrt_ds.GetRasterBand(1).SetMetadataItem except: return 'skip' vrt_ds.GetRasterBand(1).SetMetadataItem('source_0', filterSourceXML, 'vrt_sources') if vrt_ds.GetRasterBand(1).Checksum() != 21890: return 'fail' return 'success'
def test(): tif = '/root/PycharmProjects/ANNRK/data/ok_china_40km.tif' raster = gdal.OpenShared(tif) arr = raster.ReadAsArray() max = np.max(arr) min = np.min(arr) misc.toimage(arr, high=max, low=min).save('/tmp/test.jpg')
def gdal_read_rs2_dim_format(data_dir_path, roi=None): rbs0 = {} rb_keys = defs.S2_SLC_IDX if roi is not None: x0 = roi[0] y0 = roi[1] w = roi[2] h = roi[3] ds_list = [] for k, key in enumerate(rb_keys.keys()): file_path = os.path.join(data_dir_path, f"{key}.img") ds_list.append(gdal.OpenShared(file_path, gdal.GA_ReadOnly)) rb = ds_list[k] rbs0[key] = rb rbs = [] rbs.append(rbs0['i_HH'].ReadAsArray(x0, y0, w, h) + 1j * rbs0['q_HH'].ReadAsArray(x0, y0, w, h)) rbs.append(rbs0['i_HV'].ReadAsArray(x0, y0, w, h) + 1j * rbs0['q_HV'].ReadAsArray(x0, y0, w, h)) rbs.append(rbs0['i_VH'].ReadAsArray(x0, y0, w, h) + 1j * rbs0['q_VH'].ReadAsArray(x0, y0, w, h)) rbs.append(rbs0['i_VV'].ReadAsArray(x0, y0, w, h) + 1j * rbs0['q_VV'].ReadAsArray(x0, y0, w, h)) data = {} data['BANDS_IDX'] = defs.S2_IDX data['X0_ORIGINAL'] = x0 data['Y0_ORIGINAL'] = y0 data['W_ORIGINAL'] = w data['H_ORIGINAL'] = h data['RASTER_BANDS'] = np.dstack(rbs).transpose(2, 0, 1) ds_list = None return data
def tif2png(tif): # rst_file = '/root/PycharmProjects/ANNRK/AT_2016_year_2016.tif' raster = gdal.OpenShared(tif) data = raster.ReadAsArray() # cmap = plt.cm.jet png = tif.replace('tif', 'png') # plt.imsave(png, data, cmap=cmap) min = np.nanmin(data) max = np.nanmax(data) print('当前处理数据:', tif) print('最小值和最大值:', min, max) if min < max: try: cmap = matplotlib.colors.LinearSegmentedColormap.from_list( 'cmap', [ '#FFFFFF', '#98F5FF', '#00FF00', '#FFFF00', '#FF0000', '#8B0000' ], 256) plt.imshow(data, cmap=cmap) plt.colorbar(ticks=[min, max]) plt.savefig(png) plt.close() except: print('绘图失败!') else: print('最小值大于等于最大值,数据不对,无法绘图') return
def process_tile(tile, items): data = {} template = None print 'Processing', tile for year, filename in items.items(): ds = gdal.OpenShared(filename) if template is None: template = ds band = ds.GetRasterBand(1) data[year] = band.ReadAsArray() # calculate trend years = data.keys() dim = data[years[0]].shape height, width = dim slope = np.ndarray(dim, dtype=np.float32) correl = np.ndarray(dim, dtype=np.float32) stderr = np.ndarray(dim, dtype=np.float32) pval = np.ndarray(dim, dtype=np.float32) for i in range(height): #sys.stderr.write('\r%d ' % (height-i)) for j in range(width): values = [data[y][i][j] for y in years] rc, intercept, rvalue, pvalue, evalue = linregress(years, values) slope[i][j] = rc correl[i][j] = rvalue stderr[i][j] = evalue pval[i][j] = pvalue save(SRC, 'slope/NDVI.{tile}.slope'.format(tile=tile), slope, template) save(SRC, 'correl/NDVI.{tile}.correl'.format(tile=tile), correl, template) save(SRC, 'stderr/NDVI.{tile}.stderr'.format(tile=tile), stderr, template) save(SRC, 'pvalue/NDVI.{tile}.pvalue'.format(tile=tile), pval, template) return tile
def gdal_read_rs2_array(file_path, roi=None, preprocessing=UNCALIB): if os.path.isdir(file_path): logger.debug("trying to load a beam-dimap") data = gdal_read_rs2_dim_format(file_path, roi=roi) return data file_path0 = file_path if preprocessing != UNCALIB: file_path0 = f"{RSAT2_PROCESSING[preprocessing]}:{file_path}" print(file_path0) ds = gdal.OpenShared(file_path0, gdal.GA_ReadOnly) if ds is None: raise Exception(f"unable to read product {file_path}") driver_name = ds.GetDriver().ShortName x0 = 0 y0 = 0 w = ds.RasterXSize h = ds.RasterYSize chs = ds.RasterCount rbs = [] idx = {} data = None if driver_name == "RS2": data = {} rbs0 = {} for k in range(chs): rb = ds.GetRasterBand(k + 1) metadata = rb.GetMetadata() id = metadata["POLARIMETRIC_INTERP"] rbs0[id] = rb for key, chn in zip(defs.S2_IDX.keys(), defs.S2_IDX.values()): rbs.append(read_as_array(rbs0[key], roi)) idx = defs.S2_IDX.keys() elif driver_name == "GTiff": data = {} for key, k in zip(defs.S2_IDX.keys(), defs.S2_IDX.values()): i = 2 * k + 1 q = 2 * k + 2 rb_i = ds.GetRasterBand(i) rb_q = ds.GetRasterBand(q) rbs.append( read_as_array(rb_i, roi) + 1j * read_as_array(rb_q, roi)) idx = defs.S2_IDX.keys() else: return data data['BANDS_IDX'] = idx data['X0_ORIGINAL'] = x0 data['Y0_ORIGINAL'] = y0 data['W_ORIGINAL'] = w data['H_ORIGINAL'] = h data['RASTER_BANDS'] = np.dstack(rbs).transpose(2, 0, 1) ds = None return data
def misc_3(): ds = gdal.OpenShared('../gdrivers/data/small16.aux') ds.GetRasterBand(1).Checksum() cache_size = gdal.GetCacheUsed() ds2 = gdal.OpenShared('../gdrivers/data/small16.aux') ds2.GetRasterBand(1).Checksum() cache_size2 = gdal.GetCacheUsed() if cache_size != cache_size2: print("--> OpenShared didn't work as expected") ds = None ds2 = None return 'success'
def checkds(filepath,forcegeo): ds = gdal.OpenShared(filepath) if ds is not None: if forcegeo == 1 and ds.GetGeoTransform() == (0, 1, 0, 0, 0, 1): return False else: return True else: return False
def getdsdetails(filepath): ds = gdal.OpenShared(filepath) print "*Calculating dataset stats for raster ",filepath bandcount = ds.RasterCount geotrans = ds.GetGeoTransform() driver = ds.GetDriver().LongName wkt = ds.GetProjection() rasterx = ds.RasterXSize rastery = ds.RasterYSize dsstring = '|'.join([filepath, str(bandcount), str(geotrans),str(driver),str(rasterx),str(rastery),wkt]) return dsstring, bandcount, ds
def read_raster(tif): raster = gdal.OpenShared(tif) if raster is None: print("Failed to open file:" + tif) sys.exit() cols = raster.RasterXSize rows = raster.RasterYSize print "the tif size is cols: %s, rows: %s" % (cols, rows) gt = raster.GetGeoTransform() extent = GetExtent(gt, cols, rows) print 'the extent of the coordinates of the image is %s' % extent return raster
def misc_2(): tab_ds = [None for i in range(5000)] for i in range(len(tab_ds)): tab_ds[i] = gdal.OpenShared('data/byte.tif') if tab_ds[i] is None: return 'fail' for i in range(len(tab_ds)): tab_ds[i] = None return 'success'
def create_cb(self, *args): bands = self.input_frame.get_output_bands() if len(bands) == 0: gvutils.error('No output bands specified!') return vrtbase = [gdal.CXT_Element, 'VRTDataset'] vrtbase.append([ gdal.CXT_Attribute, 'rasterXSize', [gdal.CXT_Text, str(bands[0][0].RasterXSize)] ]) vrtbase.append([ gdal.CXT_Attribute, 'rasterYSize', [gdal.CXT_Text, str(bands[0][0].RasterYSize)] ]) # Metadata is currently taken from first output band. # This may be updatable later. mbase = vrtutils.serializeMetadata(bands[0][0]) if mbase is not None: vrtbase.append(mbase) gbase = self.geo_frame.get_geocoding() for item in gbase: vrtbase.append(item) outband = 1 for item in bands: dict = {} dict['band'] = outband dict['SourceBand'] = item[1] dict['ColorInterp'] = 'Undefined' bbase = vrtutils.serializeBand(item[0], opt_dict=dict) vrtbase.append(bbase) outband = outband + 1 vrtlines = gdal.SerializeXMLTree(vrtbase) vrtds = gdal.OpenShared(vrtlines) if args[1] == 'Save': fname = GtkExtra.file_sel_box(title="Save File") if fname is None: return driver = gdal.GetDriverByName('VRT') driver.CreateCopy(fname, vrtds) elif args[1] == 'New': self.app.new_view() self.app.open_gdal_dataset(vrtds) else: self.app.open_gdal_dataset(vrtds)
def get_cached_value(self, filename, lon, lat): """ Get a single value at (lon,lat) from cache """ path = os.path.join(self.cache, filename) ds = gdal.OpenShared(path) fwd = ds.GetGeoTransform() inv = gdal.InvGeoTransform(fwd) # older versions of gdal have a different signature of InvGeoTransform() if inv and len(inv) == 2: _success, inv = inv x, y = gdal.ApplyGeoTransform(inv, lon, lat) x = int(max(0, min(ds.RasterXSize - 1, x))) y = int(max(0, min(ds.RasterYSize - 1, y))) value = ds.GetRasterBand(1).ReadAsArray(x, y, 1, 1) return value[0][0]
def get_dataset(self, name): sets = self.hdf.GetMetadata('SUBDATASETS') i = 1 while True: key = 'SUBDATASET_%d_DESC' % i if not key in sets: break desc = sets[key] if name in desc: key = 'SUBDATASET_%d_NAME' % i name = sets[key] return gdal.OpenShared(name) i += 1 return None
def rst2arr(rasterfile): dataset = gdal.OpenShared(rasterfile) if dataset is None: print("Failed to open file: " + rasterfile) sys.exit(1) band = dataset.GetRasterBand(1) xsize = dataset.RasterXSize #xsize means number of columns ysize = dataset.RasterYSize # ysize means number of rows #proj = dataset.GetProjection() #geotrans = dataset.GetGeoTransform() #noDataValue = band.GetNoDataValue() print "Output file %s size:" % rasterfile, xsize, ysize rastervalue = band.ReadAsArray(xoff=0, yoff=0, win_xsize=xsize, win_ysize=ysize) return rastervalue
def arr2rst(ref_tif, arr, dst_file): dataset = gdal.OpenShared(ref_tif) proj = dataset.GetProjection() geotrans = dataset.GetGeoTransform() # noDataValue = band.GetNoDataValue() # output the array in geotiff format xsize, ysize = arr.shape dst_format = 'GTiff' dst_nbands = 1 dst_datatype = gdal.GDT_Float32 driver = gdal.GetDriverByName(dst_format) dst_ds = driver.Create(dst_file, ysize, xsize, dst_nbands, dst_datatype) dst_ds.SetGeoTransform(geotrans) dst_ds.SetProjection(proj) # dst_ds.GetRasterBand(1).SetNoDataValue(noDataValue) dst_ds.GetRasterBand(1).WriteArray(arr)
def update_default_frame(self, fname): nchars = self.default_scrolled_text.get_length() self.default_scrolled_text.backward_delete(nchars) if fname is None: self.default_fname = None self.default_geotransform = None self.default_gcps = None self.default_prj = '' return sr = osr.SpatialReference() fh = gdal.OpenShared(fname) prj = '' geot = fh.GetGeoTransform() if ((tuple(geot) == (0, 1, 0, 0, 0, 1)) or (tuple(geot) == (0.0, 1.0, 0.0, 0.0, 0.0, 1.0))): self.default_geotransform = None gcps = fh.GetGCPs() if len(gcps) > 0: self.default_gcps = gcps txt = 'Type of Geocoding: GCPs (' + str(len(gcps)) + ')\n\n' prj = fh.GetGCPProjection() if sr.ImportFromWkt(prj) == 0: prjtxt = sr.ExportToPrettyWkt(simplify=1) else: prjtxt = '' txt = txt + 'Projection: ' + prjtxt else: self.default_gcps = None txt = 'Type of Geocoding: None\n\nProjection: None' else: self.default_geotransform = geot self.default_gcps = None txt = 'Type of Geocoding: Geotransform\n\n' prj = fh.GetProjection() if sr.ImportFromWkt(prj) == 0: prjtxt = sr.ExportToPrettyWkt(simplify=1) else: prjtxt = '' txt = txt + 'Projection: ' + prjtxt self.default_scrolled_text.insert_defaults(txt) self.default_prj = prj self.default_fname = fname
def arr2rst(arr, dst_file): rst = "/mnt/mfs/zjh/rspm25/PM25_CIESIN/china/cnPM25_199801_200012.tif" dataset = gdal.OpenShared(rst) proj = dataset.GetProjection() geotrans = dataset.GetGeoTransform() #noDataValue = band.GetNoDataValue() # output the array in geotiff format xsize, ysize = arr.shape dst_format = 'GTiff' dst_nbands = 1 dst_datatype = gdal.GDT_UInt32 driver = gdal.GetDriverByName(dst_format) dst_ds = driver.Create(dst_file, ysize, xsize, dst_nbands, dst_datatype) dst_ds.SetGeoTransform(geotrans) dst_ds.SetProjection(proj) #dst_ds.GetRasterBand(1).SetNoDataValue(noDataValue) dst_ds.GetRasterBand(1).WriteArray(arr)
def __gdal_dataset_default(self): """DiskReader implementation.""" if not os.path.exists(self.file_name): return None if os.path.splitext(self.file_name)[1].lower() not in self.file_types: raise RuntimeError('Filename %s does not have extension type %s.' % (self.file_name, self.file_types)) dataset = gdal.OpenShared(self.file_name, gdalconst.GA_ReadOnly) if dataset is None: raise ValueError('Dataset %s did not load properly.' % self.file_name) # Sanity checks. assert dataset.RasterCount > 0 # Seems okay... return dataset
def import_cb(self, *args): # Check if the parameters valid filename = self.open_entry.get_text() if filename is '': gvutils.error('You should select a raw file to load!') return if not os.path.isfile(filename): gvutils.error('Unable to load '+ filename) return if args[1] == 'Save': self.create_header(filename) else: lines=self.create_vrt_lines(filename) vrtds=gdal.OpenShared(lines) if args[1] == 'New': self.app.new_view() self.app.open_gdal_dataset(vrtds)
def vrtwarp_2(): try: os.remove('tmp/warp.vrt') except: pass gcp_ds = gdal.OpenShared('data/rgb_gcp.vrt', gdal.GA_ReadOnly) gdaltest.vrtwarp_ds = gdal.AutoCreateWarpedVRT(gcp_ds) gcp_ds = None checksum = gdaltest.vrtwarp_ds.GetRasterBand(2).Checksum() expected = 21504 if checksum != expected: gdaltest.post_reason( 'Got checksum of %d instead of expected %d.' \ % (checksum, expected) ) return 'fail' return 'success'
def grid_feature(gridx, gridy, grid_proj, feat_file): ''' 根据格网位置读取对应的栅格数据的数值 :param gridx: 横坐标数组 :param gridy: 纵坐标数组 :param grid_proj: 格网投影 :param feat_file: 栅格数据 :return: 格网数据 ''' feat_rst = gdal.OpenShared(feat_file) feat_proj = feat_rst.GetProjectionRef() grid_X = [] for x in gridx: for y in gridy: x_c, y_c = point_geotransform(grid_proj, feat_proj, x, y) feat = read_value_fcoord(feat_file, x_c, y_c) # print feat if feat is None or feat == 0: continue grid_X.append([x, y, feat]) return np.array(grid_X)
def _fromFile(fname): """ Parameters ---------- fname : str # file name Returns ------- GeoArray Purpose ------- Create GeoArray from file """ # fobj = gdal.OpenShared(fname, gdal.GA_Update) fobj = gdal.OpenShared(fname) if fobj: return _fromDataset(fobj) raise IOError("Could not open file: {:}".format(fname))
def copy_gcps_cb(self, *args): """ Copy gcps from an existing gdal dataset. """ fname = GtkExtra.file_sel_box(title="Select GDAL Dataset") if fname is None: return try: fh = gdal.OpenShared(fname) except: gvutils.error('Unable to open ' + fname + ' as a GDAL dataset!') return gcps = fh.GetGCPs() prj = fh.GetGCPProjection() self.clear_gcps() for gcp in gcps: ngcp = CopyGDALGCP(gcp) self.gcplist.append(ngcp) self.gcpgrid.refresh() self.gcpprjbox.set_input_projection(prj)
def stats(): for k in range(8): statfile = os.path.join(dst_dir, 'stats' + '_c' + str(k) + '.csv') stat_arr = np.array([]) for t in range(t_num): rstname = os.path.join(dst_dir, t_series[t] + '_c' + str(k) + '.tif') print("file %s will be statisticed" % rstname) dataset = gdal.OpenShared(rstname) if dataset is None: print("Failed to open file: " + rstname) sys.exit(1) band = dataset.GetRasterBand(1) xsize = dataset.RasterXSize ysize = dataset.RasterYSize rv = band.ReadAsArray(xoff=0, yoff=0, win_xsize=xsize, win_ysize=ysize) if np.sum(rv) == 0: break max = np.max(rv[(rv > 0)]) min = np.min(rv[(rv > 0)]) mean = np.mean(rv[(rv > 0)]) median = np.median(rv[(rv > 0)]) var = np.var(rv[(rv > 0)]) arr = np.array([max, min, mean, median, var]) stat_arr = np.append(stat_arr, arr) stat_arr = stat_arr.reshape(-1, 5) frame = DataFrame(stat_arr) frame.to_csv(statfile) print("file %s has been statisticed successfully" % rstname)
def rststats(rasterfile): dataset = gdal.OpenShared(rasterfile) if dataset is None: print("Failed to open file: " + rasterfile) sys.exit(1) band = dataset.GetRasterBand(1) xsize = dataset.RasterXSize ysize = dataset.RasterYSize print "Output file %s size:" % rasterfile, xsize, ysize rastervalue = band.ReadAsArray(xoff=0, yoff=0, win_xsize=xsize, win_ysize=ysize) data = np.array([]) count1 = np.sum(rastervalue == 1) count2 = np.sum(rastervalue == 2) count3 = np.sum(rastervalue == 3) count4 = np.sum(rastervalue == 4) count5 = np.sum(rastervalue == 5) count6 = np.sum(rastervalue == 6) data = np.append(data, [count1, count2, count3, count4, count5, count6]) return data
def read_by_point(self, x, y, tif_file): ''' 获取坐标点的数据。 tif_file :数据产品 bandid :波段名称 x, y:坐标,坐标对应投影信息默认为:EPSG:4326 ''' raster = gdal.OpenShared(tif_file) if raster is None: print("Failed to open file: " + tif_file) sys.exit() feat_proj = raster.GetProjectionRef() gt = raster.GetGeoTransform() # transform geographic coordinates of monitor points into projected coordinate system inSpatialRef = osr.SpatialReference() inSpatialRef.SetFromUserInput("EPSG:4326") outSpatialRef = osr.SpatialReference() outSpatialRef.SetFromUserInput(feat_proj) transform = osr.CoordinateTransformation(inSpatialRef, outSpatialRef) # point coordinate transformation geom = ogr.Geometry(ogr.wkbPoint) geom.AddPoint(x, y) geom.Transform(transform) x_c = geom.GetX() y_c = geom.GetY() # read feature value of the point from related data col = int((x_c - gt[0]) / gt[1]) row = int((y_c - gt[3]) / gt[5]) # print(col, row) if col < raster.RasterXSize and row < raster.RasterYSize: return raster.ReadAsArray(col, row, 1, 1)[0][0] # print(feat_value) else: return None
def file_selection_ok(self, *args): self.source_name = self.o_s_d.get_filename() self.o_s_d.hide() rast = gdal.OpenShared(self.source_name, gdalconst.GA_ReadOnly) self.input_rast = rast self.pixsubarea = [0, 0, rast.RasterYSize, rast.RasterXSize] SetInitialCoord(self.frame_dict['pixcoord'], self.pixsubarea) self.geotransform = rast.GetGeoTransform() if EmptyGeotransform(self.geotransform): self.coord_system.set_history(0) self.update_gui() self.coord_system.hide() else: self.projsubarea = GetProjRect(self.pixsubarea, self.geotransform) SetInitialCoord(self.frame_dict['geocoord'], self.projsubarea) self.geogsubarea = GetGeogrRect(rast, self.projsubarea) SetInitialCoord(self.frame_dict['geodetic'], self.geogsubarea) self.band_list = [] for i in range(rast.RasterCount): item = ["Band " + str(i), "Yes"] self.band_list.append(item) if len(self.band_list) > 1: self.band_grid.set_source(self.band_list, expose=0) grid_titles = ['Band number', 'Load'] self.band_grid.define_columns(titles=grid_titles, editables=[0, 1]) self.band_grid.resize_to_default() for i in range(len(self.band_list)): self.band_num_list.append(i + 1) self.band_grid.show_all() else: self.band_grid.hide() self.dialog.show()