Ejemplo n.º 1
0
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())
Ejemplo n.º 2
0
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())
Ejemplo n.º 3
0
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())
Ejemplo n.º 4
0
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()
Ejemplo n.º 5
0
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())