def test_from_ogr(data, ngw_resource_group, ngw_txn): src = os.path.join(DATA_PATH, data) dsource = ogr.Open('/vsizip/' + src) layer = dsource.GetLayer(0) res = VectorLayer( parent_id=ngw_resource_group, display_name='from_ogr', owner_user=User.by_keyname('administrator'), srs=SRS.filter_by(id=3857).one(), tbl_uuid=six.text_type(uuid4().hex), ) res.persist() res.setup_from_ogr(layer, lambda x: x) res.load_from_ogr(layer, lambda x: x) DBSession.flush() features = list(res.feature_query()()) assert len(features) == 1 feature = features[0] assert feature.id == 1 fields = feature.fields assert fields['int'] == -1 # TODO: Date, time and datetime tests fails on shapefile # assert fields['date'] == date(2001, 1, 1) # assert fields['time'] == time(23, 59, 59) # assert fields['datetime'] == datetime(2001, 1, 1, 23, 59, 0) assert fields['string'] == "Foo bar" assert fields[ 'unicode'] == 'Значимость этих проблем настолько очевидна, что реализация намеченных плановых заданий требуют определения и уточнения.' # NOQA: E501
def test_id_field(data, ngw_resource_group): res = VectorLayer(parent_id=ngw_resource_group, display_name=f'test-{data}', owner_user=User.by_keyname('administrator'), srs=SRS.filter_by(id=3857).one(), tbl_uuid=uuid4().hex).persist() src = os.path.join(DATA_PATH, f'{data}.geojson') ds = ogr.Open(src) layer = ds.GetLayer(0) with pytest.raises(ValidationError): res.setup_from_ogr(layer) fid_params = dict(fid_source=FID_SOURCE.FIELD, fid_field=['id']) with pytest.raises(ValidationError): res.setup_from_ogr(layer, fid_params=fid_params) res.setup_from_ogr(layer, fix_errors=ERROR_FIX.SAFE, fid_params=fid_params) res.load_from_ogr(layer) DBSession.flush() query = res.feature_query() feature = query().one() assert feature.id == 1 assert list(feature.fields.keys()) == ['id_1']
def test_fid(fid_source, fid_field, id_expect, ngw_resource_group, ngw_txn): src = Path(__file__).parent / 'data' / 'type.geojson' dataset = ogr.Open(str(src)) assert dataset is not None, gdal.GetLastErrorMsg() layer = dataset.GetLayer(0) assert layer is not None, gdal.GetLastErrorMsg() res = VectorLayer(parent_id=ngw_resource_group, display_name='test_fid', owner_user=User.by_keyname('administrator'), srs=SRS.filter_by(id=3857).one(), tbl_uuid=uuid4().hex) res.persist() res.setup_from_ogr(layer, fid_params=dict(fid_source=fid_source, fid_field=fid_field)) res.load_from_ogr(layer) DBSession.flush() query = res.feature_query() query.filter_by(id=id_expect) assert query().total_count == 1
def test_create(filename, options, checks, ngw_resource_group, ngw_txn): obj = VectorLayer(parent_id=ngw_resource_group, display_name='vector_layer', owner_user=User.by_keyname('administrator'), srs=SRS.filter_by(id=3857).one(), tbl_uuid=six.text_type(uuid4().hex)).persist() src = str(path / filename) ds = ogr.Open(src) layer = ds.GetLayer(0) geom_cast_params = dict(geometry_type=options.get('geometry_type'), is_multi=options.get('is_multi'), has_z=options.get('has_z')) def setup_and_load(): setup_kwargs = dict() load_kwargs = dict() if 'skip_other_geometry_types' in options: setup_kwargs['skip_other_geometry_types'] = options[ 'skip_other_geometry_types'] load_kwargs['skip_other_geometry_types'] = options[ 'skip_other_geometry_types'] if 'fix_errors' in options: load_kwargs['fix_errors'] = options['fix_errors'] if 'skip_errors' in options: load_kwargs['skip_errors'] = options['skip_errors'] obj.setup_from_ogr(layer, geom_cast_params=geom_cast_params, **setup_kwargs) obj.load_from_ogr(layer, **load_kwargs) if 'exception' in checks: with pytest.raises(checks['exception']): setup_and_load() DBSession.expunge(obj) else: setup_and_load() DBSession.flush() if 'geometry_type' in checks: exp_geometry_type = checks['geometry_type'] assert obj.geometry_type == exp_geometry_type, \ "Expected geometry type was {} but actually got {}".format( exp_geometry_type, obj.geometry_type) if 'feature_count' in checks: exp_feature_count = checks['feature_count'] query = obj.feature_query() feature_count = query().total_count assert feature_count == exp_feature_count, \ "Expected feature count was {} but got {}".format( exp_feature_count, feature_count)
def test_type_geojson(ngw_resource_group, ngw_txn): src = Path(__file__).parent / 'data' / 'type.geojson' dataset = ogr.Open(str(src)) assert dataset is not None, gdal.GetLastErrorMsg() layer = dataset.GetLayer(0) assert layer is not None, gdal.GetLastErrorMsg() res = VectorLayer(parent_id=ngw_resource_group, display_name='from_ogr', owner_user=User.by_keyname('administrator'), srs=SRS.filter_by(id=3857).one(), tbl_uuid=six.text_type(uuid4().hex)) res.persist() res.setup_from_ogr(layer, lambda x: x) res.load_from_ogr(layer, lambda x: x) layer.ResetReading() DBSession.flush() def field_as(f, n, t): fidx = f.GetFieldIndex(n) if f.IsFieldNull(fidx): return None attr = getattr(f, 'GetFieldAs' + t) result = attr(fidx) if t in ('Date', 'Time', 'DateTime'): result = [int(v) for v in result] if t == 'String' and six.PY2: result = result.decode('utf-8') return result for feat, ref in zip(res.feature_query()(), layer): fields = feat.fields assert fields['null'] == field_as(ref, 'null', None) assert fields['int'] == field_as(ref, 'int', 'Integer') assert fields['real'] == field_as(ref, 'real', 'Double') assert fields['date'] == date(*field_as(ref, 'date', 'DateTime')[0:3]) assert fields['time'] == time(*field_as(ref, 'time', 'DateTime')[3:6]) assert fields['datetime'] == datetime( *field_as(ref, 'datetime', 'DateTime')[0:6]) assert fields['string'] == field_as(ref, 'string', 'String') assert fields['unicode'] == field_as(ref, 'unicode', 'String')
def test_geom_field(ngw_resource_group): res = VectorLayer(parent_id=ngw_resource_group, display_name='test-geom-fld', owner_user=User.by_keyname('administrator'), srs=SRS.filter_by(id=3857).one(), tbl_uuid=uuid4().hex).persist() src = os.path.join(DATA_PATH, 'geom-fld.geojson') ds = ogr.Open(src) layer = ds.GetLayer(0) with pytest.raises(ValidationError): res.setup_from_ogr(layer) res.setup_from_ogr(layer, fix_errors=ERROR_FIX.SAFE) res.load_from_ogr(layer) DBSession.flush() query = res.feature_query() feature = query().one() assert feature.id == 1 assert list(feature.fields.keys()) == ['geom_1']
def test_error_limit(ngw_resource_group): res = VectorLayer(parent_id=ngw_resource_group, display_name='error-limit', owner_user=User.by_keyname('administrator'), srs=SRS.filter_by(id=3857).one(), tbl_uuid=uuid4().hex) res.persist() ds = ogr.GetDriverByName('Memory').CreateDataSource('') srs = osr.SpatialReference() srs.ImportFromEPSG(4326) layer = ds.CreateLayer('layer_with_errors', srs=srs, geom_type=ogr.wkbPoint) defn = layer.GetLayerDefn() some = 3 for i in range(error_limit + some): feature = ogr.Feature(defn) if i < error_limit: feature.SetGeometry(None) else: feature.SetGeometry(ogr.CreateGeometryFromWkt('POINT (0 0)')) layer.CreateFeature(feature) res.setup_from_ogr(layer) opts = dict(fix_errors=ERROR_FIX.NONE, skip_other_geometry_types=False) with pytest.raises(ValidationError) as excinfo: res.load_from_ogr(layer, **opts, skip_errors=False) assert excinfo.value.detail is not None res.load_from_ogr(layer, **opts, skip_errors=True) DBSession.flush() assert res.feature_query()().total_count == some