def _create_export_datasource( self, tmp_folder, layer_name, export_format, export_projection, layer_geom_type): GDAL_Driver = self._get_GDAL_Driver_by_export_format(export_format) driver = ogr.GetDriverByName(GDAL_Driver) # Create the data source abs_filepath = os.path.join( tmp_folder, layer_name) + "." + export_format datasource_options = self._get_datasource_options(GDAL_Driver) data_source = driver.CreateDataSource( abs_filepath, options=datasource_options) # Create the spatial reference srs = osr.SpatialReference() srs.ImportFromEPSG(export_projection) # Create the layer layer_options = self._get_layer_options(GDAL_Driver) layer = data_source.CreateLayer( str(layer_name), srs, layer_geom_type, options=layer_options) return data_source, layer
def _get_SRS(self, layer): default_epsg = 4326 if layer.GetSpatialRef(): prj = layer.GetSpatialRef().ExportToWkt() srs_osr = osr.SpatialReference() srs_osr.ImportFromESRI([prj]) epsg = srs_osr.GetAuthorityCode(None) if epsg is None or epsg == 0: epsg = default_epsg return int(epsg) else: return default_epsg
def _init_export(self, resource_id, export_format, export_projection): postgis_layer, connection = self._get_layer(resource_id) if postgis_layer is None: return None # Set up the export GDAL driver tmp_folder = self._create_temp_export_folder() resource_name = self._get_resource_name(resource_id) if DBTableResource.name_suffix in resource_name: resource_name = resource_name.replace(DBTableResource.name_suffix, '') export_datasource, export_layer = self._create_export_datasource( tmp_folder, resource_name, export_format, export_projection, postgis_layer.GetGeomType()) postgis_srs = self._get_SRS(postgis_layer) coordTrans = None if not export_projection == postgis_srs: # input SpatialReference inSpatialRef = osr.SpatialReference() inSpatialRef.ImportFromEPSG(postgis_srs) # output SpatialReference outSpatialRef = osr.SpatialReference() outSpatialRef.ImportFromEPSG(export_projection) # create the CoordinateTransformation coordTrans = osr.CoordinateTransformation( inSpatialRef, outSpatialRef) postgislyrDefn = postgis_layer.GetLayerDefn() for i in range(postgislyrDefn.GetFieldCount()): fieldName = postgislyrDefn.GetFieldDefn(i).GetName() fieldTypeCode = postgislyrDefn.GetFieldDefn(i).GetType() fieldType = postgislyrDefn.GetFieldDefn( i).GetFieldTypeName(fieldTypeCode) fieldWidth = postgislyrDefn.GetFieldDefn(i).GetWidth() fieldPrecision = postgislyrDefn.GetFieldDefn(i).GetPrecision() field_region = ogr.FieldDefn(fieldName, fieldTypeCode) field_region.SetWidth(fieldWidth) field_region.SetPrecision(fieldPrecision) export_layer.CreateField(field_region) field_region.Destroy() for feat in postgis_layer: # create the feature feature = ogr.Feature(export_layer.GetLayerDefn()) # Set the attributes using the values from the delimited text file for i in range(postgislyrDefn.GetFieldCount()): fieldName = postgislyrDefn.GetFieldDefn(i).GetName() feature.SetField(fieldName, feat[fieldName]) geom = feat.GetGeometryRef() if coordTrans: geom.Transform(coordTrans) try: feature.SetGeometry(geom) except RuntimeError: pass export_layer.CreateFeature(feature) feature.Destroy() export_datasource.Destroy() file_path = self._create_zip(tmp_folder) connection.Destroy() shutil.rmtree(tmp_folder) resp = self._send_file_response(file_path, resource_name) #os.remove(file_path) Needs Fix to delete files return resp