Exemple #1
0
    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
Exemple #2
0
    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
Exemple #3
0
    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