Exemplo n.º 1
0
if not os.path.exists(grid_dir): os.mkdir(grid_dir)

for shapefile in shapefiles:

    grid = shapefile.split('/')[-1][4:-4]  #grid number from filename
    point = wd + 'point' + grid + '.shp'
    allpt = wd + 'all' + grid + '.shp'
    print 'Processing Grid, ', grid
    '''_____________________________________________________ZONAL STATISTICS OVER MAP'''
    if not point in glob.glob(wd + '/*'):
        print 'points for ', grid
        gme_isectpolyrst(shapefile, map_file)
        '''__________________________________________________OPEN VECTOR FILE AND ADD FIELD'''

        source = ogr.Open(shapefile, 1)
        layer = source.GetLayer()
        addIntField(layer, "label")
        field_names = getFieldNames(layer)
        maj_class = [x for x in field_names
                     if 'levV' in x][:-2]  #labels for majority (skip 254, sum)
        '''_______________________________________________________CALCULATE MAJORITY LABEL'''

        if 'label_1' in field_names:
            print '"label" field already exists for grid ' + str(grid)
            sys.exit()
        else:
            print 'CLASS LABELS FOR MAJORITY: ', ' '.join(
                [x for x in maj_class])
            calcMajority(
                layer, maj_class
Exemplo n.º 2
0
    def import_sua(self, filename, country_code, debug):
        from osgeo import ogr

        print("reading " + filename)
        country_blacklist = self.blacklist.get(country_code, [])
        temporary_file = os.path.join(
            current_app.config['SKYLINES_TEMPORARY_DIR'],
            os.path.basename(filename) + '.tmp')

        # try to uncomment a CLASS definition, as many SUA files from soaringweb.org have a CLASS comment
        with open(filename, 'r') as in_file:
            with open(temporary_file, 'w') as out_file:
                for line in in_file.xreadlines():
                    out_file.write(line.replace('# CLASS', 'CLASS'))

        if debug:
            print("Trying to open " + temporary_file)

        airspace_file = ogr.Open(temporary_file)
        if not airspace_file:
            if debug:
                print("OGR doesn't think that's a airspace file...")
            return

        layer = airspace_file.GetLayerByIndex(0)

        feature = layer.GetFeature(0)
        i = 0
        j = 0
        while (feature):
            feature = layer.GetFeature(i)
            i += 1

            if not feature:
                continue

            name = unicode(feature.GetFieldAsString('title'), 'latin1').strip()

            if name in country_blacklist:
                print(name + " is in blacklist")
                continue

            if debug:
                print("Adding " + name)

            airspace_class = feature.GetFieldAsString('class').strip()
            airspace_type = feature.GetFieldAsString('type').strip()

            if airspace_type:
                airspace_class = self.parse_airspace_type_tnp(airspace_type)
            elif airspace_class:
                airspace_class = self.parse_airspace_class_tnp(airspace_class)
            else:
                print(name + " has neither class nor type")
                continue

            added = self.add_airspace(country_code, airspace_class, name,
                                      feature.GetFieldAsString('base'),
                                      feature.GetFieldAsString('tops'),
                                      "POLYGON" + str(feature.geometry())[8:])

            if not added:
                continue

            if i % 100 == 0:
                print("inserting geometry " + str(i))

            j += 1

        airspace_file.Destroy()
        db.session.commit()

        os.remove(temporary_file)

        print("added " + str(j) + " features for country " + country_code)
Exemplo n.º 3
0
def test_ogr_osm_1(filename='data/osm/test.pbf'):

    ogrtest.osm_drv = ogr.GetDriverByName('OSM')
    if ogrtest.osm_drv is None:
        pytest.skip()

    ds = ogr.Open(filename)
    if ds is None:
        if filename == 'data/osm/test.osm':
            ogrtest.osm_drv_parse_osm = False
            if gdal.GetLastErrorMsg().find('OSM XML detected, but Expat parser not available') == 0:
                pytest.skip()

        pytest.fail()
    else:
        if filename == 'data/osm/test.osm':
            ogrtest.osm_drv_parse_osm = True

    # Test points
    lyr = ds.GetLayer('points')
    assert lyr.GetGeomType() == ogr.wkbPoint

    sr = lyr.GetSpatialRef()
    assert (sr.ExportToWkt().find('GEOGCS["WGS 84",DATUM["WGS_1984",') == 0 or \
       sr.ExportToWkt().find('GEOGCS["GCS_WGS_1984",DATUM["WGS_1984"') == 0)

    if filename == 'data/osm/test.osm':
        assert lyr.GetExtent() == (2.0, 3.0, 49.0, 50.0)

    feat = lyr.GetNextFeature()
    if feat.GetFieldAsString('osm_id') != '3' or \
       feat.GetFieldAsString('name') != 'Some interesting point' or \
       feat.GetFieldAsString('other_tags') != '"foo"=>"bar","bar"=>"baz"':
        feat.DumpReadable()
        pytest.fail()

    if ogrtest.check_feature_geometry(feat, ogr.CreateGeometryFromWkt('POINT (3.0 49.5)')) != 0:
        feat.DumpReadable()
        pytest.fail()

    feat = lyr.GetNextFeature()
    if feat is not None:
        feat.DumpReadable()
        pytest.fail()

    # Test lines
    lyr = ds.GetLayer('lines')
    assert lyr.GetGeomType() == ogr.wkbLineString

    feat = lyr.GetNextFeature()
    if feat.GetFieldAsString('osm_id') != '1' or \
       feat.GetFieldAsString('highway') != 'motorway' or \
       feat.GetFieldAsInteger('z_order') != 9 or \
       feat.GetFieldAsString('other_tags') != '"foo"=>"bar"':
        feat.DumpReadable()
        pytest.fail()

    if ogrtest.check_feature_geometry(feat, ogr.CreateGeometryFromWkt('LINESTRING (2 49,3 50)')) != 0:
        feat.DumpReadable()
        pytest.fail()

    feat = lyr.GetNextFeature()
    if feat.GetFieldAsString('osm_id') != '6':
        feat.DumpReadable()
        pytest.fail()

    if ogrtest.check_feature_geometry(feat, ogr.CreateGeometryFromWkt('LINESTRING (2 49,3 49,3 50,2 50,2 49)')) != 0:
        feat.DumpReadable()
        pytest.fail()

    feat = lyr.GetNextFeature()
    if feat is not None:
        feat.DumpReadable()
        pytest.fail()

    # Test multipolygons
    lyr = ds.GetLayer('multipolygons')
    if filename == 'tmp/ogr_osm_3':
        assert lyr.GetGeomType() == ogr.wkbPolygon
    else:
        assert lyr.GetGeomType() == ogr.wkbMultiPolygon

    feat = lyr.GetNextFeature()
    if feat.GetFieldAsString('osm_id') != '1' or \
       feat.GetFieldAsString('type') != 'multipolygon' or \
       feat.GetFieldAsString('natural') != 'forest':
        feat.DumpReadable()
        pytest.fail()

    if filename == 'tmp/ogr_osm_3':
        if ogrtest.check_feature_geometry(feat, ogr.CreateGeometryFromWkt('POLYGON ((2 49,2 50,3 50,3 49,2 49),(2.1 49.1,2.2 49.1,2.2 49.2,2.1 49.2,2.1 49.1))')) != 0:
            feat.DumpReadable()
            pytest.fail()
    else:
        if ogrtest.check_feature_geometry(feat, ogr.CreateGeometryFromWkt('MULTIPOLYGON (((2 49,3 49,3 50,2 50,2 49),(2.1 49.1,2.2 49.1,2.2 49.2,2.1 49.2,2.1 49.1)))')) != 0:
            feat.DumpReadable()
            pytest.fail()

    feat = lyr.GetNextFeature()
    if feat.GetFieldAsString('osm_id') != '5' or \
       feat.GetFieldAsString('type') != 'multipolygon' or \
       feat.GetFieldAsString('natural') != 'wood':
        feat.DumpReadable()
        pytest.fail()

    feat = lyr.GetNextFeature()
    if feat.GetFieldAsString('osm_way_id') != '8' or \
       feat.GetFieldAsString('name') != 'standalone_polygon':
        feat.DumpReadable()
        pytest.fail()

    feat = lyr.GetNextFeature()
    if feat is not None:
        feat.DumpReadable()
        pytest.fail()

    # Test multilinestrings
    lyr = ds.GetLayer('multilinestrings')
    if filename == 'tmp/ogr_osm_3':
        assert lyr.GetGeomType() == ogr.wkbLineString
    else:
        assert lyr.GetGeomType() == ogr.wkbMultiLineString

    feat = lyr.GetNextFeature()
    if feat.GetFieldAsString('osm_id') != '3' or \
       feat.GetFieldAsString('type') != 'route':
        feat.DumpReadable()
        pytest.fail()

    if filename == 'tmp/ogr_osm_3':
        if ogrtest.check_feature_geometry(feat, ogr.CreateGeometryFromWkt('LINESTRING (2 49,3 50)')) != 0:
            feat.DumpReadable()
            pytest.fail()
    else:
        if ogrtest.check_feature_geometry(feat, ogr.CreateGeometryFromWkt('MULTILINESTRING ((2 49,3 50))')) != 0:
            feat.DumpReadable()
            pytest.fail()

    feat = lyr.GetNextFeature()
    if feat is not None:
        feat.DumpReadable()
        pytest.fail()

    # Test other_relations
    lyr = ds.GetLayer('other_relations')
    if filename == 'tmp/ogr_osm_3':
        assert lyr is None
    else:
        assert lyr.GetGeomType() == ogr.wkbGeometryCollection

        feat = lyr.GetNextFeature()
        if feat.GetFieldAsString('osm_id') != '4' or \
           feat.GetFieldAsString('type') != 'other_type':
            feat.DumpReadable()
            pytest.fail()

        if ogrtest.check_feature_geometry(feat, ogr.CreateGeometryFromWkt('GEOMETRYCOLLECTION (POINT (2 49),LINESTRING (2 49,3 50))')) != 0:
            feat.DumpReadable()
            pytest.fail()

        feat = lyr.GetNextFeature()
        if feat is not None:
            feat.DumpReadable()
            pytest.fail()

    if ds.GetDriver().GetName() == 'OSM':
        sql_lyr = ds.ExecuteSQL("GetBytesRead()")
        assert sql_lyr is not None
        feat = sql_lyr.GetNextFeature()
        assert feat is not None
        feat = sql_lyr.GetNextFeature()
        assert feat is None
        sql_lyr.ResetReading()
        feat = sql_lyr.GetNextFeature()
        assert feat is not None
        sql_lyr.GetLayerDefn()
        sql_lyr.TestCapability("foo")
        ds.ReleaseResultSet(sql_lyr)

    ds = None
Exemplo n.º 4
0
    def testOverwriteLayer(self):
        """Tests writing a layer with a field value converter."""

        ml = QgsVectorLayer('Point?field=firstfield:int', 'test', 'memory')
        provider = ml.dataProvider()

        ft = QgsFeature()
        ft.setAttributes([1])
        provider.addFeatures([ft])

        options = QgsVectorFileWriter.SaveVectorOptions()
        options.driverName = 'GPKG'
        options.layerName = 'test'
        filename = '/vsimem/out.gpkg'
        write_result, error_message = QgsVectorFileWriter.writeAsVectorFormat(
            ml, filename, options)
        self.assertEqual(write_result, QgsVectorFileWriter.NoError,
                         error_message)

        ds = ogr.Open(filename, update=1)
        lyr = ds.GetLayerByName('test')
        self.assertIsNotNone(lyr)
        f = lyr.GetNextFeature()
        self.assertEqual(f['firstfield'], 1)
        ds.CreateLayer('another_layer')
        del f
        del lyr
        del ds

        caps = QgsVectorFileWriter.editionCapabilities(filename)
        self.assertTrue((caps & QgsVectorFileWriter.CanAddNewLayer))
        self.assertTrue((caps & QgsVectorFileWriter.CanAppendToExistingLayer))
        self.assertTrue(
            (caps & QgsVectorFileWriter.CanAddNewFieldsToExistingLayer))
        self.assertTrue((caps & QgsVectorFileWriter.CanDeleteLayer))

        self.assertTrue(QgsVectorFileWriter.targetLayerExists(
            filename, 'test'))

        self.assertFalse(
            QgsVectorFileWriter.areThereNewFieldsToCreate(
                filename, 'test', ml, [0]))

        # Test CreateOrOverwriteLayer
        ml = QgsVectorLayer('Point?field=firstfield:int', 'test', 'memory')
        provider = ml.dataProvider()

        ft = QgsFeature()
        ft.setAttributes([2])
        provider.addFeatures([ft])

        options = QgsVectorFileWriter.SaveVectorOptions()
        options.driverName = 'GPKG'
        options.layerName = 'test'
        options.actionOnExistingFile = QgsVectorFileWriter.CreateOrOverwriteLayer
        filename = '/vsimem/out.gpkg'
        write_result, error_message = QgsVectorFileWriter.writeAsVectorFormat(
            ml, filename, options)
        self.assertEqual(write_result, QgsVectorFileWriter.NoError,
                         error_message)

        ds = ogr.Open(filename)
        lyr = ds.GetLayerByName('test')
        self.assertIsNotNone(lyr)
        f = lyr.GetNextFeature()
        self.assertEqual(f['firstfield'], 2)
        # another_layer should still exist
        self.assertIsNotNone(ds.GetLayerByName('another_layer'))
        del f
        del lyr
        del ds

        # Test CreateOrOverwriteFile
        ml = QgsVectorLayer('Point?field=firstfield:int', 'test', 'memory')
        provider = ml.dataProvider()

        ft = QgsFeature()
        ft.setAttributes([3])
        provider.addFeatures([ft])

        options = QgsVectorFileWriter.SaveVectorOptions()
        options.driverName = 'GPKG'
        options.layerName = 'test'
        filename = '/vsimem/out.gpkg'
        write_result, error_message = QgsVectorFileWriter.writeAsVectorFormat(
            ml, filename, options)
        self.assertEqual(write_result, QgsVectorFileWriter.NoError,
                         error_message)

        ds = ogr.Open(filename)
        lyr = ds.GetLayerByName('test')
        self.assertIsNotNone(lyr)
        f = lyr.GetNextFeature()
        self.assertEqual(f['firstfield'], 3)
        # another_layer should no longer exist
        self.assertIsNone(ds.GetLayerByName('another_layer'))
        del f
        del lyr
        del ds

        # Test AppendToLayerNoNewFields
        ml = QgsVectorLayer('Point?field=firstfield:int&field=secondfield:int',
                            'test', 'memory')
        provider = ml.dataProvider()

        ft = QgsFeature()
        ft.setAttributes([4, -10])
        provider.addFeatures([ft])

        self.assertTrue(
            QgsVectorFileWriter.areThereNewFieldsToCreate(
                filename, 'test', ml, [0, 1]))

        options = QgsVectorFileWriter.SaveVectorOptions()
        options.driverName = 'GPKG'
        options.layerName = 'test'
        options.actionOnExistingFile = QgsVectorFileWriter.AppendToLayerNoNewFields
        filename = '/vsimem/out.gpkg'
        write_result, error_message = QgsVectorFileWriter.writeAsVectorFormat(
            ml, filename, options)
        self.assertEqual(write_result, QgsVectorFileWriter.NoError,
                         error_message)

        ds = ogr.Open(filename)
        lyr = ds.GetLayerByName('test')
        self.assertEqual(lyr.GetLayerDefn().GetFieldCount(), 1)
        self.assertIsNotNone(lyr)
        f = lyr.GetNextFeature()
        self.assertEqual(f['firstfield'], 3)
        f = lyr.GetNextFeature()
        self.assertEqual(f['firstfield'], 4)
        del f
        del lyr
        del ds

        # Test AppendToLayerAddFields
        ml = QgsVectorLayer('Point?field=firstfield:int&field=secondfield:int',
                            'test', 'memory')
        provider = ml.dataProvider()

        ft = QgsFeature()
        ft.setAttributes([5, -1])
        provider.addFeatures([ft])

        self.assertTrue(
            QgsVectorFileWriter.areThereNewFieldsToCreate(
                filename, 'test', ml, [0, 1]))

        options = QgsVectorFileWriter.SaveVectorOptions()
        options.driverName = 'GPKG'
        options.layerName = 'test'
        options.actionOnExistingFile = QgsVectorFileWriter.AppendToLayerAddFields
        filename = '/vsimem/out.gpkg'
        write_result, error_message = QgsVectorFileWriter.writeAsVectorFormat(
            ml, filename, options)
        self.assertEqual(write_result, QgsVectorFileWriter.NoError,
                         error_message)

        ds = ogr.Open(filename)
        lyr = ds.GetLayerByName('test')
        self.assertEqual(lyr.GetLayerDefn().GetFieldCount(), 2)
        self.assertIsNotNone(lyr)
        f = lyr.GetNextFeature()
        self.assertEqual(f['firstfield'], 3)
        if hasattr(f, "IsFieldSetAndNotNull"):
            # GDAL >= 2.2
            self.assertFalse(f.IsFieldSetAndNotNull('secondfield'))
        else:
            self.assertFalse(f.IsFieldSet('secondfield'))
        f = lyr.GetNextFeature()
        self.assertEqual(f['firstfield'], 4)
        if hasattr(f, "IsFieldSetAndNotNull"):
            self.assertFalse(f.IsFieldSetAndNotNull('secondfield'))
        else:
            self.assertFalse(f.IsFieldSet('secondfield'))
        f = lyr.GetNextFeature()
        self.assertEqual(f['firstfield'], 5)
        self.assertEqual(f['secondfield'], -1)
        del f
        del lyr
        del ds

        gdal.Unlink(filename)
Exemplo n.º 5
0
from osgeo import ogr
import ch7funcs

ds = ogr.Open(r'D:\osgeopy-data\Galapagos', True)
pt_lyr = ds.GetLayerByName('albatross_lambert')
poly_lyr = ds.CreateLayer('albatross_ranges', pt_lyr.GetSpatialRef(),
                          ogr.wkbPolygon)
id_field = ogr.FieldDefn('tag_id', ogr.OFTString)
area_field = ogr.FieldDefn('area', ogr.OFTReal)  #A
area_field.SetWidth(30)  #A
area_field.SetPrecision(4)  #A
poly_lyr.CreateFields([id_field, area_field])
poly_row = ogr.Feature(poly_lyr.GetLayerDefn())

for tag_id in ch7funcs.get_unique(ds, 'albatross_lambert', 'tag_id'):
    print('Processing ' + tag_id)
    pt_lyr.SetAttributeFilter("tag_id = '{}'".format(tag_id))
    locations = ogr.Geometry(ogr.wkbMultiPoint)  #B
    for pt_row in pt_lyr:  #B
        locations.AddGeometry(pt_row.geometry().Clone())  #B

    homerange = locations.ConvexHull()  #C
    poly_row.SetGeometry(homerange)
    poly_row.SetField('tag_id', tag_id)
    poly_row.SetField('area', homerange.GetArea())
    poly_lyr.CreateFeature(poly_row)

del ds
Exemplo n.º 6
0
def zonal_stats(feat, input_zone_polygon, input_value_raster, pointBuf):
    ## https://gis.stackexchange.com/questions/77993/issue-trying-to-create-zonal-statistics-using-gdal-and-python
    """
    Does zonal stats on a feature from an input zone polygon
        input zone poly can be a point shp too - in which case it'll use the pointBuf arg
            to detemine the distance in X and Y used for creating a zone from the original point
    """
    # Open raster data
    raster = gdal.Open(input_value_raster)

    # --- Check if current feature intersects with raster extent

    # Now open up that reprojected input_zone_polygon
    shp = ogr.Open(input_zone_polygon)
    lyr = shp.GetLayer()

    # Get raster georeference info
    ##    gt = raster.GetGeoTransform()
    ##    xOrigin = gt[0]
    ##    yOrigin = gt[3]
    ##    pixelWidth = gt[1]
    ##    pixelHeight = gt[5]
    ##
    ##    # Get extent of raster
    ##    ## [left, top, right, bottom]
    ##    rasterExtent = [xOrigin, yOrigin, xOrigin + (pixelWidth * raster.RasterXSize), yOrigin + (pixelHeight * raster.RasterYSize)]
    rasterExtent, xOrigin, yOrigin, pixelWidth, pixelHeight = get_raster_extent(
        raster)

    # Get extent of feat
    geom = feat.GetGeometryRef()

    if (geom.GetGeometryName() == 'MULTIPOLYGON'):
        count = 0
        pointsX = []
        pointsY = []
        for polygon in geom:
            geomInner = geom.GetGeometryRef(count)
            ring = geomInner.GetGeometryRef(0)
            numpoints = ring.GetPointCount()
            for p in range(numpoints):
                lon, lat, z = ring.GetPoint(p)
                pointsX.append(lon)
                pointsY.append(lat)
            count += 1

    elif (geom.GetGeometryName() == 'POLYGON'):
        ring = geom.GetGeometryRef(0)
        numpoints = ring.GetPointCount()
        pointsX = []
        pointsY = []
        for p in range(numpoints):
            lon, lat, z = ring.GetPoint(p)
            pointsX.append(lon)
            pointsY.append(lat)

    elif (geom.GetGeometryName() == 'POINT'):
        # Create 3 points:
        #   center (actual xy of point) and an UR & LL based on a buffer distance of pointBuf
        pointsX = []
        pointsY = []
        pointsX.append(geom.GetX())
        pointsX.append(geom.GetX() + pointBuf)
        pointsX.append(geom.GetX() - pointBuf)
        pointsY.append(geom.GetY())
        pointsY.append(geom.GetY() + pointBuf)
        pointsY.append(geom.GetY() - pointBuf)

    else:
        sys.exit()

    # Get the extent of the current feature
    xmin = min(pointsX)
    xmax = max(pointsX)
    ymin = min(pointsY)
    ymax = max(pointsY)
    ## [left, bottom, right, top]
    featExtent = [xmin, ymax, xmax, ymin]
    ##    print '\t        -         Bounds: [xmin,ymin,xmax,ymax]'
    ##    print '\t        - Feature bounds: %s' % str(featExtent)
    ##    print '\t        - Raster bounds: %s' % str(rasterExtent)

    # Need to find intersection of featExtent and rasterExtent here
    ## max of the lefts (xmins), [0]
    ## min of the tops
    ## min of the rights
    ## max of the bottoms
    intersection = [max(rasterExtent[0], featExtent[0]) , \
                    min(rasterExtent[1], featExtent[1]) , \
                    min(rasterExtent[2], featExtent[2]) , \
                    max(rasterExtent[3], featExtent[3]) ]

    if rasterExtent != featExtent:
        print '\tLooking for overlap (intersection) b/w feature and raster...'
        # check for any overlap at all...
        if (intersection[2] < intersection[0]) or (intersection[1] <
                                                   intersection[3]):
            intersection = None
            print '\t***No overlap. Returning np.nan value for zonal statistics'
            return np.nan, np.nan
        else:
            print '\tHere is the overlap (intersection):', intersection
            # Specify offset and rows and columns to read
            xoff = int((xmin - xOrigin) / pixelWidth)
            yoff = int((yOrigin - ymax) / pixelWidth)
            xcount = int((xmax - xmin) / pixelWidth) + 1
            ycount = int((ymax - ymin) / pixelWidth) + 1

            # print '\t Create memory target raster...'
            target_ds = gdal.GetDriverByName('MEM').Create(
                '', xcount, ycount, gdal.GDT_Byte)
            target_ds.SetGeoTransform((
                xmin,
                pixelWidth,
                0,
                ymax,
                0,
                pixelHeight,
            ))

            # Create for target raster the same projection as for the value raster
            raster_srs = osr.SpatialReference()
            raster_srs.ImportFromWkt(raster.GetProjectionRef())
            target_ds.SetProjection(raster_srs.ExportToWkt())

            # print '\t Rasterize zone polygon to raster, fill with 1's...'
            gdal.RasterizeLayer(target_ds, [1], lyr, burn_values=[1])

            # print '\tRead raster as arrays...'
            banddataraster = raster.GetRasterBand(1)
            try:
                dataraster = banddataraster.ReadAsArray(
                    xoff, yoff, xcount, ycount).astype(np.float)
            except Exception, e:
                print '\t' + str(e)
                dataraster = banddataraster.ReadAsArray(
                    xoff, yoff, xcount, ycount)

##            print 'dataraster'
##            print dataraster

# Set up datamask that is filled with 1's
            bandmask = target_ds.GetRasterBand(1)
            datamask = bandmask.ReadAsArray(0, 0, xcount,
                                            ycount)  ##.astype(np.float)
            if geom.GetGeometryName() == 'POINT':
                # For points, this has to be done, otherwise you get 0s for all but the center position...
                datamask.fill(1)


##                print 'datamask'
##                print datamask

##            print '/t xoff + xcount = ' + str(xoff) + ' + ' + str(xcount) + ' = ' + str(np.add(xoff,xcount))
##            print '/t raster X size = ' + str(raster.RasterXSize)
##            print '/t yoff + ycount = ' + str(yoff) + ' + ' + str(ycount) + ' = ' + str(np.add(yoff,ycount))
##            print '/t raster Y size = ' + str(raster.RasterYSize)

# Mask zone of raster
            try:
                zoneraster = np.ma.masked_array(dataraster,
                                                np.logical_not(datamask))
                zoneraster[zoneraster <= -99.] = np.nan

                try:
                    # Get a masked array that prevents nans from interfering
                    ##https://stackoverflow.com/questions/5480694/numpy-calculate-averages-with-nans-removed
                    m_zoneraster = np.ma.masked_array(zoneraster,
                                                      np.isnan(zoneraster))

                    # Calculate statistics of zonal raster
                    ##print '\t std: ' + str(round(np.std(zoneraster),2))
                    ##return round(np.mean(zoneraster),2), round(np.std(zoneraster),2)
                    print '\t std: ' + str(round(m_zoneraster.std(), 2))

                    zValList = dataraster.flatten()
                    return round(m_zoneraster.mean(),
                                 2), round(m_zoneraster.std(), 2), zValList

                except Exception, e:
                    print '\t' + str(e)

                    return np.nan, np.nan, None

            except Exception, e:
                print '\t No stats for features straddling edge of raster.'

                return np.nan, np.nan, None
Exemplo n.º 7
0
def ogr_mongodb_2():
    if ogrtest.mongodb_drv is None:
        return 'skip'

    ogrtest.mongodb_ds = ogr.Open(ogrtest.mongodb_test_uri, update=1)
    if ogrtest.mongodb_ds.GetLayerByName('not_existing') is not None:
        gdaltest.post_reason('fail')
        return 'fail'

    if ogrtest.mongodb_ds.TestCapability(ogr.ODsCCreateLayer) != 1:
        gdaltest.post_reason('fail')
        return 'fail'

    if ogrtest.mongodb_ds.TestCapability(ogr.ODsCDeleteLayer) != 1:
        gdaltest.post_reason('fail')
        return 'fail'

    if ogrtest.mongodb_ds.TestCapability(
            ogr.ODsCCreateGeomFieldAfterCreateLayer) != 1:
        gdaltest.post_reason('fail')
        return 'fail'

    # Create layer
    a_uuid = str(uuid.uuid1()).replace('-', '_')
    ogrtest.mongodb_layer_name = 'test_' + a_uuid
    srs = osr.SpatialReference()
    srs.ImportFromEPSG(4258)  # ETRS 89 will reproject identically to EPSG:4326
    lyr = ogrtest.mongodb_ds.CreateLayer(
        ogrtest.mongodb_layer_name,
        geom_type=ogr.wkbPolygon,
        srs=srs,
        options=['GEOMETRY_NAME=location.mygeom', 'FID='])

    gdal.PushErrorHandler()
    ret = lyr.CreateGeomField(
        ogr.GeomFieldDefn('location.mygeom', ogr.wkbPoint))
    gdal.PopErrorHandler()
    if ret == 0:
        gdaltest.post_reason('fail')
        return 'fail'

    ret = lyr.CreateField(ogr.FieldDefn('str', ogr.OFTString))
    if ret != 0:
        gdaltest.post_reason('fail')
        return 'fail'

    gdal.PushErrorHandler()
    ret = lyr.CreateField(ogr.FieldDefn('str', ogr.OFTString))
    gdal.PopErrorHandler()
    if ret == 0:
        gdaltest.post_reason('fail')
        return 'fail'

    lyr.CreateField(ogr.FieldDefn('location.name', ogr.OFTString))
    bool_field = ogr.FieldDefn('bool', ogr.OFTInteger)
    bool_field.SetSubType(ogr.OFSTBoolean)
    lyr.CreateField(bool_field)
    lyr.CreateField(ogr.FieldDefn('int', ogr.OFTInteger))
    lyr.CreateField(ogr.FieldDefn('int64', ogr.OFTInteger64))
    lyr.CreateField(ogr.FieldDefn('real', ogr.OFTReal))
    lyr.CreateField(ogr.FieldDefn('dt', ogr.OFTDateTime))
    lyr.CreateField(ogr.FieldDefn('embed.str', ogr.OFTString))
    lyr.CreateField(ogr.FieldDefn('binary', ogr.OFTBinary))
    lyr.CreateField(ogr.FieldDefn('strlist', ogr.OFTStringList))
    lyr.CreateField(ogr.FieldDefn('intlist', ogr.OFTIntegerList))
    lyr.CreateField(ogr.FieldDefn('int64list', ogr.OFTInteger64List))
    lyr.CreateField(ogr.FieldDefn('realist', ogr.OFTRealList))
    lyr.CreateField(ogr.FieldDefn('embed.embed2.int', ogr.OFTInteger))
    lyr.CreateField(ogr.FieldDefn('embed.embed2.real', ogr.OFTReal))

    # Test CreateFeature()
    f = ogr.Feature(lyr.GetLayerDefn())
    f['str'] = 'str'
    f['location.name'] = 'Paris'
    f['bool'] = 1
    f['int'] = 1
    f['int64'] = 1234567890123456  # put a number larger than 1 << 40 so that fromjson() doesn't pick double
    f['real'] = 1.23
    f['dt'] = '1234/12/31 23:59:59.123+00'
    f.SetFieldBinaryFromHexString('binary', '00FF')
    f['strlist'] = ['a', 'b']
    f['intlist'] = [1, 2]
    f['int64list'] = [1234567890123456, 1234567890123456]
    f['realist'] = [1.23, 4.56]
    f['embed.str'] = 'foo'
    f['embed.embed2.int'] = 3
    f['embed.embed2.real'] = 3.45
    f.SetGeometryDirectly(
        ogr.CreateGeometryFromWkt('POLYGON((2 49,2 50,3 50,3 49,2 49))'))
    if lyr.CreateFeature(f) != 0:
        gdaltest.post_reason('fail')
        return 'fail'
    if f['_id'] is None:
        gdaltest.post_reason('fail')
        return 'fail'
    f_ref = f.Clone()

    # Test GetFeatureCount()
    if lyr.GetFeatureCount() != 1:
        gdaltest.post_reason('fail')
        return 'fail'

    # Test GetNextFeature()
    lyr.ResetReading()
    f = lyr.GetNextFeature()
    if not f.Equal(f_ref):
        gdaltest.post_reason('fail')
        f.DumpReadable()
        return 'fail'
    f = lyr.GetNextFeature()
    if f is not None:
        gdaltest.post_reason('fail')
        f.DumpReadable()
        return 'fail'

    # Test GetFeature()
    f = lyr.GetFeature(1)
    if not f.Equal(f_ref):
        gdaltest.post_reason('fail')
        f.DumpReadable()
        return 'fail'

    # Test SetFeature()
    f['bool'] = 0
    if lyr.SetFeature(f) != 0:
        gdaltest.post_reason('fail')
        return 'fail'
    f_ref = f.Clone()
    f = lyr.GetFeature(1)
    if f['bool'] != 0:
        gdaltest.post_reason('fail')
        f.DumpReadable()
        return 'fail'

    # Test (not working) DeleteFeature()
    gdal.PushErrorHandler()
    ret = lyr.DeleteFeature(1)
    gdal.PopErrorHandler()
    if ret == 0:
        gdaltest.post_reason('fail')
        return 'fail'

    # Test Mongo filter
    lyr.SetAttributeFilter('{ "int": 1 }')
    lyr.ResetReading()
    f = lyr.GetNextFeature()
    if not f.Equal(f_ref):
        gdaltest.post_reason('fail')
        f.DumpReadable()
        return 'fail'

    lyr.SetAttributeFilter('{ "int": 2 }')
    lyr.ResetReading()
    f = lyr.GetNextFeature()
    if f is not None:
        gdaltest.post_reason('fail')
        f.DumpReadable()
        return 'fail'

    # Test OGR filter
    lyr.SetAttributeFilter('int = 1')
    lyr.ResetReading()
    f = lyr.GetNextFeature()
    if not f.Equal(f_ref):
        gdaltest.post_reason('fail')
        f.DumpReadable()
        return 'fail'

    lyr.SetAttributeFilter('int = 2')
    lyr.ResetReading()
    f = lyr.GetNextFeature()
    if f is not None:
        gdaltest.post_reason('fail')
        f.DumpReadable()
        return 'fail'

    # Test geometry filter
    lyr.SetAttributeFilter(None)
    lyr.SetSpatialFilterRect(2.1, 49.1, 2.9, 49.9)
    lyr.ResetReading()
    f = lyr.GetNextFeature()
    if not f.Equal(f_ref):
        gdaltest.post_reason('fail')
        f.DumpReadable()
        return 'fail'

    lyr.SetSpatialFilterRect(1.1, 49.1, 1.9, 49.9)
    lyr.ResetReading()
    f = lyr.GetNextFeature()
    if f is not None:
        gdaltest.post_reason('fail')
        f.DumpReadable()
        return 'fail'

    f = f_ref.Clone()
    f.SetFID(-1)
    f.SetGeometryDirectly(None)
    if lyr.CreateFeature(f) != 0:
        gdaltest.post_reason('fail')
        return 'fail'

    # Duplicate key
    gdal.PushErrorHandler()
    ret = lyr.SyncToDisk()
    gdal.PopErrorHandler()
    if ret == 0:
        gdaltest.post_reason('fail')
        return 'fail'

    f['_id'] = None
    lyr.CreateFeature(f)
    ret = lyr.SyncToDisk()
    if ret != 0:
        gdaltest.post_reason('fail')
        return 'fail'

    # Missing _id
    f.UnsetField('_id')
    gdal.PushErrorHandler()
    ret = lyr.SetFeature(f)
    gdal.PopErrorHandler()
    if ret == 0:
        gdaltest.post_reason('fail')
        return 'fail'

    # MongoDB dialect of ExecuteSQL() with invalid JSON
    gdal.PushErrorHandler()
    sql_lyr = ogrtest.mongodb_ds.ExecuteSQL('{', dialect='MongoDB')
    gdal.PopErrorHandler()

    # MongoDB dialect of ExecuteSQL() with nonexistent command.
    sql_lyr = ogrtest.mongodb_ds.ExecuteSQL('{ "foo": 1 }', dialect='MongoDB')
    if sql_lyr is None:
        gdaltest.post_reason('fail')
        return 'fail'
    ogrtest.mongodb_ds.ReleaseResultSet(sql_lyr)

    # MongoDB dialect of ExecuteSQL() with existing commnand
    sql_lyr = ogrtest.mongodb_ds.ExecuteSQL('{ "listCommands" : 1 }',
                                            dialect='MongoDB')
    if sql_lyr is None:
        gdaltest.post_reason('fail')
        return 'fail'
    f = sql_lyr.GetNextFeature()
    if f is None:
        gdaltest.post_reason('fail')
        return 'fail'
    f = sql_lyr.GetNextFeature()
    if f is not None:
        gdaltest.post_reason('fail')
        return 'fail'
    sql_lyr.GetLayerDefn()
    sql_lyr.ResetReading()
    sql_lyr.TestCapability('')
    ogrtest.mongodb_ds.ReleaseResultSet(sql_lyr)

    # Regular ExecuteSQL()
    sql_lyr = ogrtest.mongodb_ds.ExecuteSQL('SELECT * FROM ' +
                                            ogrtest.mongodb_layer_name)
    if sql_lyr is None:
        gdaltest.post_reason('fail')
        return 'fail'
    ogrtest.mongodb_ds.ReleaseResultSet(sql_lyr)

    # Test CreateLayer again with same name
    gdal.PushErrorHandler()
    lyr = ogrtest.mongodb_ds.CreateLayer(ogrtest.mongodb_layer_name)
    gdal.PopErrorHandler()
    if lyr is not None:
        return 'fail'

    ogrtest.mongodb_ds = gdal.OpenEx(
        ogrtest.mongodb_test_uri,
        gdal.OF_UPDATE,
        open_options=[
            'FEATURE_COUNT_TO_ESTABLISH_FEATURE_DEFN=-1', 'BULK_INSERT=NO',
            'JSON_FIELD=TRUE'
        ])

    # Check after reopening
    lyr = ogrtest.mongodb_ds.GetLayerByName(ogrtest.mongodb_layer_name)
    if lyr.TestCapability(ogr.OLCFastSpatialFilter) == 0:
        gdaltest.post_reason('fail')
        return 'fail'
    f = lyr.GetNextFeature()
    json_field = f['_json']
    # We cannot use feature.Equal() has the C++ layer defn has changed
    for i in range(f_ref.GetDefnRef().GetFieldCount()):
        if f.GetField(i) != f_ref.GetField(i) or \
           f.GetFieldDefnRef(i).GetType() != f_ref.GetFieldDefnRef(i).GetType() or \
           f.GetFieldDefnRef(i).GetSubType() != f_ref.GetFieldDefnRef(i).GetSubType():
            gdaltest.post_reason('fail')
            f.DumpReadable()
            f_ref.DumpReadable()
            return 'fail'
    for i in range(f_ref.GetDefnRef().GetGeomFieldCount()):
        if not f.GetGeomFieldRef(i).Equals(f_ref.GetGeomFieldRef(i)) or \
               f.GetGeomFieldDefnRef(i).GetName() != f_ref.GetGeomFieldDefnRef(i).GetName() or \
               f.GetGeomFieldDefnRef(i).GetType() != f_ref.GetGeomFieldDefnRef(i).GetType():
            gdaltest.post_reason('fail')
            f.DumpReadable()
            f_ref.DumpReadable()
            return 'fail'

    lyr.SetSpatialFilterRect(2.1, 49.1, 2.9, 49.9)
    lyr.ResetReading()
    if f is None:
        gdaltest.post_reason('fail')
        f.DumpReadable()
        return 'fail'

    # Create a feature only from its _json content and do not store any ogr metadata related to the layer
    ogrtest.mongodb_layer_name_no_ogr_metadata = ogrtest.mongodb_layer_name + "_no_ogr_metadata"
    lyr = ogrtest.mongodb_ds.CreateLayer(
        ogrtest.mongodb_layer_name_no_ogr_metadata,
        options=[
            'GEOMETRY_NAME=location.mygeom', 'FID=', 'WRITE_OGR_METADATA=NO'
        ])
    f = ogr.Feature(lyr.GetLayerDefn())
    f['_json'] = json_field
    if lyr.CreateFeature(f) != 0:
        gdaltest.post_reason('fail')
        return 'fail'

    ogrtest.mongodb_layer_name_guess_types = ogrtest.mongodb_layer_name + "_guess_types"
    lyr = ogrtest.mongodb_ds.CreateLayer(
        ogrtest.mongodb_layer_name_guess_types,
        geom_type=ogr.wkbNone,
        options=['FID=', 'WRITE_OGR_METADATA=NO'])
    f = ogr.Feature(lyr.GetLayerDefn())
    f['_json'] = '{'
    f['_json'] += '"int": 2, '
    f['_json'] += '"int64": { "$numberLong" : "1234567890123456" }, '
    f['_json'] += '"real": 2.34, '
    f['_json'] += '"intlist" : [2], '
    f['_json'] += '"reallist" : [2.34], '
    f['_json'] += '"int64list" : [{ "$numberLong" : "1234567890123456" }], '
    f['_json'] += '"int_str" : 2, '
    f['_json'] += '"str_int" : "2", '
    f['_json'] += '"int64_str" : { "$numberLong" : "1234567890123456" }, '
    f['_json'] += '"str_int64" : "2", '
    f['_json'] += '"int_int64": 2, '
    f['_json'] += '"int64_int": { "$numberLong" : "1234567890123456" }, '
    f['_json'] += '"int_real": 2, '
    f['_json'] += '"real_int": 3.45, '
    f['_json'] += '"int64_real": { "$numberLong" : "1234567890123456" }, '
    f['_json'] += '"real_int64": 3.45, '
    f['_json'] += '"real_str": 3.45, '
    f['_json'] += '"str_real": "3.45", '
    f['_json'] += '"int_bool" : 2, '
    f['_json'] += '"bool_int" : true, '
    f['_json'] += '"intlist_strlist" : [2], '
    f['_json'] += '"strlist_intlist" : ["2"], '
    f['_json'] += '"intlist_int64list": [2], '
    f['_json'] += '"int64list_intlist": [{ "$numberLong" : "1234567890123456" }], '
    f['_json'] += '"intlist_reallist": [2], '
    f['_json'] += '"reallist_intlist": [3.45], '
    f['_json'] += '"int64list_reallist": [{ "$numberLong" : "1234567890123456" }], '
    f['_json'] += '"reallist_int64list": [3.45], '
    f['_json'] += '"intlist_boollist" : [2], '
    f['_json'] += '"boollist_intlist" : [true], '
    f['_json'] += '"mixedlist": [true,1,{ "$numberLong" : "1234567890123456" },3.45],'
    f['_json'] += '"mixedlist2": [true,1,{ "$numberLong" : "1234567890123456" },3.45,"str"]'
    f['_json'] += '}'
    if lyr.CreateFeature(f) != 0:
        gdaltest.post_reason('fail')
        return 'fail'

    f = ogr.Feature(lyr.GetLayerDefn())
    f['_json'] = '{'
    f['_json'] += '"int_str" : "3", '
    f['_json'] += '"str_int" : 3, '
    f['_json'] += '"int64_str" : "2", '
    f['_json'] += '"str_int64" : { "$numberLong" : "1234567890123456" }, '
    f['_json'] += '"int_int64": { "$numberLong" : "1234567890123456" }, '
    f['_json'] += '"int64_int": 2, '
    f['_json'] += '"int_real" : 3.45, '
    f['_json'] += '"real_int": 2, '
    f['_json'] += '"int64_real": 3.45, '
    f['_json'] += '"real_int64": { "$numberLong" : "1234567890123456" }, '
    f['_json'] += '"real_str": "3.45", '
    f['_json'] += '"str_real": 3.45, '
    f['_json'] += '"int_bool" : true, '
    f['_json'] += '"bool_int" : 2, '
    f['_json'] += '"intlist_strlist" : ["3"], '
    f['_json'] += '"strlist_intlist" : [3], '
    f['_json'] += '"intlist_int64list": [{ "$numberLong" : "1234567890123456" }], '
    f['_json'] += '"int64list_intlist": [2], '
    f['_json'] += '"intlist_reallist": [3.45], '
    f['_json'] += '"reallist_intlist": [2], '
    f['_json'] += '"int64list_reallist": [3.45], '
    f['_json'] += '"reallist_int64list": [{ "$numberLong" : "1234567890123456" }], '
    f['_json'] += '"intlist_boollist" : [true], '
    f['_json'] += '"boollist_intlist" : [2]'
    f['_json'] += '}'
    if lyr.CreateFeature(f) != 0:
        gdaltest.post_reason('fail')
        return 'fail'

    # This new features will not be taken into account by below the FEATURE_COUNT_TO_ESTABLISH_FEATURE_DEFN=2
    f = ogr.Feature(lyr.GetLayerDefn())
    f['_json'] = '{'
    f['_json'] += '"int": { "$minKey": 1 }, '
    f['_json'] += '"int64": { "$minKey": 1 }, '
    f['_json'] += '"real": { "$minKey": 1 }, '
    f['_json'] += '"intlist" : [1, "1", { "$minKey": 1 },{ "$maxKey": 1 },{ "$numberLong" : "-1234567890123456" }, { "$numberLong" : "1234567890123456" }, -1234567890123456.1, 1234567890123456.1, { "$numberLong" : "1" }, 1.23 ], '
    f['_json'] += '"int64list" : [1, { "$numberLong" : "1234567890123456" }, "1", { "$minKey": 1 },{ "$maxKey": 1 }, -1e300, 1e300, 1.23 ], '
    f['_json'] += '"reallist" : [1, { "$numberLong" : "1234567890123456" }, 1.0, "1", { "$minKey": 1 },{ "$maxKey": 1 }, { "$numberLong" : "1234567890123456" } ] '
    f['_json'] += '}'
    if lyr.CreateFeature(f) != 0:
        gdaltest.post_reason('fail')
        return 'fail'

    f = ogr.Feature(lyr.GetLayerDefn())
    f['_json'] = '{'
    f['_json'] += '"int": { "$maxKey": 1 }, '
    f['_json'] += '"int64": { "$maxKey": 1 }, '
    f['_json'] += '"real": { "$maxKey": 1 } '
    f['_json'] += '}'
    if lyr.CreateFeature(f) != 0:
        gdaltest.post_reason('fail')
        return 'fail'

    ogrtest.mongodb_layer_name_with_2d_index = ogrtest.mongodb_layer_name + "_with_2d_index"
    gdal.SetConfigOption('OGR_MONGODB_SPAT_INDEX_TYPE', '2d')
    lyr = ogrtest.mongodb_ds.CreateLayer(
        ogrtest.mongodb_layer_name_with_2d_index,
        geom_type=ogr.wkbPoint,
        options=['FID=', 'WRITE_OGR_METADATA=NO'])
    gdal.SetConfigOption('OGR_MONGODB_SPAT_INDEX_TYPE', None)
    f = ogr.Feature(lyr.GetLayerDefn())
    f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(2 49)'))
    if lyr.CreateFeature(f) != 0:
        gdaltest.post_reason('fail')
        return 'fail'

    ogrtest.mongodb_layer_name_no_spatial_index = ogrtest.mongodb_layer_name + "_no_spatial_index"
    for i in range(2):
        lyr = ogrtest.mongodb_ds.CreateLayer(
            ogrtest.mongodb_layer_name_no_spatial_index,
            options=['SPATIAL_INDEX=NO', 'OVERWRITE=YES'])
        f = ogr.Feature(lyr.GetLayerDefn())
        f.SetGeometryDirectly(ogr.CreateGeometryFromWkt('POINT(2 49)'))
        if lyr.CreateFeature(f) != 0:
            gdaltest.post_reason('fail')
            return 'fail'
        ogrtest.mongodb_ds.ExecuteSQL(
            'WRITE_OGR_METADATA ' +
            ogrtest.mongodb_layer_name_no_spatial_index)

    # Open "ghost" layer
    lyr = ogrtest.mongodb_ds.GetLayerByName('_ogr_metadata')
    if lyr is None:
        gdaltest.post_reason('fail')
        return 'fail'
    lyr.SetAttributeFilter("layer LIKE '%s%%'" % ogrtest.mongodb_layer_name)
    if lyr.GetFeatureCount() != 2:
        print(lyr.GetFeatureCount())
        gdaltest.post_reason('fail')
        return 'fail'

    if ogrtest.mongodb_ds.DeleteLayer(-1) == 0:
        gdaltest.post_reason('fail')
        return 'fail'

    lyr = ogrtest.mongodb_ds.GetLayerByName(ogrtest.mongodb_test_dbname + '.' +
                                            '_ogr_metadata')
    if lyr is None:
        gdaltest.post_reason('fail')
        return 'fail'

    ogrtest.mongodb_ds = None

    # Reopen in read-only
    ogrtest.mongodb_ds = gdal.OpenEx(
        ogrtest.mongodb_test_uri,
        0,
        open_options=[
            'FEATURE_COUNT_TO_ESTABLISH_FEATURE_DEFN=2', 'JSON_FIELD=TRUE'
        ])

    lyr = ogrtest.mongodb_ds.GetLayerByName(
        ogrtest.mongodb_layer_name_no_ogr_metadata)
    if lyr.TestCapability(ogr.OLCFastSpatialFilter) != 0:
        gdaltest.post_reason('fail')
        return 'fail'
    f = lyr.GetNextFeature()
    for i in range(f_ref.GetDefnRef().GetFieldCount()):
        # Order might be a bit different...
        j = f.GetDefnRef().GetFieldIndex(f_ref.GetFieldDefnRef(i).GetNameRef())
        if f.GetField(j) != f_ref.GetField(i) or \
        f.GetFieldDefnRef(j).GetType() != f_ref.GetFieldDefnRef(i).GetType() or \
        f.GetFieldDefnRef(j).GetSubType() != f_ref.GetFieldDefnRef(i).GetSubType():
            gdaltest.post_reason('fail')
            f.DumpReadable()
            f_ref.DumpReadable()
            return 'fail'
    for i in range(f_ref.GetDefnRef().GetGeomFieldCount()):
        # Order might be a bit different...
        j = f.GetDefnRef().GetGeomFieldIndex(
            f_ref.GetGeomFieldDefnRef(i).GetNameRef())
        if not f.GetGeomFieldRef(j).Equals(f_ref.GetGeomFieldRef(i)) or \
            f.GetGeomFieldDefnRef(j).GetName() != f_ref.GetGeomFieldDefnRef(i).GetName() or \
            f.GetGeomFieldDefnRef(j).GetType() != f_ref.GetGeomFieldDefnRef(i).GetType():
            gdaltest.post_reason('fail')
            f.DumpReadable()
            f_ref.DumpReadable()
            print(f.GetGeomFieldDefnRef(j).GetType())
            print(f_ref.GetGeomFieldDefnRef(i).GetType())
            return 'fail'

    lyr.SetSpatialFilterRect(2.1, 49.1, 2.9, 49.9)
    lyr.ResetReading()
    if f is None:
        gdaltest.post_reason('fail')
        f.DumpReadable()
        return 'fail'

    lyr = ogrtest.mongodb_ds.GetLayerByName(
        ogrtest.mongodb_layer_name_guess_types)

    expected_fields = [
        ("int", ogr.OFTInteger), ("int64", ogr.OFTInteger64),
        ("real", ogr.OFTReal), ("intlist", ogr.OFTIntegerList),
        ("reallist", ogr.OFTRealList), ("int64list", ogr.OFTInteger64List),
        ("int_str", ogr.OFTString), ("str_int", ogr.OFTString),
        ("int64_str", ogr.OFTString), ("str_int64", ogr.OFTString),
        ("int_int64", ogr.OFTInteger64), ("int64_int", ogr.OFTInteger64),
        ("int_real", ogr.OFTReal), ("real_int", ogr.OFTReal),
        ("int64_real", ogr.OFTReal), ("real_int64", ogr.OFTReal),
        ("real_str", ogr.OFTString), ("str_real", ogr.OFTString),
        ("int_bool", ogr.OFTInteger), ("bool_int", ogr.OFTInteger),
        ("intlist_strlist", ogr.OFTStringList),
        ("strlist_intlist", ogr.OFTStringList),
        ("intlist_int64list", ogr.OFTInteger64List),
        ("int64list_intlist", ogr.OFTInteger64List),
        ("intlist_reallist", ogr.OFTRealList),
        ("reallist_intlist", ogr.OFTRealList),
        ("int64list_reallist", ogr.OFTRealList),
        ("reallist_int64list", ogr.OFTRealList),
        ("intlist_boollist", ogr.OFTIntegerList),
        ("boollist_intlist", ogr.OFTIntegerList),
        ("mixedlist", ogr.OFTRealList), ("mixedlist2", ogr.OFTStringList)
    ]
    for (fieldname, fieldtype) in expected_fields:
        fld_defn = lyr.GetLayerDefn().GetFieldDefn(
            lyr.GetLayerDefn().GetFieldIndex(fieldname))
        if fld_defn.GetType() != fieldtype:
            gdaltest.post_reason('fail')
            print(fieldname)
            print(fld_defn.GetType())
            return 'fail'
        if fld_defn.GetSubType() != ogr.OFSTNone:
            gdaltest.post_reason('fail')
            return 'fail'

    f = lyr.GetNextFeature()
    f = lyr.GetNextFeature()
    f = lyr.GetNextFeature()
    if f['intlist'] != [1,1,-2147483648,2147483647,-2147483648,2147483647,-2147483648,2147483647,1,1] or \
       f['int64list'] != [1,1234567890123456,1,-9223372036854775808,9223372036854775807,-9223372036854775808,9223372036854775807,1] or \
       f['int'] != -2147483648 or f['int64'] != -9223372036854775808 or f['real'] - 1 != f['real']:
        gdaltest.post_reason('fail')
        f.DumpReadable()
        return 'fail'
    f = lyr.GetNextFeature()
    if f['int'] != 2147483647 or f[
            'int64'] != 9223372036854775807 or f['real'] + 1 != f['real']:
        gdaltest.post_reason('fail')
        f.DumpReadable()
        return 'fail'

    lyr = ogrtest.mongodb_ds.GetLayerByName(
        ogrtest.mongodb_layer_name_with_2d_index)
    if lyr.TestCapability(ogr.OLCFastSpatialFilter) == 0:
        gdaltest.post_reason('fail')
        return 'fail'
    lyr.SetSpatialFilterRect(1.9, 48.9, 2.1, 49.1)
    lyr.ResetReading()
    f = lyr.GetNextFeature()
    if f is None:
        gdaltest.post_reason('fail')
        return 'fail'
    lyr.SetSpatialFilterRect(1.9, 48.9, 1.95, 48.95)
    lyr.ResetReading()
    f = lyr.GetNextFeature()
    if f is not None:
        gdaltest.post_reason('fail')
        return 'fail'

    lyr = ogrtest.mongodb_ds.GetLayerByName(
        ogrtest.mongodb_layer_name_no_spatial_index)
    if lyr.TestCapability(ogr.OLCFastSpatialFilter) != 0:
        gdaltest.post_reason('fail')
        print(lyr.TestCapability(ogr.OLCFastSpatialFilter))
        return 'fail'
    lyr.SetSpatialFilterRect(1.9, 48.9, 2.1, 49.1)
    lyr.ResetReading()
    f = lyr.GetNextFeature()
    if f is None:
        gdaltest.post_reason('fail')
        return 'fail'

    gdal.PushErrorHandler()
    lyr = ogrtest.mongodb_ds.CreateLayer('foo')
    gdal.PopErrorHandler()
    if lyr is not None:
        gdaltest.post_reason('fail')
        return 'fail'

    gdal.ErrorReset()
    gdal.PushErrorHandler()
    ogrtest.mongodb_ds.ExecuteSQL('WRITE_OGR_METADATA ' +
                                  ogrtest.mongodb_layer_name)
    gdal.PopErrorHandler()
    if gdal.GetLastErrorMsg() == '':
        gdaltest.post_reason('fail')
        return 'fail'

    lyr_count_before = ogrtest.mongodb_ds.GetLayerCount()
    gdal.PushErrorHandler()
    ogrtest.mongodb_ds.ExecuteSQL('DELLAYER:' + ogrtest.mongodb_layer_name)
    gdal.PopErrorHandler()
    if ogrtest.mongodb_ds.GetLayerCount() != lyr_count_before:
        gdaltest.post_reason('fail')
        return 'fail'

    lyr = ogrtest.mongodb_ds.GetLayerByName(ogrtest.mongodb_layer_name)

    gdal.PushErrorHandler()
    ret = lyr.CreateField(ogr.FieldDefn('foo', ogr.OFTString))
    gdal.PopErrorHandler()
    if ret == 0:
        gdaltest.post_reason('fail')
        return 'fail'

    gdal.PushErrorHandler()
    ret = lyr.CreateGeomField(ogr.GeomFieldDefn('foo', ogr.wkbPoint))
    gdal.PopErrorHandler()
    if ret == 0:
        gdaltest.post_reason('fail')
        return 'fail'

    f = ogr.Feature(lyr.GetLayerDefn())
    gdal.PushErrorHandler()
    ret = lyr.CreateFeature(f)
    gdal.PopErrorHandler()
    if ret == 0:
        gdaltest.post_reason('fail')
        return 'fail'

    gdal.PushErrorHandler()
    ret = lyr.SetFeature(f)
    gdal.PopErrorHandler()
    if ret == 0:
        gdaltest.post_reason('fail')
        return 'fail'

    gdal.PushErrorHandler()
    ret = lyr.DeleteFeature(1)
    gdal.PopErrorHandler()
    if ret == 0:
        gdaltest.post_reason('fail')
        return 'fail'

    return 'success'
Exemplo n.º 8
0
def read_shp(path, simplify=True, geom_attrs=True, strict=True):
    """Generates a networkx.DiGraph from shapefiles. Point geometries are
    translated into nodes, lines into edges. Coordinate tuples are used as
    keys. Attributes are preserved, line geometries are simplified into start
    and end coordinates. Accepts a single shapefile or directory of many
    shapefiles.

    "The Esri Shapefile or simply a shapefile is a popular geospatial vector
    data format for geographic information systems software [1]_."

    Parameters
    ----------
    path : file or string
       File, directory, or filename to read.

    simplify:  bool
        If True, simplify line geometries to start and end coordinates.
        If False, and line feature geometry has multiple segments, the
        non-geometric attributes for that feature will be repeated for each
        edge comprising that feature.

    geom_attrs: bool
        If True, include the Wkb, Wkt and Json geometry attributes with
        each edge.

        NOTE:  if these attributes are available, write_shp will use them
        to write the geometry.  If nodes store the underlying coordinates for
        the edge geometry as well (as they do when they are read via
        this method) and they change, your geomety will be out of sync.

    strict: bool
        If True, raise NetworkXError when feature geometry is missing or
        GeometryType is not supported.
        If False, silently ignore missing or unsupported geometry in features.

    Returns
    -------
    G : NetworkX graph

    Raises
    ------
    ImportError
       If ogr module is not available.

    RuntimeError
       If file cannot be open or read.

    NetworkXError
       If strict=True and feature is missing geometry or GeometryType is
       not supported.

    Examples
    --------
    >>> G = nx.read_shp('test.shp') # doctest: +SKIP

    References
    ----------
    .. [1] https://en.wikipedia.org/wiki/Shapefile
    """
    try:
        from osgeo import ogr
    except ImportError:
        raise ImportError("read_shp requires OGR: http://www.gdal.org/")

    if not isinstance(path, str):
        return

    net = nx.DiGraph()
    shp = ogr.Open(path)
    if shp is None:
        raise RuntimeError("Unable to open {}".format(path))
    for lyr in shp:
        fields = [x.GetName() for x in lyr.schema]
        for f in lyr:
            g = f.geometry()
            if g is None:
                if strict:
                    raise nx.NetworkXError(
                        "Bad data: feature missing geometry")
                else:
                    continue
            flddata = [f.GetField(f.GetFieldIndex(x)) for x in fields]
            attributes = dict(zip(fields, flddata))
            attributes["ShpName"] = lyr.GetName()
            # Note:  Using layer level geometry type
            if g.GetGeometryType() == ogr.wkbPoint:
                net.add_node((g.GetPoint_2D(0)), **attributes)
            elif g.GetGeometryType() in (ogr.wkbLineString,
                                         ogr.wkbMultiLineString):
                for edge in edges_from_line(g, attributes, simplify,
                                            geom_attrs):
                    e1, e2, attr = edge
                    net.add_edge(e1, e2)
                    net[e1][e2].update(attr)
            else:
                if strict:
                    raise nx.NetworkXError(
                        "GeometryType {} not supported".format(
                            g.GetGeometryType()))

    return net
Exemplo n.º 9
0
def Rasterize_GLIM_geologic_maps_pythonic(shapefile_name, raster_resolution = 400):

    # The shapefile to be rasterized:     
    print('Rasterize ' + shapefile_name) 
    #get path and filename seperately 
    shapefilefilepath = LSDPT.GetPath(shapefile_name)
    shapefilename = LSDPT.GetFileNameNoPath(shapefile_name)
    shapefileshortname = LSDPT.GetFilePrefix(shapefile_name)

    print("Shapefile name is: "+shapefilename)

    # now get the the fields from the shapefile
    daShapefile = shapefile_name

    dataSource = ogr.Open(daShapefile)
    daLayer = dataSource.GetLayer(0)
    
    # lets see what the layers are
    print("Let me tell you what the names of the fields are!")
    layerDefinition = daLayer.GetLayerDefn()
    for i in range(layerDefinition.GetFieldCount()):
        print(layerDefinition.GetFieldDefn(i).GetName())        
        
    # The raster file to be created and receive the rasterized shapefile 
    outrastername = shapefileshortname + '.tif' 
    outraster = shapefilefilepath+os.sep+ outrastername
    outcsv = shapefilefilepath+os.sep+shapefileshortname+'_lithokey.csv'
    print("Full name of out raster is: "+outraster)       

    # Create the destination data source
    inGridSize=float(raster_resolution)
    xMin, xMax, yMin, yMax = daLayer.GetExtent()
    xRes = int((xMax - xMin) / inGridSize)
    yRes = int((yMax - yMin) / inGridSize)
    rasterDS =  gdal.GetDriverByName('GTiff').Create(outraster, xRes, yRes, 1,  gdal.GDT_Byte)
    
    # Define spatial reference
    NoDataVal = -9999
    rasterDS.SetProjection(daLayer.GetSpatialRef().ExportToWkt())
    rasterDS.SetGeoTransform((xMin, inGridSize, 0, yMax, 0, -inGridSize))
    rBand = rasterDS.GetRasterBand(1)
    rBand.SetNoDataValue(NoDataVal)
    rBand.Fill(NoDataVal)

    # Rasterize
    gdal.RasterizeLayer(rasterDS, [1], daLayer, options = ["ATTRIBUTE=GEOL_CODE"]) 
    
    # Make a key for the bedrock
    geol_dict = dict()
    for feature in daLayer:
        ID = feature.GetField("xx")
        GEOL = feature.GetField("GEOL_CODE")
        
        if ID not in geol_dict:
            print("I found a new rock type, ID: "+ str(ID)+ " and rock type: " + str(GEOL))
            geol_dict[ID] = GEOL

    print("The rocks are: ")
    print(geol_dict)
    
    with open(outcsv, 'wb') as f:
        f.write('ID,rocktype\n')
        for key in geol_dict:
            f.write(str(key)+','+ str(geol_dict[key])+'\n')
      
    print("Done rasterizing!")
    return outraster         
Exemplo n.º 10
0
# Script to read attributes from a shapefile.

# Don't forget to import ogr
import sys
from osgeo import ogr

# Open the data source and get the layer
fn = r'D:\osgeopy-data\global\ne_50m_populated_places.shp'
ds = ogr.Open(fn, 0)
if ds is None:
    sys.exit('Could not open {0}.'.format(fn))
lyr = ds.GetLayer(0)

i = 0
for feat in lyr:

    # Get the x,y coordinates
    pt = feat.geometry()
    x = pt.GetX()
    y = pt.GetY()

    # Get the attribute values
    name = feat.GetField('NAME')
    pop = feat.GetField('POP_MAX')
    print(name, pop, x, y)
    i += 1
    if i == 10:
        break
del ds
Exemplo n.º 11
0
def ogr_plscenes_data_v1_live():

    if gdaltest.plscenes_drv is None:
        return 'skip'

    api_key = gdal.GetConfigOption('PL_API_KEY')
    if api_key is None:
        print('Skipping test as PL_API_KEY not defined')
        return 'skip'

    gdal.SetConfigOption('PLSCENES_PAGE_SIZE', '10')
    ds = ogr.Open('PLScenes:version=data_v1,FOLLOW_LINKS=YES')
    gdal.SetConfigOption('PLSCENES_PAGE_SIZE', None)
    if ds is None:
        gdaltest.post_reason('fail')
        return 'fail'

    lyr = ds.GetLayer(0)
    if lyr is None:
        gdaltest.post_reason('fail')
        return 'fail'

    lyr.SetAttributeFilter("permissions = 'assets:download'")
    f = lyr.GetNextFeature()
    if f is None:
        gdaltest.post_reason('fail')
        return 'fail'
    catalog = lyr.GetName()
    scene = f['id']
    f.DumpReadable()

    lyr_defn = lyr.GetLayerDefn()
    asset_name = None
    for i in range(lyr_defn.GetFieldCount()):
        fld_defn = lyr_defn.GetFieldDefn(i)
        name = fld_defn.GetName()
        if name.startswith('asset_') and name.endswith(
                '_activate_link') and f.GetFieldAsString(i) != '':
            asset_name = name[len('asset_'):-len('_activate_link')]
            break
        elif name.startswith('asset_') and name.endswith(
                '_location') and f.GetFieldAsString(i) != '':
            asset_name = name[len('asset_'):-len('_location')]
            break
    if asset_name is None:
        gdaltest.post_reason('fail')
        return 'fail'

    acquired_field = lyr_defn.GetFieldIndex('acquired')
    if acquired_field < 0 or lyr_defn.GetFieldDefn(
            acquired_field).GetType() != ogr.OFTDateTime:
        gdaltest.post_reason('fail')
        return 'fail'

    if not f.IsFieldSet(acquired_field):
        gdaltest.post_reason('fail')
        f.DumpReadable()
        return 'fail'

    int_field = -1
    float_field = -1
    string_field = -1
    for i in range(lyr_defn.GetFieldCount()):
        typ = lyr_defn.GetFieldDefn(i).GetType()
        if int_field < 0 and typ == ogr.OFTInteger and f.IsFieldSet(i):
            int_field = i
        elif float_field < 0 and typ == ogr.OFTReal and f.IsFieldSet(i):
            float_field = i
        elif string_field < 0 and typ == ogr.OFTString and f.IsFieldSet(i):
            string_field = i

    filtr = "acquired='%s'" % f.GetFieldAsString(acquired_field)
    if int_field >= 0:
        name = lyr_defn.GetFieldDefn(int_field).GetName()
        mini = f.GetField(int_field) - 1
        maxi = f.GetField(int_field) + 1
        filtr += ' AND %s >= %d AND %s <= %d' % (name, mini, name, maxi)
    if float_field >= 0:
        name = lyr_defn.GetFieldDefn(float_field).GetName()
        mini = f.GetField(float_field) - 0.01
        maxi = f.GetField(float_field) + 0.01
        filtr += ' AND %s BETWEEN %f AND %f' % (name, mini, maxi)
    if string_field >= 0:
        name = lyr_defn.GetFieldDefn(string_field).GetName()
        value = f.GetField(string_field)
        filtr += " AND %s = '%s'" % (name, value)

    lyr.SetAttributeFilter(filtr)
    f = lyr.GetNextFeature()
    if f is None:
        gdaltest.post_reason('fail')
        return 'fail'

    ds = None

    ds = gdal.Open('PLScenes:version=data_v1,itemtypes=%s,scene=%s,asset=%s' %
                   (catalog, scene, asset_name))
    if ds is None:
        gdaltest.post_reason('fail')
        return 'fail'
    if ds.RasterCount == 0:
        gdaltest.post_reason('fail')
        return 'fail'

    return 'success'
    def test(self):

        # Skip if GDAL python bindings are not available
        try:
            from osgeo import gdal, ogr
        except:
            return

        version_num = int(gdal.VersionInfo('VERSION_NUM'))
        if version_num < GDAL_COMPUTE_VERSION(1, 11, 0):
            return

        dialog = QgsNewGeoPackageLayerDialog()
        dialog.setProperty("hideDialogs", True)

        mDatabase = dialog.findChild(QgsFileWidget, "mDatabase")
        buttonBox = dialog.findChild(QDialogButtonBox, "buttonBox")
        ok_button = buttonBox.button(QDialogButtonBox.Ok)
        mTableNameEdit = dialog.findChild(QLineEdit, "mTableNameEdit")
        mLayerIdentifierEdit = dialog.findChild(QLineEdit,
                                                "mLayerIdentifierEdit")
        mLayerDescriptionEdit = dialog.findChild(QLineEdit,
                                                 "mLayerDescriptionEdit")
        mFeatureIdColumnEdit = dialog.findChild(QLineEdit,
                                                "mFeatureIdColumnEdit")
        mGeometryTypeBox = dialog.findChild(QComboBox, "mGeometryTypeBox")
        mGeometryColumnEdit = dialog.findChild(QLineEdit,
                                               "mGeometryColumnEdit")
        mFieldNameEdit = dialog.findChild(QLineEdit, "mFieldNameEdit")
        mFieldTypeBox = dialog.findChild(QComboBox, "mFieldTypeBox")
        mFieldLengthEdit = dialog.findChild(QLineEdit, "mFieldLengthEdit")
        mAddAttributeButton = dialog.findChild(QToolButton,
                                               "mAddAttributeButton")
        mRemoveAttributeButton = dialog.findChild(QToolButton,
                                                  "mRemoveAttributeButton")
        mAttributeView = dialog.findChild(QTreeWidget, "mAttributeView")
        dialog.accepted.connect(self.accepted_slot)

        mGeometryTypeBox.setCurrentIndex(
            mGeometryTypeBox.findData(ogr.wkbPoint))
        self.assertEqual(mGeometryTypeBox.currentText(), "Point")

        self.assertFalse(ok_button.isEnabled())

        dbname = os.path.join(self.basetestpath, 'test.gpkg')
        mDatabase.setFilePath(dbname)
        self.assertEqual(mTableNameEdit.text(), 'test')
        self.assertEqual(mLayerIdentifierEdit.text(), 'test')
        self.assertTrue(ok_button.isEnabled())

        mGeometryColumnEdit.setText('my_geom')
        mFeatureIdColumnEdit.setText('my_fid')

        self.assertFalse(mAddAttributeButton.isEnabled())
        self.assertFalse(mRemoveAttributeButton.isEnabled())

        mFieldNameEdit.setText('strfield')
        self.assertTrue(mAddAttributeButton.isEnabled())
        mFieldLengthEdit.setText('10')
        QTest.mouseClick(mAddAttributeButton, Qt.LeftButton)

        mFieldNameEdit.setText('intfield')
        mFieldTypeBox.setCurrentIndex(mFieldTypeBox.findData('integer'))
        self.assertFalse(mFieldLengthEdit.isEnabled())
        QTest.mouseClick(mAddAttributeButton, Qt.LeftButton)

        mFieldNameEdit.setText('realfield')
        mFieldTypeBox.setCurrentIndex(mFieldTypeBox.findData('real'))
        self.assertFalse(mFieldLengthEdit.isEnabled())
        QTest.mouseClick(mAddAttributeButton, Qt.LeftButton)

        mFieldNameEdit.setText('datefield')
        mFieldTypeBox.setCurrentIndex(mFieldTypeBox.findData('date'))
        self.assertFalse(mFieldLengthEdit.isEnabled())
        QTest.mouseClick(mAddAttributeButton, Qt.LeftButton)

        mFieldNameEdit.setText('datetimefield')
        mFieldTypeBox.setCurrentIndex(mFieldTypeBox.findData('datetime'))
        self.assertFalse(mFieldLengthEdit.isEnabled())
        QTest.mouseClick(mAddAttributeButton, Qt.LeftButton)

        if version_num >= GDAL_COMPUTE_VERSION(2, 0, 0):
            mFieldNameEdit.setText('int64field')
            mFieldTypeBox.setCurrentIndex(mFieldTypeBox.findData('integer64'))
            self.assertFalse(mFieldLengthEdit.isEnabled())
            QTest.mouseClick(mAddAttributeButton, Qt.LeftButton)

        # Add and remove field
        mFieldNameEdit.setText('dummy')
        self.assertFalse(mFieldLengthEdit.isEnabled())
        QTest.mouseClick(mAddAttributeButton, Qt.LeftButton)

        index = mAttributeView.model().index(
            mAttributeView.model().rowCount() - 1, 0)
        mAttributeView.setCurrentIndex(index)

        QTest.mouseClick(mRemoveAttributeButton, Qt.LeftButton)

        self.accepted = False
        QTest.mouseClick(ok_button, Qt.LeftButton)
        self.assertTrue(self.accepted)

        layers = QgsProject.instance().mapLayers()
        self.assertEqual(len(layers), 1)
        layer = layers[list(layers.keys())[0]]
        self.assertEqual(layer.name(), 'test')
        self.assertEqual(layer.geometryType(), QgsWkbTypes.PointGeometry)
        QgsProject.instance().removeAllMapLayers()

        ds = ogr.Open(dbname)
        lyr = ds.GetLayer(0)
        self.assertEqual(lyr.GetFIDColumn(), 'my_fid')
        self.assertEqual(lyr.GetGeometryColumn(), 'my_geom')
        self.assertEqual(lyr.GetGeomType(), ogr.wkbPoint)
        if version_num >= GDAL_COMPUTE_VERSION(2, 0, 0):
            self.assertEqual(lyr.GetLayerDefn().GetFieldCount(), 6)
        else:
            self.assertEqual(lyr.GetLayerDefn().GetFieldCount(), 5)
        self.assertEqual(lyr.GetLayerDefn().GetFieldDefn(0).GetNameRef(),
                         'strfield')
        self.assertEqual(lyr.GetLayerDefn().GetFieldDefn(0).GetType(),
                         ogr.OFTString)
        # Only GDAL 2.0 recognizes string field width
        if version_num >= GDAL_COMPUTE_VERSION(2, 0, 0):
            self.assertEqual(lyr.GetLayerDefn().GetFieldDefn(0).GetWidth(), 10)
        self.assertEqual(lyr.GetLayerDefn().GetFieldDefn(1).GetNameRef(),
                         'intfield')
        self.assertEqual(lyr.GetLayerDefn().GetFieldDefn(1).GetType(),
                         ogr.OFTInteger)
        self.assertEqual(lyr.GetLayerDefn().GetFieldDefn(1).GetWidth(), 0)
        self.assertEqual(lyr.GetLayerDefn().GetFieldDefn(2).GetNameRef(),
                         'realfield')
        self.assertEqual(lyr.GetLayerDefn().GetFieldDefn(2).GetType(),
                         ogr.OFTReal)
        self.assertEqual(lyr.GetLayerDefn().GetFieldDefn(2).GetWidth(), 0)
        self.assertEqual(lyr.GetLayerDefn().GetFieldDefn(3).GetNameRef(),
                         'datefield')
        self.assertEqual(lyr.GetLayerDefn().GetFieldDefn(3).GetType(),
                         ogr.OFTDate)
        self.assertEqual(lyr.GetLayerDefn().GetFieldDefn(3).GetWidth(), 0)
        self.assertEqual(lyr.GetLayerDefn().GetFieldDefn(4).GetNameRef(),
                         'datetimefield')
        if version_num >= GDAL_COMPUTE_VERSION(2, 0, 0):
            self.assertEqual(lyr.GetLayerDefn().GetFieldDefn(4).GetType(),
                             ogr.OFTDateTime)
        else:
            # There's a bug in OGR 1.11. The field is probably declared as DATETIME in SQL
            # but OGR detects it as OFTDate
            self.assertEqual(lyr.GetLayerDefn().GetFieldDefn(4).GetType(),
                             ogr.OFTDate)
        self.assertEqual(lyr.GetLayerDefn().GetFieldDefn(4).GetWidth(), 0)
        if version_num >= GDAL_COMPUTE_VERSION(2, 0, 0):
            self.assertEqual(lyr.GetLayerDefn().GetFieldDefn(5).GetNameRef(),
                             'int64field')
            self.assertEqual(lyr.GetLayerDefn().GetFieldDefn(5).GetType(),
                             ogr.OFTInteger64)
            self.assertEqual(lyr.GetLayerDefn().GetFieldDefn(5).GetWidth(), 0)
        ds = None

        # Try re-adding with different table. It should ask if we want to
        # overwrite the DB, and we'll implicitly answer cancel, hence failure
        mTableNameEdit.setText('table2')

        self.accepted = False
        QTest.mouseClick(ok_button, Qt.LeftButton)
        self.assertFalse(self.accepted)

        # Retry, and ask to keep the DB
        self.accepted = False
        dialog.setProperty('question_existing_db_answer_add_new_layer', True)
        QTest.mouseClick(ok_button, Qt.LeftButton)
        dialog.setProperty('question_existing_db_answer_add_new_layer', None)
        self.assertTrue(self.accepted)

        QgsProject.instance().removeAllMapLayers()
        ds = ogr.Open(dbname)
        self.assertEqual(ds.GetLayerCount(), 2)
        ds = None

        # Retry, and ask to overwrite the DB
        self.accepted = False
        dialog.setProperty('question_existing_db_answer_overwrite', True)
        QTest.mouseClick(ok_button, Qt.LeftButton)
        dialog.setProperty('question_existing_db_answer_overwrite', None)
        self.assertTrue(self.accepted)

        QgsProject.instance().removeAllMapLayers()
        ds = ogr.Open(dbname)
        self.assertEqual(ds.GetLayerCount(), 1)
        ds = None

        # Try re-adding with same parameters. It should ask if we want to
        # overwrite the layer, and we'll implicitly answer no, hence failure
        # since it already exists with that name
        self.accepted = False
        dialog.setProperty('question_existing_db_answer_add_new_layer', True)
        QTest.mouseClick(ok_button, Qt.LeftButton)
        dialog.setProperty('question_existing_db_answer_add_new_layer', None)
        self.assertFalse(self.accepted)

        # Now answer yes, and change a few things
        mLayerIdentifierEdit.setText('my_identifier')
        mLayerDescriptionEdit.setText('my_description')
        dialog.setProperty('question_existing_db_answer_add_new_layer', True)
        dialog.setProperty('question_existing_layer_answer_overwrite', True)
        self.accepted = False
        QTest.mouseClick(ok_button, Qt.LeftButton)
        dialog.setProperty('question_existing_db_answer_add_new_layer', None)
        dialog.setProperty('question_existing_layer_answer_overwrite', None)
        self.assertTrue(self.accepted)

        # Only check with OGR 2.0 since the IDENTIFIER and DESCRIPTION creation options don't exist in OGR 1.11
        if version_num >= GDAL_COMPUTE_VERSION(2, 0, 0):
            layers = QgsProject.instance().mapLayers()
            self.assertEqual(len(layers), 1)
            layer = layers[list(layers.keys())[0]]
            self.assertEqual(layer.name(), 'my_identifier')
            QgsProject.instance().removeAllMapLayers()

            ds = ogr.Open(dbname)
            sql_lyr = ds.ExecuteSQL('SELECT * FROM gpkg_contents')
            self.assertEqual(sql_lyr.GetFeatureCount(), 1)
            f = sql_lyr.GetNextFeature()
            identifier = f.GetField('identifier')
            description = f.GetField('description')
            f = None
            ds.ReleaseResultSet(sql_lyr)
            ds = None
            self.assertEqual(identifier, 'my_identifier')
            self.assertEqual(description, 'my_description')
        else:
            QgsProject.instance().removeAllMapLayers()

        # Try invalid path
        mDatabase.setFilePath('/this/is/invalid/test.gpkg')
        self.accepted = False
        QTest.mouseClick(ok_button, Qt.LeftButton)
        self.assertFalse(self.accepted)
Exemplo n.º 13
0
def test_ogr_shape_sbn_2():

    ds = ogr.Open('data/CoHI_GCS12.shp')
    lyr = ds.GetLayer(0)
    return search_all_features(lyr)
Exemplo n.º 14
0
if mask is 'default':
    maskband = srcband.GetMaskBand()
elif mask is 'none':
    maskband = None
else:
    mask_ds = gdal.Open(mask)
    maskband = mask_ds.GetRasterBand(1)

# =============================================================================
#       Try opening the destination file as an existing file.
# =============================================================================

try:
    gdal.PushErrorHandler('CPLQuietErrorHandler')
    dst_ds = ogr.Open(dst_filename, update=1)
    gdal.PopErrorHandler()
except:
    dst_ds = None

# =============================================================================
# 	Create output file.
# =============================================================================
if dst_ds is None:
    drv = ogr.GetDriverByName(format)
    if not quiet_flag:
        print('Creating output %s of format %s.' % (dst_filename, format))
    dst_ds = drv.CreateDataSource(dst_filename)

# =============================================================================
#       Find or create destination layer.
Exemplo n.º 15
0
    def mergeDataSources2Vrt(self, dataSources, outFile, union=False, relative=False,
                             schema=False, feedback=None):
        '''Function to do the work of merging datasources in a single vrt format

        @param data_sources: Array of path strings
        @param outfile: the output vrt file to generate
        @param relative: Write relative flag. DOES NOT relativise paths. They have to be already relative
        @param schema: Schema flag
        @return: vrt in string format
        '''
        if feedback is None:
            feedback = QgsProcessingFeedback()

        vrt = '<OGRVRTDataSource>'
        if union:
            vrt += '<OGRVRTUnionLayer name="UnionedLayer">'

        total = 100.0 / len(dataSources) if dataSources else 1
        for current, layer in enumerate(dataSources):
            if feedback.isCanceled():
                break

            feedback.setProgress(int(current * total))

            inFile = layer.source()
            srcDS = ogr.Open(inFile, 0)
            if srcDS is None:
                raise QgsProcessingException(
                    self.tr('Invalid datasource: {}'.format(inFile)))

            if schema:
                inFile = '@dummy@'

            for layer in srcDS:
                layerDef = layer.GetLayerDefn()
                layerName = layerDef.GetName()

                vrt += '<OGRVRTLayer name="{}">'.format(self.XmlEsc(layerName))
                vrt += '<SrcDataSource relativeToVRT="{}" shared="{}">{}</SrcDataSource>'.format(1 if relative else 0, not schema, self.XmlEsc(inFile))
                if schema:
                    vrt += '<SrcLayer>@dummy@</SrcLayer>'
                else:
                    vrt += '<SrcLayer>{}</SrcLayer>'.format(self.XmlEsc(layerName))

                vrt += '<GeometryType>{}</GeometryType>'.format(self.GeomType2Name(layerDef.GetGeomType()))

                crs = layer.GetSpatialRef()
                if crs is not None:
                    vrt += '<LayerSRS>{}</LayerSRS>'.format(self.XmlEsc(crs.ExportToWkt()))

                # Process all the fields.
                for fieldIdx in range(layerDef.GetFieldCount()):
                    fieldDef = layerDef.GetFieldDefn(fieldIdx)
                    vrt += '<Field name="{}" type="{}"'.format(self.XmlEsc(fieldDef.GetName()), self.fieldType2Name(fieldDef.GetType()))
                    if not schema:
                        vrt += ' src="{}"'.format(self.XmlEsc(fieldDef.GetName()))
                    if fieldDef.GetWidth() > 0:
                        vrt += ' width="{}"'.format(fieldDef.GetWidth())
                    if fieldDef.GetPrecision() > 0:
                        vrt += ' precision="{}"'.format(fieldDef.GetPrecision())
                    vrt += '/>'

                vrt += '</OGRVRTLayer>'

            srcDS.Destroy()

        if union:
            vrt += '</OGRVRTUnionLayer>'

        vrt += '</OGRVRTDataSource>'

        #TODO: pretty-print XML

        if outFile is not None:
            with codecs.open(outFile, 'w') as f:
                f.write(vrt)

        return vrt
Exemplo n.º 16
0
def Copy_Shapefile(shapefile_name,new_shapefile_name):
    """
    Sweet Jesus why is this so difficult?
    """
    
    if exists(shapefile_name) is False:
        raise Exception('[Errno 2] No such file or directory: \'' + shapefile_name + '\'') 
        
    # get the short name of the new shapefile
    shapefileshortname = LSDPT.GetFilePrefix(new_shapefile_name)
    print("The shortname is: "+shapefileshortname)

    # read in the data
    src = ogr.Open(shapefile_name)
    daLayer = src.GetLayer(0)
    
    # lets see what the layers are
    print("Let me tell you what the names of the fields are!")
    layerDefinition = daLayer.GetLayerDefn()
    for i in range(layerDefinition.GetFieldCount()):
        print(layerDefinition.GetFieldDefn(i).GetName())
        
    geom_type = layerDefinition.GetGeomType()

    # get rid of previous copies
    if exists(new_shapefile_name):
        os.remove(new_shapefile_name)
    
    # get the driver and create a new data source
    driver = ogr.GetDriverByName('ESRI Shapefile')
    #src.Destroy()
    
    
    # Now write to the the outfile
    out_ds = driver.CreateDataSource(new_shapefile_name)   
    # create the output layer
    #out_lyr = out_ds.CreateLayer("yo",srs = daLayer.GetSpatialRef(),geom_type=ogr.wkbPolygon)    
    out_lyr = out_ds.CreateLayer("yo",srs = daLayer.GetSpatialRef(),geom_type=geom_type)      
     
    # Add input Layer Fields to the output Layer if it is the one we want
    for i in range(0, layerDefinition.GetFieldCount()):
        fieldDefn = layerDefinition.GetFieldDefn(i)
        #fieldName = fieldDefn.GetName()
        out_lyr.CreateField(fieldDefn)

    # Get the output Layer's Feature Definition
    outLayerDefn = out_lyr.GetLayerDefn()

    # Add features to the ouput Layer
    for inFeature in daLayer:
        # Create output Feature
        outFeature = ogr.Feature(outLayerDefn)

        # add in geometries
        geom = inFeature.GetGeometryRef()
        outFeature.SetGeometry(geom.Clone())
        # Add new feature to output Layer
        
        # Add field values from input Layer
        for i in range(0, outLayerDefn.GetFieldCount()):
            fieldDefn = outLayerDefn.GetFieldDefn(i)
            #fieldName = fieldDefn.GetName()
            outFeature.SetField(outLayerDefn.GetFieldDefn(i).GetNameRef(),
                inFeature.GetField(i))
                
        out_lyr.CreateFeature(outFeature)
Exemplo n.º 17
0
def loop_zonal_stats(input_zone_polygon, input_value_raster, pointBuf,
                     rasteridtail, outDir):
    ## https://gis.stackexchange.com/questions/77993/issue-trying-to-create-zonal-statistics-using-gdal-and-python
    """
    Input:
        input_zone_polygon      a zone shapefile
        input_value_raster      a raster in UTM
        pointBuf                a distance (m) to add to & substract from both X and Y to create an area
        rasteridtail            a string to help distinguish the output CSV files
    Output:
        a CSV with fields: FID, mn, std
            FID corresponds to FID in input zone polygon
            stored in dir as input_zone_polygon
            name includes combo of input zone poly and raster (might wanna change this to suite your needs)
    Return:
        stat dictionary
    """
    # Reproject input_zone_polygon to srs of raster
    # Get SRS and UTM zone from raster
    raster = gdal.Open(input_value_raster)
    srs = osr.SpatialReference(wkt=raster.GetProjection())
    zone = srs.GetAttrValue('projcs').split(
        'zone ')[1][:-1]  # removes the last char, which is 'N' or 'S'
    print "\n\tUTM Zone for the reprojection: %s" % zone
    if int(zone) < 10:
        zone = "0" + str(zone)

    # Set up tmp zone file that will be projected to srs of raster
    name = input_value_raster.split('/')[-2]
    rasterid = name + rasteridtail  ## eg: 'WV01_20130604_1020010023E3DB00_1020010024C5D300dsm'

    tmpShp = input_zone_polygon.split('.shp')[0] + '_' + platform.node(
    ) + '_' + strftime("%Y%m%d_%H%M%S") + "_tmp.shp"
    driver = ogr.GetDriverByName("ESRI Shapefile")

    # Wait for the input_zone_polygon in case it is being used by another file
    wait_for_files([input_zone_polygon])

    ##    if os.path.exists(rpShp):
    ##        # Check if UTM zone matches that of raster
    ##        shp = ogr.Open(rpShp)
    ##        lyr = shp.GetLayer()
    ##
    ##        # if no match, delete and reproject
    ##        driver.DeleteDataSource(tmpShp)
    ##        print '\tReprojected version of shapefile exists...deleting'

    ## ogr2ogr targetSRS output input
    rExt, xOrigin, yOrigin, pixelWidth, pixelHeight = get_raster_extent(raster)
    rExtStr = str(rExt[0]) + " " + str(rExt[1]) + " " + str(
        rExt[2]) + " " + str(rExt[3])
    print '\n\tReproject input poly to UTM zone matching raster AND clip to raster extent...'
    cmdStr = "ogr2ogr -t_srs EPSG:326" + zone + " -clipdst " + rExtStr + " " + tmpShp + " " + input_zone_polygon
    run_wait_os(cmdStr)

    ##    tmpBox = input_zone_polygon.split('.shp')[0] + '_' + platform.node() + '_' + rasterid + "_tmp.shp"
    ##    print '\Run gdaltindex to get shapefile bounding box of input raster'
    ##    cmdStr = "gdaltindex -t_srs EPSG:326" + zone + " " + tmpBox + " " + input_value_raster

    shp = ogr.Open(tmpShp)
    lyr = shp.GetLayer()
    featList = range(lyr.GetFeatureCount())

    # Stats to return
    statsnames = [rasterid + '_mean', rasterid + '_std']
    statDict_mean = {}
    statDict_std = {}

    # Existing attributes to return
    ##fieldnames = ["campaign","rec_ndx","shotn","lat","lon","elev","elvdiff","Centroid","wflen"]
    fieldnames = [
        "rec_ndx", "shotn", "lat", "lon", "elev", "elev_ground", "wflen"
    ]
    print "Fieldnames: %s" % fieldnames
    """
    TODO    iterate through fieldnames and append multiple fieldname values to a common dict key (FID),
                instead of having a diff dict
    """

    ##fieldDict_camp = {}
    fieldDict_rec = {}
    fieldDict_shot = {}
    fieldDict_lat = {}
    fieldDict_lon = {}
    fieldDict_elev = {}
    fieldDict_elev_ground = {}
    ##fieldDict_elvd = {}
    ##fieldDict_cent = {}
    fieldDict_wflen = {}

    # Loop through features
    for FID in featList:

        feat = lyr.GetFeature(FID)
        print '\tFID: %s' % (FID)

        # Stats to return
        meanValue, stdValue, zValList = zonal_stats(feat, tmpShp,
                                                    input_value_raster,
                                                    pointBuf)
        statDict_mean[FID] = meanValue
        statDict_std[FID] = stdValue

        # Existing attributes to return
        ##fieldDict_camp[FID] = feat.GetField("campaign")
        fieldDict_rec[FID] = feat.GetField("rec_ndx")
        fieldDict_shot[FID] = feat.GetField("shotn")
        fieldDict_lat[FID] = feat.GetField("lat")
        fieldDict_lon[FID] = feat.GetField("lon")
        fieldDict_elev[FID] = feat.GetField("elev")
        fieldDict_elev_ground[FID] = feat.GetField(
            "elev_groun")  # <-- this fieldname is too long and gets truncated
        ##fieldDict_elvd[FID] = feat.GetField("elvdiff")
        ##fieldDict_cent[FID] = feat.GetField("Centroid")
        fieldDict_wflen[FID] = feat.GetField("wflen")

        # Output a csv list of the DSM values in the box around the GLAS centroid


##        if rasteridtail == 'dsm':
##            try:
##                np.savetxt(os.path.join(outDir,name + '_dsm_vals_'+ str(feat.GetField("rec_ndx")) + "_" + str(feat.GetField("shotn"))), zValList, delimiter = ",", fmt='%.2f')
##            except Exception, e:
##                print '\t' + str(e)

# Header for output CSV
    hdr = ['FID'] + fieldnames + statsnames

    # Combine all attribute and stats dictionaries
    ##Comb_Dicts = fieldDict_camp, fieldDict_rec, fieldDict_shot, fieldDict_lat, fieldDict_lon, fieldDict_elev, fieldDict_elvd, fieldDict_cent, fieldDict_wflen, statDict_mean, statDict_std
    Comb_Dicts = fieldDict_rec, fieldDict_shot, fieldDict_lat, fieldDict_lon, fieldDict_elev, fieldDict_elev_ground, fieldDict_wflen, statDict_mean, statDict_std

    # delete the tmp reproj'd shp
    driver.DeleteDataSource(tmpShp)

    # Write stats to CSV
    path, input_zone_file = os.path.split(input_zone_polygon)

    outCSV = os.path.join(
        outDir,
        input_zone_file.split('.shp')[0] + '_' + rasterid + '.csv')

    ##    # Combine the 2 dictionaries into one using the key (this case, the FID)
    ##    ## formatting a combined dictionary to CSV is tricky..room for improvement
    ##    StatDict_Combined = defaultdict(list)
    ##
    ##    for d in (statDict_mean, statDict_std): # you can list as many input dicts as you want here
    ##        for key, value in d.iteritems():
    ##            StatDict_Combined[key].append(value)
    ##
    ##    with open(outCSV, 'w') as f:
    ##        hdr = 'FID,' + rasterid + '_elev_mn'##+',' + rasterid + '_elev_std'
    ##        f.write(hdr + '\n')
    ##        [f.write('{0},{1}\n'.format(key, value )) for key, value in StatDict_Combined.items()]
    ##        ## Below doesnt work on lists, only tuples..
    ##        ## https://stackoverflow.com/questions/5530619/python-how-to-write-a-dictionary-of-tuple-values-to-a-csv-file?rq=1
    ##        ##csv.writer(f).writerows(hdr + '\n')
    ##        ##csv.writer(f).writerows((k,) + v for k, v in StatDict_Combined.iteritems())

    # Write multiple dicts to CSV
    ## https://stackoverflow.com/questions/22273970/writing-multiple-python-dictionaries-to-csv-file
    with open(outCSV, 'w') as f:
        writer = csv.writer(f, delimiter=',')
        ##writer.writerow(['FID', rasterid + '_elev_mn', rasterid + '_elev_std'])
        writer.writerow(hdr)

        # Here you just need any template dict from above through which you can iterate the keys
        for key in statDict_mean.iterkeys():

            writer.writerow([key] + [d[key] for d in Comb_Dicts])

    return Comb_Dicts, outCSV, hdr
Exemplo n.º 18
0
def Rasterize_BGS_geologic_maps(shapefile_name):

    # The shapefile to be rasterized:     
    print('Rasterize ' + shapefile_name) 
    #get path and filename seperately 
    shapefilefilepath = LSDPT.GetPath(shapefile_name)
    shapefilename = LSDPT.GetFileNameNoPath(shapefile_name)
    shapefileshortname = LSDPT.GetFilePrefix(shapefile_name)

    print("Shapefile name is: "+shapefilename)
    
    # now get the the fields from the shapefile
    daShapefile = shapefile_name

    dataSource = ogr.Open(daShapefile)
    daLayer = dataSource.GetLayer(0)
    
    # lets see what the layers are
    print("Let me tell you what the names of the fields are!")
    layerDefinition = daLayer.GetLayerDefn()
    for i in range(layerDefinition.GetFieldCount()):
        print(layerDefinition.GetFieldDefn(i).GetName())        
    

    # The raster file to be created and receive the rasterized shapefile 
    outrastername = shapefileshortname + '.tif' 
    outraster = shapefilefilepath+os.sep+ outrastername
    outcsv = shapefilefilepath+os.sep+shapefileshortname+'_lithokey.csv'
    print("Full name of out raster is: "+outraster)       

    # Rasterize!!
    system_call = 'gdal_rasterize -a BGSREF -l ' + shapefileshortname +' -tr 90 -90 -a_nodata -9999 ' +  shapefile_name + ' ' + outraster
    print("System call is: ")
    print(system_call)    
    os.system(system_call)
    
    # now convert the raster to UTM, as well as delete the stupid TIF
    # The raster file to be created and receive the rasterized shapefile 
    outrastername_bil = shapefileshortname + '.bil' 
    outraster_bil = shapefilefilepath+os.sep+ outrastername_bil
    print("Full name of out raster is: "+outraster_bil)
    
    # This assumes UTM zone 30, because why would we do any work in East Anglia?
    system_call2 = 'gdalwarp -t_srs EPSG:32630 -of ENVI -dstnodata -9999 ' +  outraster + ' ' + outraster_bil
    os.system(system_call2)
    
    # Now get rid of the tif
    system_call3 = 'rm '+ outraster
    os.system(system_call3)
    
      
    # Make a key for the bedrock
    geol_dict = dict()
    for feature in daLayer:
        ID = feature.GetField("BGSREF")
        GEOL = feature.GetField("RCS_D")
        
        if ID not in geol_dict:
            print("I found a new rock type, ID: "+ str(ID)+ " and rock type: " + str(GEOL))
            geol_dict[ID] = GEOL

    print("The rocks are: ")
    print(geol_dict)
    
    with open(outcsv, 'wb') as f:
        f.write('ID,rocktype\n')
        for key in geol_dict:
            f.write(str(key)+','+ str(geol_dict[key])+'\n')
      
    print("All done")
Exemplo n.º 19
0
def ogr_mongodb_1():
    if ogrtest.mongodb_drv is None:
        return 'skip'

    # The below options must be used the very first time mongoDB is initialized
    # otherwise they will get ignored
    open_options = []
    open_options += ['SSL_PEM_KEY_FILE=bla']
    open_options += ['SSL_PEM_KEY_PASSWORD=bla']
    open_options += ['SSL_CA_FILE=bla']
    open_options += ['SSL_CRL_FILE=bla']
    open_options += ['SSL_ALLOW_INVALID_CERTIFICATES=YES']
    open_options += ['SSL_ALLOW_INVALID_HOSTNAMES=YES']
    open_options += ['FIPS_MODE=YES']
    gdal.PushErrorHandler()
    ds = gdal.OpenEx('mongodb:', open_options=open_options)
    gdal.PopErrorHandler()

    # Might work or not depending on how the db is set up
    gdal.PushErrorHandler()
    ds = ogr.Open("mongodb:")
    gdal.PopErrorHandler()

    # Wrong URI
    gdal.PushErrorHandler()
    ds = ogr.Open("mongodb://")
    gdal.PopErrorHandler()
    if ds is not None:
        gdaltest.post_reason('fail')
        return 'fail'

    # URI to non existent host.
    gdal.PushErrorHandler()
    ds = ogr.Open("mongodb://non_existing")
    gdal.PopErrorHandler()
    if ds is not None:
        gdaltest.post_reason('fail')
        return 'fail'

    # Connect to non existent host.
    gdal.PushErrorHandler()
    ds = gdal.OpenEx('mongodb:', open_options=['HOST=non_existing'])
    gdal.PopErrorHandler()
    if ds is not None:
        gdaltest.post_reason('fail')
        return 'fail'

    # All arguments split up
    open_options = []
    open_options += ['HOST=' + ogrtest.mongodb_test_host]
    open_options += ['PORT=' + str(ogrtest.mongodb_test_port)]
    open_options += ['DBNAME=' + ogrtest.mongodb_test_dbname]
    if ogrtest.mongodb_test_user is not None:
        open_options += ['USER='******'PASSWORD='******'mongodb:', open_options=open_options)
    if ds is None:
        gdaltest.post_reason('fail')
        return 'fail'

    # Without DBNAME
    open_options = []
    open_options += ['HOST=' + ogrtest.mongodb_test_host]
    open_options += ['PORT=' + str(ogrtest.mongodb_test_port)]
    if ogrtest.mongodb_test_user is not None:
        open_options += ['AUTH_DBNAME=' + ogrtest.mongodb_test_dbname]
        open_options += ['USER='******'PASSWORD='******'mongodb:', open_options=open_options)
    gdal.PopErrorHandler()

    # A few error cases with authentication
    if ogrtest.mongodb_test_user is not None:
        open_options = []
        open_options += ['HOST=' + ogrtest.mongodb_test_host]
        open_options += ['PORT=' + str(ogrtest.mongodb_test_port)]
        open_options += ['DBNAME=' + ogrtest.mongodb_test_dbname]
        # Missing user and password
        gdal.PushErrorHandler()
        ds = gdal.OpenEx('mongodb:', open_options=open_options)
        gdal.PopErrorHandler()
        if ds is not None:
            gdaltest.post_reason('fail')
            return 'fail'

        open_options = []
        open_options += ['HOST=' + ogrtest.mongodb_test_host]
        open_options += ['PORT=' + str(ogrtest.mongodb_test_port)]
        open_options += ['DBNAME=' + ogrtest.mongodb_test_dbname]
        open_options += ['USER='******'mongodb:', open_options=open_options)
        gdal.PopErrorHandler()
        if ds is not None:
            gdaltest.post_reason('fail')
            return 'fail'

        open_options = []
        open_options += ['HOST=' + ogrtest.mongodb_test_host]
        open_options += ['PORT=' + str(ogrtest.mongodb_test_port)]
        open_options += ['USER='******'PASSWORD='******'mongodb:', open_options=open_options)
        gdal.PopErrorHandler()
        if ds is not None:
            gdaltest.post_reason('fail')
            return 'fail'

        open_options = []
        open_options += ['HOST=' + ogrtest.mongodb_test_host]
        open_options += ['PORT=' + str(ogrtest.mongodb_test_port)]
        open_options += ['DBNAME=' + ogrtest.mongodb_test_dbname]
        open_options += ['USER='******'PASSWORD='******'_wrong'
        ]
        # Wrong password
        gdal.PushErrorHandler()
        ds = gdal.OpenEx('mongodb:', open_options=open_options)
        gdal.PopErrorHandler()
        if ds is not None:
            gdaltest.post_reason('fail')
            return 'fail'

    # Test AUTH_JSON: invalid JSon
    gdal.PushErrorHandler()
    open_options = []
    open_options += ['HOST=' + ogrtest.mongodb_test_host]
    open_options += ['PORT=' + str(ogrtest.mongodb_test_port)]
    open_options += ['DBNAME=' + ogrtest.mongodb_test_dbname]
    open_options += ['AUTH_JSON={']
    ds = gdal.OpenEx('mongodb:', open_options=open_options)
    gdal.PopErrorHandler()
    if ds is not None:
        gdaltest.post_reason('fail')
        return 'fail'

    # Test AUTH_JSON: missing mechanism
    gdal.PushErrorHandler()
    open_options = []
    open_options += ['HOST=' + ogrtest.mongodb_test_host]
    open_options += ['PORT=' + str(ogrtest.mongodb_test_port)]
    open_options += ['DBNAME=' + ogrtest.mongodb_test_dbname]
    open_options += ['AUTH_JSON={}']
    ds = gdal.OpenEx('mongodb:', open_options=open_options)
    gdal.PopErrorHandler()
    if ds is not None:
        gdaltest.post_reason('fail')
        return 'fail'

    # Successful AUTH_JSON use
    if ogrtest.mongodb_test_user is not None:
        open_options = []
        open_options += ['HOST=' + ogrtest.mongodb_test_host]
        open_options += ['PORT=' + str(ogrtest.mongodb_test_port)]
        open_options += ['DBNAME=' + ogrtest.mongodb_test_dbname]
        open_options += ['AUTH_JSON={ "mechanism" : "SCRAM-SHA-1", "db": "%s", "user": "******", "pwd": "%s" }' % \
            (ogrtest.mongodb_test_dbname, ogrtest.mongodb_test_user, ogrtest.mongodb_test_password)]
        ds = gdal.OpenEx('mongodb:', open_options=open_options)
        if ds is None:
            gdaltest.post_reason('fail')
            return 'fail'

    return 'success'
Exemplo n.º 20
0
def test_ogr_pdf_2(name='tmp/ogr_pdf_1.pdf', has_attributes=True):

    if not has_read_support():
        pytest.skip()

    ds = ogr.Open(name)
    assert ds is not None

    lyr = ds.GetLayerByName('first_layer')
    assert lyr is not None

    if has_attributes:
        assert lyr.GetLayerDefn().GetFieldDefn(
            lyr.GetLayerDefn().GetFieldIndex(
                'strfield')).GetType() == ogr.OFTString
        assert lyr.GetLayerDefn().GetFieldDefn(
            lyr.GetLayerDefn().GetFieldIndex(
                'intfield')).GetType() == ogr.OFTInteger
        assert lyr.GetLayerDefn().GetFieldDefn(
            lyr.GetLayerDefn().GetFieldIndex(
                'realfield')).GetType() == ogr.OFTReal
    else:
        assert lyr.GetLayerDefn().GetFieldCount() == 0

    if has_attributes:
        feat = lyr.GetNextFeature()
    # This won't work properly until text support is added to the
    # PDF vector feature reader
    # if ogrtest.check_feature_geometry(feat, ogr.CreateGeometryFromWkt('POINT(2 49)')) != 0:
    #    feat.DumpReadable()
    #    gdaltest.post_reason('fail')
    #    return 'fail'

    feat = lyr.GetNextFeature()
    if ogrtest.check_feature_geometry(
            feat, ogr.CreateGeometryFromWkt('LINESTRING(2 48,3 50)')) != 0:
        feat.DumpReadable()
        pytest.fail()

    if has_attributes:
        if feat.GetField('strfield') != 'str':
            feat.DumpReadable()
            pytest.fail()
        if feat.GetField('intfield') != 1:
            feat.DumpReadable()
            pytest.fail()
        if abs(feat.GetFieldAsDouble('realfield') - 2.34) > 1e-10:
            feat.DumpReadable()
            pytest.fail()

    feat = lyr.GetNextFeature()
    if ogrtest.check_feature_geometry(
            feat,
            ogr.CreateGeometryFromWkt(
                'POLYGON((2 48,2 49,3 49,3 48,2 48))')) != 0:
        feat.DumpReadable()
        pytest.fail()

    feat = lyr.GetNextFeature()
    if ogrtest.check_feature_geometry(
            feat,
            ogr.CreateGeometryFromWkt(
                'POLYGON((2 48,2 49,3 49,3 48,2 48),(2.25 48.25,2.25 48.75,2.75 48.75,2.75 48.25,2.25 48.25))'
            )) != 0:
        feat.DumpReadable()
        pytest.fail()

    for i in range(10):
        feat = lyr.GetNextFeature()
        if ogrtest.check_feature_geometry(
                feat,
                ogr.CreateGeometryFromWkt('POINT(%f 49.1)' %
                                          (2 + i * 0.05))) != 0:
            feat.DumpReadable()
            pytest.fail('fail with ogr-sym-%d' % i)

    feat = lyr.GetNextFeature()
    if ogrtest.check_feature_geometry(
            feat, ogr.CreateGeometryFromWkt('POINT(2.5 49.1)')) != 0:
        feat.DumpReadable()
        pytest.fail('fail with raster icon')

    ds = None
Exemplo n.º 21
0
def lcgc(bhcat='', cluster=''):

    pa_list = np.genfromtxt(
        'results/overall_optim_thresholds2.csv', dtype='int', skip_header=0
    )  #,usecols=(1))#np.genfromtxt('wdpaids_marine.csv',dtype='int')
    #pa_list = pa_listt[,0]
    #res_list = pa_listt[,1]#np.genfromtxt('results/overall_optim_thresholds2.csv',dtype='int',skip_header=0,usecols=(2))
    n = len(pa_list)
    #pa_list = pa_list2[0:n] #n-2
    #print pa_list
    #n2 = len(pa_list)
    print n
    field_name_target = 'hclst_m'
    idd = roads = mval = None

    csvname = 'results/gclc_aver_in.csv'  # +str(bhcat)+
    if os.path.isfile(csvname) == False:
        wb = open(csvname, 'a')
        wb.write('wdpaid cluster gclc aver')
        wb.write('\n')
        wb.close()
    #f=open('','w')
    #f.write('wdpaid, roads, tot, perc\n')
    csvname1 = 'csv/gclc_' + str(bhcat) + '_in_done_100km2.csv'
    if os.path.isfile(csvname1) == False:
        wb = open(csvname1, 'a')
        wb.write('None')
        wb.write('\n')
        wb.close()

    gtif_file = '/home/majavie/DOPA/consensus_full_class_LC/consensus_full_class_' + str(
        bhcat) + '_moll.tif'  # 1.tif
    gtif_dataset = gdal.Open(gtif_file, GA_ReadOnly)

    transform = gtif_dataset.GetGeoTransform()
    xOrigin = transform[0]
    yOrigin = transform[3]
    pixelWidth = transform[1]
    pixelHeight = transform[5]
    banddataraster = gtif_dataset.GetRasterBand(1)
    #segmlist = range(1,9)

    pa_list_done = np.genfromtxt(csvname1, dtype='int')

    for px in range(0, n):
        idd2 = pa_list[px, 0]
        res = pa_list[px, 1]
        #print idd2,res
        if idd2 not in pa_list_done:
            #clusterlistcsv = 'csv/park_'+idd2+'_'+res+'.csv'
            #segmlist = np.genfromtxt(segmlistcsv,dtype='int')
            #n2 = len(segmlist)
            #for px in range(0,n2):
            #idd = segmlist[px]

            inShapefile = 'results/park_segm_' + str(idd2) + '_' + str(
                res) + '_class.shp'
            inDriver = ogr.GetDriverByName("ESRI Shapefile")
            inDataSource = inDriver.Open(inShapefile, 0)
            inLayer = inDataSource.GetLayer()

            #inLayer.GetFieldAsString(field_name_target)
            #for cluster in segmlist: # indent1
            # Get the input Layer
            print idd2, res, 'cluster:', cluster
            opt = field_name_target + " = '" + str(cluster) + "'"
            #print opt
            inLayer.SetAttributeFilter(opt)
            if inLayer.GetFeatureCount() > 0:  # indent2
                ola = 'pa_tmpfs_' + str(bhcat) + '_' + str(idd2) + '_' + str(
                    cluster) + '.shp'
                # Create the output LayerS
                outShapefile = os.path.join(os.path.split(inShapefile)[0], ola)
                #print outShapefile
                outDriver = ogr.GetDriverByName("ESRI Shapefile")

                # Remove output shapefile if it already exists
                if os.path.exists(outShapefile):
                    outDriver.DeleteDataSource(outShapefile)

                # Create the output shapefile
                outDataSource = outDriver.CreateDataSource(outShapefile)
                out_lyr_name = os.path.splitext(
                    os.path.split(outShapefile)[1])[0]
                outLayer = outDataSource.CreateLayer(
                    out_lyr_name, geom_type=ogr.wkbMultiPolygon)

                # Add input Layer Fields to the output Layer if it is the one we want
                inLayerDefn = inLayer.GetLayerDefn()
                for i in range(0, inLayerDefn.GetFieldCount()):
                    fieldDefn = inLayerDefn.GetFieldDefn(i)
                    fieldName = fieldDefn.GetName()
                    if fieldName not in field_name_target:
                        continue
                    outLayer.CreateField(fieldDefn)

                # Get the output Layer's Feature Definition
                outLayerDefn = outLayer.GetLayerDefn()

                # Add features to the ouput Layer
                for inFeature in inLayer:
                    # Create output Feature
                    outFeature = ogr.Feature(outLayerDefn)

                    # Add field values from input Layer
                    for i in range(0, outLayerDefn.GetFieldCount()):
                        fieldDefn = outLayerDefn.GetFieldDefn(i)
                        fieldName = fieldDefn.GetName()
                        if fieldName not in field_name_target:
                            continue

                        outFeature.SetField(
                            outLayerDefn.GetFieldDefn(i).GetNameRef(),
                            inFeature.GetField(i))

                    # Set geometry as centroid
                    geom = inFeature.GetGeometryRef()
                    outFeature.SetGeometry(geom.Clone())
                    # Add new feature to output Layer
                    outLayer.CreateFeature(outFeature)

                # Close DataSources
                inDataSource.Destroy()
                outDataSource.Destroy()

                pixel_size = 1000
                NoData_value = 255

                # Filename of input OGR file
                vector_fn = ola  #'sierranevada2.shp'

                # Filename of the raster Tiff that will be created
                #raster_fn = 'sierranevada2.tif'

                # Open the data source and read in the extent
                source_ds = ogr.Open(outShapefile)  #vector_fn)
                source_layer = source_ds.GetLayer()
                x_min, x_max, y_min, y_max = source_layer.GetExtent()
                print str(x_min) + " " + str(x_max) + " " + str(
                    y_min) + " " + str(y_max)
                tx = abs(x_min) - abs(x_max)
                ty = abs(y_min) - abs(y_max)
                ggo = 1
                #if tx<100 or ty<100: ggo=0
                #print 'tx:',tx
                #print 'ty:',ty
                #print 'ggo:',ggo
                #	    if tx<1000: tx=1000
                #	    if ty<1000: ty=1000
                if ggo == 1:
                    # Create the destination data source
                    raster_fn = 'tmpf/pa_' + str(bhcat) + '_' + str(
                        idd2) + '_' + str(cluster) + '.tif'
                    x_res = int((x_max - x_min) / pixel_size)
                    y_res = int((y_max - y_min) / pixel_size)
                    print 'xres:', x_res
                    print 'yres:', y_res
                    #		    if x_res<1000: x_res=1000
                    #		    if y_res<1000: y_res=1000
                    target_ds = gdal.GetDriverByName('MEM').Create(
                        '', x_res, y_res, 1, gdal.GDT_Int32)
                    #target_ds2 = gdal.GetDriverByName('GTiff').Create(raster_fn, x_res, y_res, 1, gdal.GDT_Int32)
                    target_ds.SetGeoTransform(
                        (x_min, pixel_size, 0, y_max, 0, -pixel_size))
                    #target_ds2.SetGeoTransform((x_min, pixel_size, 0, y_max, 0, -pixel_size))
                    band = target_ds.GetRasterBand(1)
                    #band2 = target_ds.GetRasterBand(1)
                    band.SetNoDataValue(NoData_value)
                    #band2.SetNoDataValue(NoData_value)

                    # Rasterize
                    gdal.RasterizeLayer(target_ds, [1],
                                        source_layer,
                                        burn_values=[1])  # options = [""]
                    #gdal.RasterizeLayer(target_ds2, [1], source_layer, burn_values=[1])#)

                    array = band.ReadAsArray().astype(np.int32)

                    xoff = int((x_min - xOrigin) / pixelWidth)
                    yoff = int((yOrigin - y_max) / pixelWidth)
                    xcount = int((x_max - x_min) / pixelWidth)  #+1
                    ycount = int((y_max - y_min) / pixelWidth)  #+1
                    tcount = xcount + ycount
                    print 'tcount:', tcount

                    if xoff < 0:
                        xoff = 0
                    if yoff < 0:
                        yoff = 0
                    sumx = xoff + xcount
                    sumy = yoff + ycount
                    go = 1
                    if sumx > gtif_dataset.RasterXSize: go = 0
                    if sumy > gtif_dataset.RasterYSize: go = 0
                    if tcount == 0: go = 0
                    print 'go:', go
                    if go == 1:
                        dataraster = banddataraster.ReadAsArray(
                            xoff, yoff, xcount, ycount)  #.astype(np.float)
                        print 'unique:', np.unique(array)
                        mask = np.where(array == 1, dataraster, (0))
                        #roads = np.sum(mask)
                        mval = np.mean(dataraster)
                        #tot = np.sum(array)
                        #perc = float(roads/tot)*100
                        print 'pa', 'cl', 'cat', 'mn'
                        var = str(idd2) + " " + str(cluster) + " " + str(
                            bhcat) + " " + str(mval)
                        print var
                        dele = 'rm tmpf/pa_' + str(
                            bhcat) + '*'  # '_'+str(idd)+
                        #os.system(dele)
                        #f.write('{0}, {1}, {2}, {3}\n'.format(idd, roads, tot, perc))
                        wb = open(csvname, 'a')
                        wb.write(var)
                        wb.write('\n')
                        wb.close()
                        target_ds = dataraster = array = outShapefile = outFeature = outDataSource = vector_fn = outLayer = source_ds = opt = ola = source_layer = inDataSource = None
        # = None
        dele = 'rm results/*tmpfs*'  # '_'+str(idd)+
        os.system(dele)
        wb = open(csvname1, 'a')
        varx = str(idd)
        wb.write(varx)
        wb.write('\n')
        wb.close()
Exemplo n.º 22
0
def test_ogr_pdf_online_2():

    if not has_read_support():
        pytest.skip()

    if not gdaltest.download_file(
            'https://download.osgeo.org/gdal/data/pdf/340711752_Azusa_FSTopo.pdf',
            '340711752_Azusa_FSTopo.pdf'):
        pytest.skip()

    expected_layers = [
        ['Other_5', 0],
        ['Quadrangle_Extent_Other_4', 0],
        ['Quadrangle_Extent_State_Outline', 0],
        ['Adjacent_Quadrangle_Diagram_Other_3', 0],
        ['Adjacent_Quadrangle_Diagram_Quadrangle_Extent', 0],
        ['Adjacent_Quadrangle_Diagram_Quad_Outlines', 0],
        ['Quadrangle_Other', 0],
        ['Quadrangle_Labels_Unplaced_Labels_Road_Shields_-_Vertical', 0],
        ['Quadrangle_Labels_Road_Shields_-_Horizontal', 0],
        ['Quadrangle_Labels_Road_Shields_-_Vertical', 0],
        ['Quadrangle_Neatline/Mask_Neatline', 0],
        ['Quadrangle_Neatline/Mask_Mask', 0],
        ['Quadrangle_Culture_Features', 0],
        ['Quadrangle_Large_Tanks', 0],
        ['Quadrangle_Linear_Transportation_Features', 0],
        ['Quadrangle_Railroads_', 0],
        ['Quadrangle_Linear_Culture_Features', 0],
        ['Quadrangle_Linear_Landform_Features', 0],
        ['Quadrangle_Boundaries', 0],
        ['Quadrangle_PLSS', 0],
        ['Quadrangle_Survey_Lines', 0],
        ['Quadrangle_Linear_Drainage_Features', 0],
        ['Quadrangle_Contour_Labels', 0],
        ['Quadrangle_Contours', 0],
        ['Quadrangle_2_5`_Tics_Interior_Grid_Intersections', 0],
        ['Quadrangle_2_5`_Tics_Grid_Tics_along_Neatline', 0],
        ['Quadrangle_UTM_Grid_Interior_Grid_Intersections', 0],
        ['Quadrangle_UTM_Grid_Grid_Tics_along_Neatline', 0],
        ['Quadrangle_UTM_Grid_UTM_Grid_Lines', 0],
        ['Quadrangle_Large_Buildings', 0],
        ['Quadrangle_Drainage_Polygons', 0],
        ['Quadrangle_Ownership', 0],
        ['Quadrangle_Builtup_Areas', 0],
        ['Quadrangle_WoodlandUSGS_P', 0],
    ]

    ds = ogr.Open('tmp/cache/340711752_Azusa_FSTopo.pdf')
    assert ds is not None

    if ds.GetLayerCount() != len(expected_layers):
        for lyr in ds:
            print(lyr.GetName(), lyr.GetGeomType())
        pytest.fail(ds.GetLayerCount())

    for i in range(ds.GetLayerCount()):
        assert ds.GetLayer(i).GetName() == expected_layers[i][0], \
            ('%d : %s' % (i, ds.GetLayer(i).GetName()))

        assert ds.GetLayer(i).GetGeomType() == expected_layers[i][1], \
            ('%d : %d' % (i, ds.GetLayer(i).GetGeomType()))
Exemplo n.º 23
0
def test_gdal_polygonize_1():

    #from osgeo import gdal, gdalconst, ogr

    try:
        x = gdal.Polygonize
        gdaltest.have_ng = 1
    except:
        gdaltest.have_ng = 0
        return 'skip'

    script_path = test_py_scripts.get_py_script('gdal_polygonize')
    if script_path is None:
        return 'skip'

    # Create a OGR datasource to put results in.
    shp_drv = ogr.GetDriverByName('ESRI Shapefile')
    try:
        os.stat('tmp/poly.shp')
        shp_drv.DeleteDataSource('tmp/poly.shp')
    except:
        pass

    shp_ds = shp_drv.CreateDataSource('tmp/poly.shp')

    shp_layer = shp_ds.CreateLayer('poly', None, ogr.wkbPolygon)

    fd = ogr.FieldDefn('DN', ogr.OFTInteger)
    shp_layer.CreateField(fd)

    shp_ds.Destroy()

    # run the algorithm.
    test_py_scripts.run_py_script(script_path, 'gdal_polygonize',
                                  '../alg/data/polygonize_in.grd tmp poly DN')

    # Confirm we get the set of expected features in the output layer.

    shp_ds = ogr.Open('tmp')
    shp_lyr = shp_ds.GetLayerByName('poly')

    expected_feature_number = 13
    if shp_lyr.GetFeatureCount() != expected_feature_number:
        gdaltest.post_reason(
            'GetFeatureCount() returned %d instead of %d' %
            (mem_layer.GetFeatureCount(), expected_feature_number))
        return 'fail'

    expect = [107, 123, 115, 115, 140, 148, 123, 140, 156, 100, 101, 102, 103]

    tr = ogrtest.check_features_against_list(shp_lyr, 'DN', expect)

    # check at least one geometry.
    if tr:
        shp_lyr.SetAttributeFilter('dn = 156')
        feat_read = shp_lyr.GetNextFeature()
        if ogrtest.check_feature_geometry(
                feat_read,
                'POLYGON ((440720 3751200,440900 3751200,440900 3751020,440720 3751020,440720 3751200),(440780 3751140,440780 3751080,440840 3751080,440840 3751140,440780 3751140))'
        ) != 0:
            tr = 0
        feat_read.Destroy()

    shp_ds.Destroy()
    # Reload drv because of side effects of run_py_script()
    shp_drv = ogr.GetDriverByName('ESRI Shapefile')
    shp_drv.DeleteDataSource('tmp/poly.shp')

    if tr:
        return 'success'
    else:
        return 'fail'
Exemplo n.º 24
0
        default=False,
        action="store_true",
        help="close the largest open linestring with a circular arc")
    parser.add_option(
        "-t",
        "--tolerance",
        dest="tolerance",
        type="float",
        default=0.0,
        metavar="DISTANCE",
        help="Tolerance for joining two endpoints, in geographic units")
    parser.add_option("-m",
                      "--multiple",
                      dest="single_feature",
                      default=True,
                      action="store_false",
                      metavar="SINGLE_FEATURE")

    (options, args) = parser.parse_args()
    input_shp, output_shp = args

    ods = ogr.Open(input_shp)
    layer = ods.GetLayer(0)

    process_layer(layer,
                  output_shp,
                  create_polygons=options.create_polygons,
                  close_arc=options.close_arc,
                  tolerance=options.tolerance,
                  single_feature=options.single_feature)
Exemplo n.º 25
0
#!/usr/bin/env python

from osgeo import gdal, ogr

if __name__ == '__main__':
    in_file = '../images/portland_chip.tif'
    out_file = '../images/portland_roads.tif'
    road_file = '../images/roads.shp'
    try:
        # Open the input dataset.
        ds_in = gdal.Open(in_file)

        # Open the vector dataset.
        ds_vector = ogr.Open(road_file)
        lyr = ds_vector.GetLayer()

        # Create a dataset to write to.
        ds_out = gdal.GetDriverByName("GTiff").Create(out_file,
                                                      ds_in.RasterXSize,
                                                      ds_in.RasterYSize, 3,
                                                      gdal.GDT_Byte)
        ds_out.SetProjection(ds_in.GetProjection())
        ds_out.SetGeoTransform(ds_in.GetGeoTransform())

        # Rasterize.
        gdal.RasterizeLayer(ds_out, [1, 2, 3],
                            lyr,
                            burn_values=[255, 0, 0],
                            options=['ALL_TOUCHED=TRUE'])

    finally:
Exemplo n.º 26
0
def process_layer(orig_layer,
                  output_name,
                  tolerance=0.0,
                  create_polygons=False,
                  close_arc=False,
                  single_feature=True,
                  remove_duplicates=True):
    """
    remove_duplicates: if true, exactly duplicated nodes along a single path will be removed, i.e.
      the linestring A-B-B-C will become A-B-C.
    single_feature: only save the biggest feature
    """
    if isinstance(orig_layer, str):
        ods = ogr.Open(orig_layer)
        orig_layer = ods.GetLayer(0)

    ### The actual geometry processing: ###
    ### <processing>
    new_features = merge_lines(orig_layer)

    if remove_duplicates:
        log.info("Checking the merged features for duplicate points")
        # possibly important here to have the duplicate test more stringent than
        # the tolerant_merge_lines.
        # also have to be careful about a string of points closely spaced - don't
        # want to remove all of them, just enough to keep the minimal spacing above
        # tolerance.
        short_tol = 0.5 * tolerance

        for fi in range(len(new_features)):
            pnts = new_features[fi]
            valid = ones(len(pnts), 'bool8')
            # go with a slower but safer loop here -
            last_valid = 0
            for i in range(1, len(pnts)):
                if vector_mag(pnts[last_valid] - pnts[i]) < short_tol:
                    if i == len(pnts) - 1:
                        # special case to avoid moving the last vertex
                        valid[last_valid] = False
                        last_valid = i
                    else:
                        valid[i] = False
                else:
                    last_valid = i

            # print "Ring %d: # invalid=%d / %d"%(i,sum(~valid),len(new_features[i]))
            new_features[fi] = new_features[fi][valid, :]

    if tolerance > 0.0:
        new_features = tolerant_merge_lines(new_features, tolerance)

    ### </processing>

    ### <output>
    if create_polygons:
        geoms = lines_to_polygons(new_features,
                                  close_arc=close_arc,
                                  single_feature=single_feature)
    else:
        # Line output
        geoms = [shapely.geometry.LineString(pnts) for pnts in new_features]

    # Write it all out to a shapefile:
    progress_message("Writing output")

    wkb2shp.wkb2shp(output_name, geoms, overwrite=True)

    return output_name
Exemplo n.º 27
0
def ogr_dispatch(argv, progress=None, progress_arg=None):
    # pylint: disable=unused-argument
    src_filename = None
    dst_filename = None
    driver_name = "ESRI Shapefile"
    options = Options()
    lco = []
    dsco = []
    pszWHERE = None

    if not argv:
        return Usage()

    i = 0
    while i < len(argv):
        arg = argv[i]
        if EQUAL(arg, '-src') and i + 1 < len(argv):
            i = i + 1
            src_filename = argv[i]
        elif EQUAL(arg, '-dst') and i + 1 < len(argv):
            i = i + 1
            dst_filename = argv[i]
        elif EQUAL(arg, '-f') and i + 1 < len(argv):
            i = i + 1
            driver_name = argv[i]

        elif EQUAL(arg, '-a_srs') and i + 1 < len(argv):
            i = i + 1
            pszOutputSRSDef = argv[i]
            if EQUAL(pszOutputSRSDef, "NULL") or \
               EQUAL(pszOutputSRSDef, "NONE"):
                options.bNullifyOutputSRS = True
            else:
                options.poOutputSRS = osr.SpatialReference()
                if options.poOutputSRS.SetFromUserInput(pszOutputSRSDef) != 0:
                    print("Failed to process SRS definition: %s" % pszOutputSRSDef)
                    return 1
        elif EQUAL(arg, '-dsco') and i + 1 < len(argv):
            i = i + 1
            dsco.append(argv[i])
        elif EQUAL(arg, '-lco') and i + 1 < len(argv):
            i = i + 1
            lco.append(argv[i])
        elif EQUAL(arg, '-field') and i + 1 < len(argv):
            i = i + 1
            options.dispatch_fields.append(argv[i])
        elif EQUAL(arg, '-25D_as_2D'):
            options.b25DAs2D = True
        elif EQUAL(arg, '-multi_as_single'):
            options.bMultiAsSingle = True
        elif EQUAL(arg, '-remove_dispatch_fields'):
            options.bRemoveDispatchFields = True
        elif EQUAL(arg, '-prefix_with_layer_name'):
            options.bPrefixWithLayerName = True
        elif EQUAL(arg, '-style_as_field'):
            options.bStyleAsField = True
        elif (EQUAL(arg, "-tg") or
                EQUAL(arg, "-gt")) and i + 1 < len(argv):
            i = i + 1
            options.nGroupTransactions = int(argv[i])
        elif EQUAL(arg, "-where") and i + 1 < len(argv):
            i = i + 1
            pszWHERE = argv[i]
        elif EQUAL(arg, '-quiet'):
            options.bQuiet = True
        else:
            print('Unrecognized argument : %s' % arg)
            return Usage()
        i = i + 1

    if src_filename is None:
        print('Missing -src')
        return 1

    if dst_filename is None:
        print('Missing -dst')
        return 1

    if not options.dispatch_fields:
        print('Missing -dispatch_field')
        return 1

    src_ds = ogr.Open(src_filename)
    if src_ds is None:
        print('Cannot open source datasource %s' % src_filename)
        return 1

    dst_ds = ogr.Open(dst_filename, update=1)
    if dst_ds is not None:
        if dsco:
            print('-dsco should not be specified for an existing datasource')
            return 1
    else:
        dst_ds = ogr.GetDriverByName(driver_name).CreateDataSource(dst_filename, options=dsco)
    if dst_ds is None:
        print('Cannot open or create target datasource %s' % dst_filename)
        return 1

    layerMap = {}

    for src_lyr in src_ds:
        if pszWHERE is not None:
            src_lyr.SetAttributeFilter(pszWHERE)
        ret = convert_layer(src_lyr, dst_ds, layerMap, options)
        if ret != 0:
            return ret

    return 0
Exemplo n.º 28
0
    elif argv[iArg] == "-t_srs" and iArg < nArgc - 1:
        iArg = iArg + 1
        srsname = argv[iArg]

    elif argv[iArg][0] == '-':
        Usage()

    elif ogr_ds_name is None:
        ogr_ds_name = argv[iArg]

    iArg = iArg + 1

if ogr_ds_name is None or tilesrs is None:
    Usage()

ogr_ds = ogr.Open(ogr_ds_name)
if ogr_ds is None:
    raise Exception('cannot open %s' % ogr_ds_name)
if ogr_ds.GetLayerCount() == 1:
    lyr = ogr_ds.GetLayer(0)
elif lyr_name is None:
    raise Exception('-lyr_name should be specified')
else:
    lyr = ogr_ds.GetLayerByName(lyr_name)

if lyr.GetLayerDefn().GetFieldIndex(tileitem) < 0:
    raise Exception('%s field cannot be found in layer definition' % tileitem)

if lyr.GetLayerDefn().GetFieldIndex(tilesrs) < 0:
    raise Exception('%s field cannot be found in layer definition' % tilesrs)
Exemplo n.º 29
0
def test_ogr_osm_10():

    if ogrtest.osm_drv is None:
        pytest.skip()

    # A file that does not exist.
    ds = ogr.Open('/nonexistent/foo.osm')
    assert ds is None

    # Empty .osm file
    f = gdal.VSIFOpenL('/vsimem/foo.osm', 'wb')
    gdal.VSIFCloseL(f)

    ds = ogr.Open('/vsimem/foo.osm')
    assert ds is None

    gdal.Unlink('/vsimem/foo.osm')

    # Empty .pbf file
    f = gdal.VSIFOpenL('/vsimem/foo.pbf', 'wb')
    gdal.VSIFCloseL(f)

    ds = ogr.Open('/vsimem/foo.pbf')
    assert ds is None

    gdal.Unlink('/vsimem/foo.pbf')

    if ogrtest.osm_drv_parse_osm:
        # Invalid .osm file
        f = gdal.VSIFOpenL('/vsimem/foo.osm', 'wb')
        data = "<osm>"
        gdal.VSIFWriteL(data, 1, len(data), f)
        gdal.VSIFCloseL(f)

        ds = ogr.Open('/vsimem/foo.osm')
        lyr = ds.GetLayer(0)
        gdal.ErrorReset()
        gdal.PushErrorHandler('CPLQuietErrorHandler')
        feat = lyr.GetNextFeature()
        gdal.PopErrorHandler()
        assert gdal.GetLastErrorMsg() != ''
        ds = None

        gdal.Unlink('/vsimem/foo.osm')

    # Invalid .pbf file
    f = gdal.VSIFOpenL('/vsimem/foo.pbf', 'wb')
    data = "OSMHeader\n"
    gdal.VSIFWriteL(data, 1, len(data), f)
    gdal.VSIFCloseL(f)

    ds = ogr.Open('/vsimem/foo.pbf')
    lyr = ds.GetLayer(0)
    gdal.ErrorReset()
    gdal.PushErrorHandler('CPLQuietErrorHandler')
    feat = lyr.GetNextFeature()
    gdal.PopErrorHandler()
    assert gdal.GetLastErrorMsg() != ''
    ds = None

    gdal.Unlink('/vsimem/foo.pbf')

    # Test million laugh pattern
    if ogrtest.osm_drv_parse_osm:
        ds = ogr.Open('data/osm/billionlaugh.osm')
        lyr = ds.GetLayer(0)
        gdal.ErrorReset()
        gdal.PushErrorHandler('CPLQuietErrorHandler')
        feat = lyr.GetNextFeature()
        gdal.PopErrorHandler()
        assert feat is None and gdal.GetLastErrorMsg() != ''
Exemplo n.º 30
0
import os
import time

import shapely.geometry
import shapely.ops
from osgeo import ogr

format = '%.8f %.8f'
tolerance = 0.01
infile = '/Users/kirilllebedev/Maps/50m-admin-0-countries/ne_50m_admin_0_countries.shp'
outfile = 'map.shp'

# Open the datasource to operate on.
in_ds = ogr.Open(infile, update=0)
in_layer = in_ds.GetLayer(0)
in_defn = in_layer.GetLayerDefn()

# Create output file with similar information.
shp_driver = ogr.GetDriverByName('ESRI Shapefile')
if os.path.exists('map.shp'):
    shp_driver.DeleteDataSource(outfile)
shp_ds = shp_driver.CreateDataSource(outfile)
shp_layer = shp_ds.CreateLayer(in_defn.GetName(),
                               geom_type=in_defn.GetGeomType(),
                               srs=in_layer.GetSpatialRef())

in_field_count = in_defn.GetFieldCount()
for fld_index in range(in_field_count):
    src_fd = in_defn.GetFieldDefn(fld_index)
    fd = ogr.FieldDefn(src_fd.GetName(), src_fd.GetType())
    fd.SetWidth(src_fd.GetWidth())