def handle_layer(self, layer, geom_name, table_name):
     srs = self.get_SRS(layer)
     featureCount = layer.GetFeatureCount()
     layerDefinition = layer.GetLayerDefn()
     self._db = DB(self.db_conn_params)
     fields = self._get_layer_fields(layerDefinition)
     layer.ResetReading()
     feat = layer.GetNextFeature()
     feat_geom = feat.GetGeometryRef()
     coordinate_dimension = feat_geom.GetCoordinateDimension()
     layer.ResetReading()
     self._db.create_table(table_name, fields, geom_name, srs,
                           coordinate_dimension)
     self.write_to_db(table_name, layer, srs, geom_name)
 def handle_layer(self, layer, geom_name, table_name):
     srs = self.get_SRS(layer)
     featureCount = layer.GetFeatureCount()
     layerDefinition = layer.GetLayerDefn()
     self._db = DB(self.db_conn_params)
     fields = self._get_layer_fields(layerDefinition)
     layer.ResetReading()
     feat = layer.GetNextFeature()
     feat_geom = feat.GetGeometryRef()
     coordinate_dimension = feat_geom.GetCoordinateDimension()
     layer.ResetReading()
     self._db.create_table(table_name, fields, geom_name, srs, coordinate_dimension)
     self.write_to_db(table_name, layer, srs, geom_name)
def _delete_from_datastore(resource_id, db_conn_params, context):
    _db = DB(db_conn_params)
    _db.drop_table(resource_id)
    _db.commit_and_close()
class Vector:
    _check_for_conversion = False
    default_epsg = 4326
    gdal_driver = None

    def __init__(self, gdal_driver, file_path, encoding = None, db_conn_params = None):
        self.gdal_driver = gdal_driver
        self.encoding = encoding
        self.db_conn_params = db_conn_params
        driver = ogr.GetDriverByName(gdal_driver)
        self.dataSource = driver.Open(file_path, 0)
        if self.dataSource is None:
            raise 'Could not open %s' % file_path

    def get_layer_count(self):
        return self.dataSource.GetLayerCount()

    def get_layer(self, layer_idx):
        return self.dataSource.GetLayer(layer_idx)

    def handle_layer(self, layer, geom_name, table_name):
        srs = self.get_SRS(layer)
        featureCount = layer.GetFeatureCount()
        layerDefinition = layer.GetLayerDefn()
        self._db = DB(self.db_conn_params)
        fields = self._get_layer_fields(layerDefinition)
        layer.ResetReading()
        feat = layer.GetNextFeature()
        feat_geom = feat.GetGeometryRef()
        coordinate_dimension = feat_geom.GetCoordinateDimension()
        layer.ResetReading()
        self._db.create_table(table_name, fields, geom_name, srs, coordinate_dimension)
        self.write_to_db(table_name, layer, srs, geom_name)

    def get_SRS(self, layer):
        if not layer.GetSpatialRef() == None:
            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 = self.default_epsg
            return epsg
        else:
            return self.default_epsg

    def _get_layer_fields(self, layerDefinition):
        fields = ''
        for i in range(layerDefinition.GetFieldCount()):
            fname = layerDefinition.GetFieldDefn(i).GetName()
            ftype = layerDefinition.GetFieldDefn(i).GetType()
            if ftype == 0:
                fields += ',' + (fname + ' ' + 'integer')
            elif ftype == 1:
                fields += ',' + (fname + ' ' + 'integer[]')
            elif ftype == 2:
                fields += ',' + (fname + ' ' + 'real')
            elif ftype == 3:
                fields += ',' + (fname + ' ' + 'real[]')
            elif ftype == 4:
                fields += ',"' + (fname + '" ' + 'varchar')
            elif ftype == 5:
                fields += ',"' + (fname + '" ' + 'varchar[]')
            elif ftype == 6:
                fields += ',' + (fname + ' ' + 'varchar')
            elif ftype == 7:
                fields += ',' + (fname + ' ' + 'varchar[]')
            elif ftype == 8:
                fields += ',' + (fname + ' ' + 'bytea')
            elif ftype == 9:
                fields += ',' + (fname + ' ' + 'date')
            elif ftype == 10:
                fields += ',' + (fname + ' ' + 'time without time zone')
            elif ftype == 11:
                fields += ',' + (fname + ' ' + 'timestamp without time zone')

        return fields

    def get_geometry_name(self, layer):
        geometry_names = []
        for feat in layer:
            if not feat:
                continue
            feat_geom = feat.GetGeometryRef().GetGeometryName()
            if feat_geom not in geometry_names:
                geometry_names.append(feat_geom)

        geometry_name = None
        if len(geometry_names) == 1:
            return geometry_names[0]
        if len(geometry_names) == 2:
            multi_geom = None
            simple_geom = None
            for gname in geometry_names:
                gname_upp = gname.upper()
                if 'MULTI' in gname_upp:
                    multi_geom = gname_upp
                else:
                    simple_geom = gname_upp

            if multi_geom and simple_geom:
                if multi_geom.split('MULTI')[1] == simple_geom:
                    self._check_for_conversion = True
                    geometry_name = multi_geom
                    return geometry_name
            else:
                return 'GEOMETRY'
        elif len(geometry_names) > 2:
            return 'GEOMETRY'

    def get_sample_data(self, layer):
        feat_data = {}
        layer.ResetReading()
        for feat in layer:
	    if not feat:
		continue

	    for y in range(feat.GetFieldCount()):
		layerDefinition = layer.GetLayerDefn()
		field_name = layerDefinition.GetFieldDefn(y).GetName()
		feat_data[field_name] = feat.GetField(y)

	    break
	return feat_data

    def write_to_db(self, table_name, layer, srs, layer_geom_name):
        i = 0
        for feat in layer:
            feature_fields = '%s,' % i
            i = i + 1
            if not feat:
                continue
            for y in range(feat.GetFieldCount()):
                if not feat.GetField(y) == None:
                    if layer.GetLayerDefn().GetFieldDefn(y).GetType() in (4, 9, 10, 11):
                        field_value = feat.GetField(y).decode(self.encoding, 'ignore').encode(db_encoding)
                        feature_fields += adapt(field_value).getquoted().decode(db_encoding) + ','
                    else:
                        feature_fields += str(feat.GetField(y)) + ','
                else:
                    feature_fields += 'NULL,'

            convert_to_multi = False
            if self._check_for_conversion:
                convert_to_multi = self.needs_conversion_to_multi(feat, layer_geom_name)
            self._db.insert_to_table(table_name, feature_fields, feat.GetGeometryRef(), convert_to_multi, srs)

        self._db.create_spatial_index(table_name)
        self._db.commit_and_close()

    def needs_conversion_to_multi(self, feat, layer_geom_name):
        if not feat.GetGeometryRef().GetGeometryName() == layer_geom_name:
            return True
        else:
            return False
def _delete_from_datastore(resource_id, db_conn_params, context):
    _db = DB(db_conn_params)
    _db.drop_table(resource_id)
    _db.commit_and_close()
class Vector:
    _check_for_conversion = False
    default_epsg = 4326
    gdal_driver = None

    def __init__(self,
                 gdal_driver,
                 file_path,
                 encoding=None,
                 db_conn_params=None):
        self.gdal_driver = gdal_driver
        self.encoding = encoding
        self.db_conn_params = db_conn_params
        driver = ogr.GetDriverByName(gdal_driver)
        self.dataSource = driver.Open(file_path, 0)
        if self.dataSource is None:
            raise 'Could not open %s' % file_path

    def get_layer_count(self):
        return self.dataSource.GetLayerCount()

    def get_layer(self, layer_idx):
        return self.dataSource.GetLayer(layer_idx)

    def handle_layer(self, layer, geom_name, table_name):
        srs = self.get_SRS(layer)
        featureCount = layer.GetFeatureCount()
        layerDefinition = layer.GetLayerDefn()
        self._db = DB(self.db_conn_params)
        fields = self._get_layer_fields(layerDefinition)
        layer.ResetReading()
        feat = layer.GetNextFeature()
        feat_geom = feat.GetGeometryRef()
        coordinate_dimension = feat_geom.GetCoordinateDimension()
        layer.ResetReading()
        self._db.create_table(table_name, fields, geom_name, srs,
                              coordinate_dimension)
        self.write_to_db(table_name, layer, srs, geom_name)

    def get_SRS(self, layer):
        if not layer.GetSpatialRef() == None:
            prj = layer.GetSpatialRef().ExportToWkt()
            srs_osr = osr.SpatialReference()
            srs_osr.ImportFromESRI([prj])
            epsg = srs_osr.GetAuthorityCode(None)
            if epsg is None or epsg == 0:
                srs_osr.AutoIdentifyEPSG()
                epsg = srs_osr.GetAuthorityCode(None)
                if epsg is None or epsg == 0:
                    epsg = self.default_epsg
            return epsg
        else:
            return self.default_epsg

    def _get_layer_fields(self, layerDefinition):
        fields = []
        for i in range(layerDefinition.GetFieldCount()):
            fname = layerDefinition.GetFieldDefn(i).GetName()
            ftype = layerDefinition.GetFieldDefn(i).GetType()
            # if ftype == 0:
            #     fields += ',' + (fname + ' ' + 'integer')
            # elif ftype == 1:
            #     fields += ',' + (fname + ' ' + 'integer[]')
            # elif ftype == 2:
            #     fields += ',' + (fname + ' ' + 'real')
            # elif ftype == 3:
            #     fields += ',' + (fname + ' ' + 'real[]')
            # elif ftype == 4:
            #     fields += ',"' + (fname + '" ' + 'varchar')
            # elif ftype == 5:
            #     fields += ',"' + (fname + '" ' + 'varchar[]')
            # elif ftype == 6:
            #     fields += ',' + (fname + ' ' + 'varchar')
            # elif ftype == 7:
            #     fields += ',' + (fname + ' ' + 'varchar[]')
            # elif ftype == 8:
            #     fields += ',' + (fname + ' ' + 'bytea')
            # elif ftype == 9:
            #     fields += ',' + (fname + ' ' + 'date')
            # elif ftype == 10:
            #     fields += ',' + (fname + ' ' + 'time without time zone')
            # elif ftype == 11:
            #     fields += ',' + (fname + ' ' + 'timestamp without time zone')
            field_map = {
                0: 'integer',
                1: 'integer[]',
                2: 'real',
                3: 'real[]',
                4: 'varchar',
                5: 'varchar[]',
                6: 'varchar',
                7: 'varchar[]',
                8: 'bytea',
                9: 'date',
                10: 'time without time zone',
                11: 'timestamp without time zone'
            }
            if ftype in field_map:
                fields.append('''"%s" %s''' % (fname, field_map[ftype]))
        return ", ".join(fields)

    def get_geometry_name(self, layer):
        geometry_names = []
        for feat in layer:
            if not feat or not feat.GetGeometryRef():
                continue
            feat_geom = feat.GetGeometryRef().GetGeometryName()
            if feat_geom not in geometry_names:
                geometry_names.append(feat_geom)

        geometry_name = None
        if len(geometry_names) == 1:
            return geometry_names[0]
        if len(geometry_names) == 2:
            multi_geom = None
            simple_geom = None
            for gname in geometry_names:
                gname_upp = gname.upper()
                if 'MULTI' in gname_upp:
                    multi_geom = gname_upp
                else:
                    simple_geom = gname_upp

            if multi_geom and simple_geom:
                if multi_geom.split('MULTI')[1] == simple_geom:
                    self._check_for_conversion = True
                    geometry_name = multi_geom
                    return geometry_name
            else:
                return 'GEOMETRY'
        elif len(geometry_names) > 2:
            return 'GEOMETRY'
        log.debug('No geometry name found, falling back to GEOMETRY')
        return 'GEOMETRY'

    def get_sample_data(self, layer):
        feat_data = {}
        layer.ResetReading()
        for feat in layer:
            if not feat:
                continue

            for y in range(feat.GetFieldCount()):
                layerDefinition = layer.GetLayerDefn()
                field_name = layerDefinition.GetFieldDefn(y).GetName()
                feat_data[field_name] = feat.GetField(y)

            break
        return feat_data

    def write_to_db(self, table_name, layer, srs, layer_geom_name):
        i = 0
        for feat in layer:
            feature_fields = '%s,' % i
            i = i + 1
            if not feat:
                continue
            for y in range(feat.GetFieldCount()):
                if not feat.GetField(y) == None:
                    if layer.GetLayerDefn().GetFieldDefn(y).GetType() in (4, 9,
                                                                          10,
                                                                          11):
                        field_value = feat.GetField(y).decode(
                            self.encoding, 'ignore').encode(db_encoding)
                        feature_fields += adapt(
                            field_value).getquoted().decode(db_encoding) + ','
                    else:
                        feature_fields += str(feat.GetField(y)) + ','
                else:
                    feature_fields += 'NULL,'

            convert_to_multi = False
            if self._check_for_conversion:
                convert_to_multi = self.needs_conversion_to_multi(
                    feat, layer_geom_name)
            self._db.insert_to_table(table_name, feature_fields,
                                     feat.GetGeometryRef(), convert_to_multi,
                                     srs)

        self._db.create_spatial_index(table_name)
        self._db.commit_and_close()

    def needs_conversion_to_multi(self, feat, layer_geom_name):
        try:
            if not feat.GetGeometryRef().GetGeometryName() == layer_geom_name:
                return True
            else:
                return False
        except AttributeError:
            log.debug("Feature does not have a Geometry")
            return True