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
Beispiel #2
0
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
Beispiel #3
0
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)
Beispiel #5
0
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")
Beispiel #6
0
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'
Beispiel #7
0
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'