def create_contours(input_path, spacing, shp_path="DEFAULT", contour_base=0, no_data=1, no_data_value=0, overwrite=False): """ adapted from: http://stackoverflow.com/questions/22100453/gdal-python-creating-contourlines """ if shp_path == "DEFAULT": shp_path = input_path[:-4] + '_contour.shp' if os.path.isfile(shp_path) and overwrite != True: print "\n Contour lines already exist: {} \nProceeding with next file without checking for varying parameters (e.g. contour line spacing).\n Force overwrite with overwrite=True...".format( shp_path) return shp_path try: #Read in SRTM data raster = gdal.Open(input_path, GA_ReadOnly) raster_band1 = raster.GetRasterBand(1) #Generate layer to save Contourlines in contour_ds = ogr.GetDriverByName("ESRI Shapefile").CreateDataSource( shp_path) contour_shp = contour_ds.CreateLayer('contour') field_defn = ogr.FieldDefn("ID", ogr.OFTInteger) contour_shp.CreateField(field_defn) field_defn = ogr.FieldDefn("height", ogr.OFTReal) contour_shp.CreateField(field_defn) #TODO create nth field here #Generate Contourlines # gdal.ContourGenerate(raster_band1,spacing,contourbase,fixedlevelcount,boleanusenodata,dfnodatavalue,hLayer,idField,iElevfield,progress,pProgressArg # http://www.gdal.org/gdal__alg_8h.html#aceaf98ad40f159cbfb626988c054c085 gdal.ContourGenerate(raster_band1, spacing, contour_base, [], no_data, no_data_value, contour_shp, 0, 1) # TODO: delete small features < 1000m # more info here: http://pcjericks.github.io/py-gdalogr-cookbook/layers.html#filter-and-select-input-shapefile-to-new-output-shapefile-like-ogr2ogr-cli contour_ds = None del contour_ds return shp_path pass except Exception as e: print "createContours() could not finish it's duty Sir!" raise
def grid_contour(source, target): '''grid_contour() - Use GDAL and OGR to create a contour shapefile Parameters ---------- source : str input shapefile name target : str output shapefile name Returns ------- nothing ''' import ogr as ogr import gdal as gdal if target[-4:] != '.shp': target += '.shp' ogr_driver = ogr.GetDriverByName('ESRI Shapefile') ogr_ds = ogr_driver.CreateDataSource(target) ogr_lyr = ogr_ds.CreateLayer(target, geom_type=ogr.wkbLineString25D) field_defn = ogr.FieldDefn('ID', ogr.OFTInteger) ogr_lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('ELEV', ogr.OFTReal) ogr_lyr.CreateField(field_defn) # gdal.ContourGenerate() arguments: # Band srcBand, # double contourInterval, # double contourBase, # double[] fixedLevelCount, # int useNoData, # double noDataValue, # Layer dstLayer, # int idField, # int elevField ds = gdal.Open(source) gdal.ContourGenerate(ds.GetRasterBand(1), 400, 10, [], 0, 0, ogr_lyr, 0, 1) return
def counter(tiff_file, line_file): """生成等值线 :param tiff_file:栅格数据 :param line_file: 等值线结果 :return: """ indataset1 = gdal.Open(tiff_file, gdal.GA_ReadOnly) in1 = indataset1.GetRasterBand(1) #Generate layer to save Contourlines in ogr_ds = ogr.GetDriverByName("ESRI Shapefile").CreateDataSource(line_file) srs = osr.SpatialReference() srs.ImportFromEPSG(4326) contour_shp = ogr_ds.CreateLayer('contour', srs) field_defn = ogr.FieldDefn("ID", ogr.OFTInteger) contour_shp.CreateField(field_defn) field_defn = ogr.FieldDefn("elev", ogr.OFTReal) contour_shp.CreateField(field_defn) #Generate Contourlines gdal.ContourGenerate(in1, 1, 0, [], 0, 0, contour_shp, 0, 1) ogr_ds.Destroy()
import gdal import ogr # Elevation DEM source = "dem.asc" # Output shapefile target = "contour" ogr_driver = ogr.GetDriverByName('ESRI Shapefile') ogr_ds = ogr_driver.CreateDataSource(target + ".shp") ogr_lyr = ogr_ds.CreateLayer(target, geom_type=ogr.wkbLineString25D) field_defn = ogr.FieldDefn('ID', ogr.OFTInteger) ogr_lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('ELEV', ogr.OFTReal) ogr_lyr.CreateField(field_defn) # gdal.ContourGenerate() arguments # Band srcBand, # double contourInterval, # double contourBase, # double[] fixedLevelCount, # int useNoData, # double noDataValue, # Layer dstLayer, # int idField, # int elevField ds = gdal.Open('dem.asc') gdal.ContourGenerate(ds.GetRasterBand(1), 400, 10, [], 0, 0, ogr_lyr, 0, 1)
time_step = 0 for k in np.arange(0, src_ds.RasterCount): if tdim is None: timestamp = "0-0-0" else: timestamp = timestamps[k] logger.info("Processing {}".format(timestamp)) srcband = src_ds.GetRasterBand(k + 1) logger.debug("Running gdal.ContourGenerate()") tmp_layer = create_memory_layer(dst_fieldname) result = gdal.ContourGenerate(srcband, 0, 0, levels, 0, 0, tmp_layer, 0, 1, callback=gdal.TermProgress) logger.info("Saving results") featureDefn = interface_layer.GetLayerDefn() for feature in tmp_layer: # create a new feature outFeature = ogr.Feature(featureDefn) outFeature.SetGeometry(feature.GetGeometryRef()) i = outFeature.GetFieldIndex("level") ik = feature.GetFieldIndex("level") outFeature.SetField(i, feature.GetField(ik)) i = outFeature.GetFieldIndex("timestep")
def contour_1(): try: os.remove('tmp/contour.shp') except: pass try: os.remove('tmp/contour.dbf') except: pass try: os.remove('tmp/contour.shx') except: pass drv = gdal.GetDriverByName('GTiff') wkt = 'GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9108\"]],AUTHORITY[\"EPSG\",\"4326\"]]' size = 160 precision = 1. / size ds = drv.Create('tmp/gdal_contour.tif', size, size, 1) ds.SetProjection(wkt) ds.SetGeoTransform([1, precision, 0, 50, 0, -precision]) raw_data = array.array('h', [10 for i in range(int(size / 2))]).tostring() for i in range(int(size / 2)): ds.WriteRaster(int(size / 4), i + int(size / 4), int(size / 2), 1, raw_data, buf_type=gdal.GDT_Int16, band_list=[1]) raw_data = array.array('h', [20 for i in range(int(size / 2))]).tostring() for i in range(int(size / 4)): ds.WriteRaster(int(size / 4) + int(size / 8), i + int(size / 4) + int(size / 8), int(size / 4), 1, raw_data, buf_type=gdal.GDT_Int16, band_list=[1]) raw_data = array.array('h', [25 for i in range(int(size / 4))]).tostring() for i in range(int(size / 8)): ds.WriteRaster(int(size / 4) + int(size / 8) + int(size / 16), i + int(size / 4) + int(size / 8) + int(size / 16), int(size / 8), 1, raw_data, buf_type=gdal.GDT_Int16, band_list=[1]) ogr_ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource( 'tmp/contour.shp') ogr_lyr = ogr_ds.CreateLayer('contour') field_defn = ogr.FieldDefn('ID', ogr.OFTInteger) ogr_lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('elev', ogr.OFTReal) ogr_lyr.CreateField(field_defn) gdal.ContourGenerate(ds.GetRasterBand(1), 10, 0, [], 0, 0, ogr_lyr, 0, 1) ds = None expected_envelopes = [[1.25, 1.75, 49.25, 49.75], [ 1.25 + 0.125, 1.75 - 0.125, 49.25 + 0.125, 49.75 - 0.125 ]] expected_height = [10, 20] lyr = ogr_ds.ExecuteSQL("select * from contour order by elev asc") if lyr.GetFeatureCount() != len(expected_envelopes): print('Got %d features. Expected %d' % (lyr.GetFeatureCount(), len(expected_envelopes))) return 'fail' i = 0 feat = lyr.GetNextFeature() while feat is not None: envelope = feat.GetGeometryRef().GetEnvelope() if feat.GetField('elev') != expected_height[i]: print('Got %f. Expected %f' % (feat.GetField('elev'), expected_height[i])) return 'fail' for j in range(4): if abs(expected_envelopes[i][j] - envelope[j]) > precision / 2 * 1.001: print('i=%d, wkt=%s' % (i, feat.GetGeometryRef().ExportToWkt())) print(feat.GetGeometryRef().GetEnvelope()) print(expected_envelopes[i]) print('%f, %f' % (expected_envelopes[i][j] - envelope[j], precision / 2)) return 'fail' i = i + 1 feat = lyr.GetNextFeature() ogr_ds.ReleaseResultSet(lyr) ogr_ds.Destroy() return 'success'
def contour_2(): try: os.remove('tmp/contour.shp') except: pass try: os.remove('tmp/contour.dbf') except: pass try: os.remove('tmp/contour.shx') except: pass ogr_ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource( 'tmp/contour.shp') ogr_lyr = ogr_ds.CreateLayer('contour', geom_type=ogr.wkbLineString25D) field_defn = ogr.FieldDefn('ID', ogr.OFTInteger) ogr_lyr.CreateField(field_defn) field_defn = ogr.FieldDefn('elev', ogr.OFTReal) ogr_lyr.CreateField(field_defn) ds = gdal.Open('tmp/gdal_contour.tif') gdal.ContourGenerate(ds.GetRasterBand(1), 0, 0, [10, 20, 25], 0, 0, ogr_lyr, 0, 1) ds = None size = 160 precision = 1. / size expected_envelopes = [[1.25, 1.75, 49.25, 49.75], [ 1.25 + 0.125, 1.75 - 0.125, 49.25 + 0.125, 49.75 - 0.125 ], [ 1.25 + 0.125 + 0.0625, 1.75 - 0.125 - 0.0625, 49.25 + 0.125 + 0.0625, 49.75 - 0.125 - 0.0625 ]] expected_height = [10, 20, 25] lyr = ogr_ds.ExecuteSQL("select * from contour order by elev asc") if lyr.GetFeatureCount() != len(expected_envelopes): print('Got %d features. Expected %d' % (lyr.GetFeatureCount(), len(expected_envelopes))) return 'fail' i = 0 feat = lyr.GetNextFeature() while feat is not None: if feat.GetGeometryRef().GetZ(0) != expected_height[i]: print('Got %f as z. Expected %f' % (feat.GetGeometryRef().GetZ(0), expected_height[i])) return 'fail' envelope = feat.GetGeometryRef().GetEnvelope() if feat.GetField('elev') != expected_height[i]: print('Got %f. Expected %f' % (feat.GetField('elev'), expected_height[i])) return 'fail' for j in range(4): if abs(expected_envelopes[i][j] - envelope[j]) > precision / 2 * 1.001: print('i=%d, wkt=%s' % (i, feat.GetGeometryRef().ExportToWkt())) print(feat.GetGeometryRef().GetEnvelope()) print(expected_envelopes[i]) print('%f, %f' % (expected_envelopes[i][j] - envelope[j], precision / 2)) return 'fail' i = i + 1 feat = lyr.GetNextFeature() ogr_ds.ReleaseResultSet(lyr) ogr_ds.Destroy() return 'success'