def service_id(vlayer_id, ngw_resource_group): with transaction.manager: res_wfs = WFSService( parent_id=ngw_resource_group, display_name='test_cyrillic_service', owner_user=User.by_keyname('administrator'), ).persist() res_wfs.layers.append( WFSLayer( resource_id=vlayer_id, keyname='test', display_name='test', maxfeatures=1000, )) DBSession.flush() DBSession.expunge(res_wfs) yield res_wfs.id with transaction.manager: DBSession.delete(WFSService.filter_by(id=res_wfs.id).one())
def service_id(ngw_resource_group): with transaction.manager: res_vl = VectorLayer( parent_id=ngw_resource_group, display_name='test_vector_layer', owner_user=User.by_keyname('administrator'), srs=SRS.filter_by(id=3857).one(), tbl_uuid=six.text_type(uuid4().hex), ).persist() geojson = { 'type': 'FeatureCollection', 'crs': { 'type': 'name', 'properties': { 'name': 'urn:ogc:def:crs:EPSG::3857' } }, 'features': [{ 'type': 'Feature', 'properties': { 'name': 'feature1' }, 'geometry': { 'type': 'Point', 'coordinates': [0, 0] } }, { 'type': 'Feature', 'properties': { 'price': -1 }, 'geometry': { 'type': 'Point', 'coordinates': [10, 10] } }] } dsource = ogr.Open(json.dumps(geojson)) layer = dsource.GetLayer(0) res_vl.setup_from_ogr(layer, lambda x: x) res_vl.load_from_ogr(layer, lambda x: x) DBSession.flush() res_wfs = WFSService( parent_id=ngw_resource_group, display_name='test_wfsserver_service', owner_user=User.by_keyname('administrator'), ).persist() res_wfs.layers.append( WFSLayer( resource=res_vl, keyname='test', display_name='test', maxfeatures=1000, )) DBSession.flush() DBSession.expunge(res_vl) DBSession.expunge(res_wfs) yield res_wfs.id with transaction.manager: DBSession.delete(VectorLayer.filter_by(id=res_vl.id).one()) DBSession.delete(WFSService.filter_by(id=res_wfs.id).one())
def vector_layer_id(ngw_resource_group): with transaction.manager: 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() geojson = { "type": "FeatureCollection", "name": "polygon_extent", "crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:EPSG::3857" } }, "features": [ { "type": "Feature", "properties": { "name": "west" }, "geometry": { "type": "Polygon", "coordinates": [[ [5542180, 8799167], [6191082, 7551279], [4668659, 7126998], [5542180, 8799167], ]], }, }, { "type": "Feature", "properties": { "name": "east" }, "geometry": { "type": "Polygon", "coordinates": [[ [15100999, 10396463], [16498633, 10546209], [16673337, 9223449], [15175872, 8948913], [15100999, 10396463], ]], }, }, ], } dsource = ogr.Open(json.dumps(geojson)) layer = dsource.GetLayer(0) obj.setup_from_ogr(layer, lambda x: x) obj.load_from_ogr(layer, lambda x: x) DBSession.flush() DBSession.expunge(obj) yield obj.id with transaction.manager: DBSession.delete(VectorLayer.filter_by(id=obj.id).one())
def create_feature_layer(ogrlayer, parent_id, **kwargs): opts_db = env.core.options.with_prefix('test.database') for o in ('host', 'name', 'user'): if o not in opts_db: pytest.skip(f"Option test.database.{o} isn't set") con_args = dict(host=opts_db['host'], port=opts_db['port'], database=opts_db['name'], username=opts_db['user'], password=opts_db['password']) engine_url = make_engine_url( EngineURL.create('postgresql+psycopg2', **con_args)) engine = sa.create_engine(engine_url) meta = sa.MetaData() column_id = 'id' columns = [sa.Column(column_id, sa.Integer, primary_key=True)] column_geom = 'the_geom' geom_type = _GEOM_OGR_2_TYPE[ogrlayer.GetGeomType()] dimension = 3 if geom_type in GEOM_TYPE.has_z else 2 geometry_type_db = _GEOM_TYPE_2_DB[geom_type] osr_ = ogrlayer.GetSpatialRef() assert osr_.GetAuthorityName(None) == 'EPSG' srid = int(osr_.GetAuthorityCode(None)) columns.append( sa.Column( column_geom, ga.Geometry(dimension=dimension, srid=srid, geometry_type=geometry_type_db))) # Make columns different from keynames def column_keyname(name): return name[4:] def keyname_column(keyname): return 'fld_%s' % keyname defn = ogrlayer.GetLayerDefn() for i in range(defn.GetFieldCount()): fld_defn = defn.GetFieldDefn(i) fld_name = fld_defn.GetNameRef() fld_type = _FIELD_TYPE_2_ENUM[fld_defn.GetType()] columns.append( sa.Column(keyname_column(fld_name), _FIELD_TYPE_2_DB[fld_type])) table = sa.Table('test_' + uuid4().hex, meta, *columns) meta.create_all(engine) with engine.connect() as conn: with conn.begin(): for i, feature in enumerate(ogrlayer, start=1): values = dict(id=i) geom = feature.GetGeometryRef() geom_bytes = bytearray(geom.ExportToWkb(ogr.wkbNDR)) values[column_geom] = ga.elements.WKBElement(geom_bytes, srid=srid) for k in range(feature.GetFieldCount()): if not feature.IsFieldSet(k) or feature.IsFieldNull(k): continue fld_defn = defn.GetFieldDefn(k) fld_name = fld_defn.GetNameRef() fld_get = FIELD_GETTER[fld_defn.GetType()] values[keyname_column(fld_name)] = fld_get(feature, k) conn.execute(table.insert().values(**values)) with transaction.manager: res_common = dict(parent_id=parent_id, owner_user=User.by_keyname('administrator')) connection = PostgisConnection(**res_common, display_name='PostGIS connection', hostname=opts_db['host'], port=opts_db['port'], database=opts_db['name'], username=opts_db['user'], password=opts_db['password']).persist() layer = PostgisLayer( **res_common, display_name='Feature layer (postgis)', connection=connection, srs=SRS.filter_by(id=3857).one(), table=table.name, schema='public', column_id=column_id, column_geom=column_geom, geometry_type=geom_type, geometry_srid=srid, ).persist() DBSession.flush() layer.setup() for field in layer.fields: field.keyname = field.display_name = column_keyname( field.column_name) try: yield layer finally: meta.drop_all(engine) engine.dispose()
def service(ngw_resource_group): with transaction.manager: vl_type = VectorLayer( parent_id=ngw_resource_group, display_name='type', owner_user=User.by_keyname('administrator'), srs=SRS.filter_by(id=3857).one(), tbl_uuid=six.text_type(uuid4().hex), ).persist() dsource = type_geojson_dataset('type.geojson') layer = dsource.GetLayer(0) vl_type.setup_from_ogr(layer, lambda x: x) vl_type.load_from_ogr(layer, lambda x: x) DBSession.flush() # NOTE: GDAL doesn't support time fields in GML / WFS. It completely breaks # XSD schema parsing. Delete the time field to pass tests. DBSession.delete(vl_type.field_by_keyname('time')) vl_pointz = VectorLayer( parent_id=ngw_resource_group, display_name='pointz', owner_user=User.by_keyname('administrator'), srs=SRS.filter_by(id=3857).one(), tbl_uuid=six.text_type(uuid4().hex), ).persist() dsource = type_geojson_dataset('pointz.geojson') layer = dsource.GetLayer(0) vl_pointz.setup_from_ogr(layer, lambda x: x) vl_pointz.load_from_ogr(layer, lambda x: x) DBSession.flush() res_wfs = WFSService( parent_id=ngw_resource_group, display_name='test_wfsserver_service', owner_user=User.by_keyname('administrator'), ).persist() res_wfs.layers.extend(( WFSLayer(resource=vl_type, keyname='type', display_name='type', maxfeatures=1000), WFSLayer(resource=vl_pointz, keyname='pointz', display_name='pointz', maxfeatures=1000), )) DBSession.flush() DBSession.expunge(vl_type) DBSession.expunge(vl_pointz) DBSession.expunge(res_wfs) yield res_wfs.id with transaction.manager: DBSession.delete(VectorLayer.filter_by(id=vl_type.id).one()) DBSession.delete(VectorLayer.filter_by(id=vl_pointz.id).one()) DBSession.delete(WFSService.filter_by(id=res_wfs.id).one())