def create_file(cls, path, geometry, fields, layer, driver, options, sr): """Create a vector datasource""" with Env(_osgeo_use_exceptions=False): dr = gdal.GetDriverByName(driver) gdal_ds = gdal.OpenEx( path, conv.of_of_mode('w') | conv.of_of_str('vector'), [driver], options, ) if gdal_ds is None: gdal_ds = dr.Create(path, 0, 0, 0, 0, options) else: if gdal_ds.GetLayerByName( layer) is not None: # pragma: no cover err = gdal_ds.DeleteLayer(layer) if err: raise Exception('Could not delete %s' % path) # See TODO on deletion of existing file # if gdal_ds.GetLayerCount() == 0: # del gdal_ds # err = dr.DeleteDataSource(path) # if err: # raise Exception('Could not delete %s' % path) # gdal_ds = dr.CreateDataSource(path, options) if gdal_ds is None: # pragma: no cover raise Exception('Could not create gdal dataset (%s)' % str(gdal.GetLastErrorMsg()).strip('\n')) if sr is not None: sr = osr.SpatialReference(osr.GetUserInputAsWKT(sr)) geometry = conv.wkbgeom_of_str(geometry) lyr = gdal_ds.CreateLayer(layer, sr, geometry, options) if lyr is None: # pragma: no cover raise Exception('Could not create layer (%s)' % str(gdal.GetLastErrorMsg()).strip('\n')) for field in fields: flddef = ogr.FieldDefn(field['name'], field['type']) if field['precision'] is not None: flddef.SetPrecision(field['precision']) if field['width'] is not None: flddef.SetWidth(field['width']) if field['nullable'] is not None: flddef.SetNullable(field['nullable']) if field['default'] is not None: flddef.SetDefault(field['default']) lyr.CreateField(flddef) lyr.SyncToDisk() gdal_ds.FlushCache() return gdal_ds, lyr
def acreate_vector(self, path, geometry, fields=(), layer=None, driver='ESRI Shapefile', options=(), sr=None): """Create a vector file anonymously in this DataSource. Only metadata are kept in memory. See DataSource.create_vector Example ------- >>> lines = ds.acreate_vector('/path/to.shp', 'linestring') >>> file_proj4 = lines.proj4_stored """ # Parameter checking *************************************************** path = str(path) geometry = conv.str_of_wkbgeom(conv.wkbgeom_of_str(geometry)) fields = _tools.normalize_fields_defn(fields) if layer is None: layer = '.'.join(ntpath.basename(path).split('.')[:-1]) else: layer = str(layer) driver = str(driver) options = [str(arg) for arg in options] if sr is not None: sr = osr.GetUserInputAsWKT(sr) # Construction dispatch ************************************************ if driver.lower() == 'memory': # TODO: Check not concurrent allocator = lambda: BackGDALFileVector.create_file( '', geometry, fields, layer, 'Memory', options, sr) prox = GDALMemoryVector(self, allocator, options) elif True: allocator = lambda: BackGDALFileVector.create_file( path, geometry, fields, layer, driver, options, sr) prox = GDALFileVector(self, allocator, options, 'w') else: pass # DataSource Registering *********************************************** self._register([], prox) return prox
def _create_file(cls, path, geometry, fields, layer, driver, options, sr): """Create a vector datasource""" if layer is None: layer = '.'.join(ntpath.basename(path).split('.')[:-1]) elif not isinstance(layer, str): raise TypeError('layer should be None or str') options = [str(arg) for arg in options] if len(options) else [] with Env(_osgeo_use_exceptions=False): dr = gdal.GetDriverByName(driver) gdal_ds = gdal.OpenEx( path, conv.of_of_mode('w') | conv.of_of_str('vector'), [driver], options, ) if gdal_ds is None: gdal_ds = dr.Create(path, 0, 0, 0, 0, options) else: if gdal_ds.GetLayerByName(layer) is not None: err = gdal_ds.DeleteLayer(layer) if err: raise Exception('Could not delete %s' % path) # See todo on deletion of existing file # if gdal_ds.GetLayerCount() == 0: # del gdal_ds # err = dr.DeleteDataSource(path) # if err: # raise Exception('Could not delete %s' % path) # gdal_ds = dr.CreateDataSource(path, options) if gdal_ds is None: raise Exception('Could not create gdal dataset (%s)' % gdal.GetLastErrorMsg()) if sr is not None: sr = osr.SpatialReference(osr.GetUserInputAsWKT(sr)) geometry = conv.wkbgeom_of_str(geometry) lyr = gdal_ds.CreateLayer(layer, sr, geometry, options) if lyr is None: raise Exception('Could not create layer (%s)' % gdal.GetLastErrorMsg()) fields = cls._normalize_fields_defn(fields) for field in fields: flddef = ogr.FieldDefn(field['name'], field['type']) if field['precision'] is not None: flddef.SetPrecision(field['precision']) if field['width'] is not None: flddef.SetWidth(field['width']) if field['nullable'] is not None: flddef.SetNullable(field['nullable']) if field['default'] is not None: flddef.SetDefault(field['default']) lyr.CreateField(flddef) lyr.SyncToDisk() gdal_ds.FlushCache() return gdal_ds, lyr
def create_vector(self, key, path, geometry, fields=(), layer=None, driver='ESRI Shapefile', options=(), sr=None): """Create a vector file and register it under `key` in this DataSource. Only metadata are kept in memory. Parameters ---------- key: hashable (like a string) File identifier within DataSource path: string geometry: string name of a wkb geometry type http://www.gdal.org/ogr__core_8h.html#a800236a0d460ef66e687b7b65610f12a (see example below) fields: sequence of dict Attributes of fields, one dict per field. (see `Field attributes` below) layer: None or string driver: string ogr driver to use when opening the file http://www.gdal.org/ogr_formats.html options: sequence of str options for ogr sr: string or None Spatial reference of the new file if None: don't set a spatial reference if string: if path: Use same projection as file at `path` if textual spatial reference: http://gdal.org/java/org/gdal/osr/SpatialReference.html#SetFromUserInput-java.lang.String- Returns ------- one of {GDALFileVector, GDALMemoryVector} depending on the `driver` parameter Field attributes ---------------- Attributes: 'name': string 'type': string (see `Field type` below) 'precision': int 'width': int 'nullable': bool 'default': same as `type` An attribute missing or None is kept to default value. Field types ----------- Binary key: 'binary', bytes, np.bytes_, aliases of np.bytes_ Date key: 'date' DateTime key: 'datetime', datetime.datetime, np.datetime64, aliases of np.datetime64 Time key: 'time' Integer key: 'integer' np.int32, aliases of np.int32 Integer64 key: 'integer64', int, np.int64, aliases of np.int64 Real key: 'real', float, np.float64, aliases of np.float64 String key: 'string', str, np.str_, aliases of np.str_ Integer64List key: 'integer64list', 'int list' IntegerList key: 'integerlist' RealList key: 'reallist', 'float list' StringList key: 'stringlist', 'str list' Example ------- >>> ds.create_vector('lines', '/path/to.shp', 'linestring') >>> geometry_type = ds.lines.type >>> fields = [ {'name': 'name', 'type': str}, {'name': 'count', 'type': 'int32'}, {'name': 'area', 'type': np.float64, 'width': 5, precision: 18}, {'name': 'when', 'type': np.datetime64}, ] >>> ds.create_vector('zones', '/path/to.shp', 'polygon', fields) >>> field0_type = ds.zones.fields[0]['type'] """ # Parameter checking *************************************************** self._validate_key(key) path = str(path) geometry = conv.str_of_wkbgeom(conv.wkbgeom_of_str(geometry)) fields = _tools.normalize_fields_defn(fields) if layer is None: layer = '.'.join(ntpath.basename(path).split('.')[:-1]) else: layer = str(layer) driver = str(driver) options = [str(arg) for arg in options] if sr is not None: sr = osr.GetUserInputAsWKT(sr) # Construction dispatch ************************************************ if driver.lower() == 'memory': # TODO: Check not concurrent allocator = lambda: BackGDALFileVector.create_file( '', geometry, fields, layer, 'Memory', options, sr) prox = GDALMemoryVector(self, allocator, options) elif True: allocator = lambda: BackGDALFileVector.create_file( path, geometry, fields, layer, driver, options, sr) prox = GDALFileVector(self, allocator, options, 'w') else: pass # DataSource Registering *********************************************** self._register([key], prox) return prox
def create_file(cls, path, geometry, fields, layer, driver, options, wkt, ow): """Create a vector dataset""" # Step 0 - Find driver ********************************************** ** success, payload = GDALErrorCatcher(gdal.GetDriverByName, none_is_error=True)(driver) if not success: raise ValueError( 'Could not find a driver named `{}` (gdal error: `{}`)'.format( driver, payload[1])) dr = payload # Step 1 - Overwrite ************************************************ ** if dr.ShortName != 'Memory' and os.path.exists(path): if ow: success, payload = GDALErrorCatcher( dr.Delete, nonzero_int_is_error=True)(path) if not success: msg = 'Could not delete `{}` using driver `{}` (gdal error: `{}`)'.format( path, dr.ShortName, payload[1]) raise RuntimeError(msg) else: msg = "Can't create `{}` with `ow=False` (overwrite) because file exist".format( path, ) raise RuntimeError(msg) # Step 2 - Create gdal_ds ******************************************* ** success, payload = GDALErrorCatcher(dr.Create)(path, 0, 0, 0, 0, options) if not success: # pragma: no cover raise RuntimeError( 'Could not create `{}` using driver `{}` (gdal error: `{}`)'. format(path, dr.ShortName, payload[1])) gdal_ds = payload # Step 3 - Get spatial reference ************************************ ** if wkt is not None: sr = osr.SpatialReference(wkt) else: sr = None # Step 4 - Create layer ********************************************* ** geometry = conv.wkbgeom_of_str(geometry) success, payload = GDALErrorCatcher(gdal_ds.CreateLayer, none_is_error=True)(layer, sr, geometry, options) if not success: # pragma: no cover msg = 'Could not create layer `{}` in `{}` using driver `{}` (gdal error: `{}`)'.format( layer, path, dr.ShortName, payload[1]) raise RuntimeError(msg) lyr = payload # Step 5 - Set fields *********************************************** ** for field in fields: flddef = ogr.FieldDefn(field['name'], field['type']) if field['precision'] is not None: flddef.SetPrecision(field['precision']) if field['width'] is not None: flddef.SetWidth(field['width']) if field['nullable'] is not None: flddef.SetNullable(field['nullable']) if field['default'] is not None: flddef.SetDefault(field['default']) lyr.CreateField(flddef) lyr.SyncToDisk() gdal_ds.FlushCache() return gdal_ds, lyr