Example #1
0
def _get_feature_info_for_popup(request, params, isExtended=False, isIframe=False):
    feature, vector_model = next(_get_features(params))
    layerModel = get_bod_model(params.lang)
    # TODO Remove this ugly hack
    layer = next(get_layers_metadata_for_params(
        params,
        request.db.query(layerModel),
        layerModel,
        layerIds=[params.layerId if params.layerId != 'ch.bfs.gebaeude_wohnungs_register_preview' else 'ch.bfs.gebaeude_wohnungs_register']
    ))
    options = {}
    if 'feature' in feature:
        options.update(feature.pop('feature'))
    else:
        options.update(feature)

    # Regular html popup don't return a geometry
    if 'properties' in options:
        if hasattr(options, 'extra'):
            options['properties'].update(options['properties'].extra)
            options['bbox'] = options.extra['bbox']
        options['attributes'] = options.pop('properties')

    options.update({
        'featureId': options.get('featureId') or options.get('id'),  # For grid layer
        'attributes': options['attributes'],
        'scale': options.get('scale'),
        'attribution': layer.get('attributes')['dataOwner'],
        'fullName': layer.get('fullName'),
        'vector_model': vector_model,
        'isExtended': isExtended,
        'isIframe': isIframe
    })
    return options
Example #2
0
def legend(request):
    params = LayersParams(request)
    layerId = request.matchdict.get('layerId')
    model = get_bod_model(params.lang)
    query = params.request.db.query(model)
    layerMetadata = next(get_layers_metadata_for_params(
        params,
        query,
        model,
        layerIds=[layerId]
    ))
    # FIXME datenstand if not defined
    # should be available in view_bod_layer_info
    if 'attributes' in layerMetadata:
        if 'dataStatus' in layerMetadata['attributes']:
            status = layerMetadata['attributes']['dataStatus']
            if status == u'bgdi_created':
                layerMetadata['attributes']['dataStatus'] = params.translate('None') + params.translate('Datenstand')
    legend = {
        'layer': layerMetadata,
        'hasLegend': _has_legend(layerId, params.lang)
    }
    response = render_to_response(
        'chsdi:templates/legend.mako',
        {'legend': legend},
        request=request
    )
    if params.cbName is None:
        return response
    return response.body
Example #3
0
def _identify(request):
    params = _get_features_params(request)
    if params.layers == 'all':
        model = get_bod_model(params.lang)
        query = params.request.db.query(model)
        layerIds = []
        for layer in get_layers_metadata_for_params(params, query, model):
            layerIds.append(layer['layerBodId'])
    else:
        layerIds = params.layers
    models = [
        models_from_name(layerId) for layerId in layerIds
        if models_from_name(layerId) is not None
    ]
    if models is None:
        raise exc.HTTPBadRequest('No GeoTable was found for %s' %
                                 ' '.join(layerIds))

    maxFeatures = 50
    features = []
    for feature in _get_features_for_extent(params,
                                            models,
                                            maxFeatures=maxFeatures):
        f = _process_feature(feature, params)
        features.append(f)
        if len(features) > maxFeatures:
            break

    return {'results': features}
Example #4
0
def _identify(request):
    params = FeaturesParams(request)
    if params.layers == 'all':
        model = get_bod_model(params.lang)
        query = params.request.db.query(model)
        layerIds = []
        for layer in _get_layers_metadata_for_params(params, query, model):
            layerIds.append(layer['idBod'])
    else:
        layerIds = params.layers
    models = [
        models_from_name(layerId) for
        layerId in layerIds
        if models_from_name(layerId) is not None
    ]
    if models is None:
        raise exc.HTTPBadRequest('No GeoTable was found for %s' % ' '.join(layerIds))

    maxFeatures = 50
    features = []
    for feature in _get_features_for_extent(params, models, maxFeatures=maxFeatures):
        f = feature.__geo_interface__ if params.returnGeometry else feature.__interface__
        if hasattr(f, 'extra'):
            layerBodId = f.extra['layerBodId']
            f.extra['layerName'] = params.translate(layerBodId)
        else:
            layerBodId = f.get('layerBodId')
            f['layerName'] = params.translate(layerBodId)
        features.append(f)
        if len(features) > maxFeatures:
            break

    return {'results': features}
Example #5
0
def _identify(request):
    params = _get_features_params(request)
    if params.layers == 'all':
        model = get_bod_model(params.lang)
        query = params.request.db.query(model)
        layerIds = []
        for layer in get_layers_metadata_for_params(params, query, model):
            layerIds.append(layer['layerBodId'])
    else:
        layerIds = params.layers
    models = [
        models_from_name(layerId) for
        layerId in layerIds
        if models_from_name(layerId) is not None
    ]
    if models is None:
        raise exc.HTTPBadRequest('No GeoTable was found for %s' % ' '.join(layerIds))

    maxFeatures = 50
    features = []
    for feature in _get_features_for_extent(params, models, maxFeatures=maxFeatures):
        f = _process_feature(feature, params)
        features.append(f)
        if len(features) > maxFeatures:
            break

    return {'results': features}
Example #6
0
def legend(request):
    params = LayersParams(request)
    layerId = request.matchdict.get('layerId')
    model = get_bod_model(params.lang)
    query = params.request.db.query(model)
    layerMetadata = next(get_layers_metadata_for_params(
        params,
        query,
        model,
        layerIds=[layerId]
    ))
    # FIXME datenstand if not defined
    # should be available in view_bod_layer_info
    if 'attributes' in layerMetadata:
        if 'dataStatus' in layerMetadata['attributes']:
            status = layerMetadata['attributes']['dataStatus']
            if status == u'bgdi_created':
                layerMetadata['attributes']['dataStatus'] = params.translate('None') + params.translate('Datenstand')
    legend = {
        'layer': layerMetadata,
        'hasLegend': _has_legend(layerId, params.lang)
    }
    response = render_to_response(
        'chsdi:templates/legend.mako',
        {'legend': legend},
        request=request
    )
    if params.cbName is None:
        return response
    return response.body
Example #7
0
def extendedhtmlpopup(request):
    params = FeatureParams(request)
    params.returnGeometry = False
    models = models_from_name(params.layerId)
    if models is None:
        raise exc.HTTPBadRequest('No Vector Table was found for %s' % params.layerId)
    feature, template, hasExtendedInfo = _get_feature(
        params,
        models,
        params.layerId,
        params.featureId,
        extended=True)

    modelLayer = get_bod_model(params.lang)
    layer = next(_get_layers_metadata_for_params(
        params,
        request.db.query(modelLayer),
        modelLayer,
        layerIds=[params.layerId]
    ))
    feature.update({'attribution': layer.get('attributes')['dataOwner']})
    feature.update({'fullName': layer.get('fullName')})
    feature.update({'extended': True})
    response = render_to_response(
        template,
        {
            'feature': feature,
            'hasExtendedInfo': hasExtendedInfo
        },
        request=request)
    if params.cbName is None:
        return response
    return response.body
Example #8
0
 def metadata(self):
     model = get_bod_model(self.lang)
     results = computeHeader(self.mapName)
     query = self.request.db.query(model).filter(model.maps.ilike('%%%s%%' % self.mapName))
     query = self._geodata_staging_filter(query, model.staging)
     query = self._full_text_search(query, [model.fullTextSearch])
     layers = [layer.layerMetadata() for layer in query]
     results['layers'].append(layers)
     return results
Example #9
0
 def _get_layer_list_from_map(self):
     model = get_bod_model(self.lang)
     query = self.request.db.query(model)
     query = self._map_name_filter(query, model.maps)
     # only return layers which have geometries
     layerList = [
         q.idBod for
         q in query
         if models_from_name(q.idBod) is not None
     ]
     return layerList
Example #10
0
def metadata(request):
    params = LayersParams(request)
    model = get_bod_model(params.lang)
    query = params.request.db.query(model)
    query = _filter_on_chargeable_attr(params, query, model)
    if params.searchText is not None:
        query = full_text_search(query, [model.fullTextSearch, model.layerBodId, model.idGeoCat], params.searchText)
    results = computeHeader(params.mapName)
    for layer in get_layers_metadata_for_params(params, query, model):
        results["layers"].append(layer)
    return results
Example #11
0
 def _get_layer_list_from_map(self):
     model = get_bod_model(self.lang)
     query = self.request.db.query(model).filter(
         model.maps.ilike('%%%s%%' % self.mapName)
     )
     # only return layers which have a model
     layerList = [
         q.idBod for
         q in query
         if models_from_name(q.idBod) is not None
     ]
     return layerList
Example #12
0
def _identify(request):
    params = IdentifyServiceValidation(request)
    response = {'results': []}
    # Determine layer types
    # Grid layers are serverless
    layersDB = []
    layersGrid = []
    isScaleDependent = has_buffer(params.imageDisplay, params.mapExtent,
                                  params.tolerance)
    scale = get_scale(params.imageDisplay,
                      params.mapExtent) if isScaleDependent else None
    if params.layers == 'all':
        model = get_bod_model(params.lang)
        query = params.request.db.query(model)
        for layer in get_layers_metadata_for_params(params, query, model):
            layerBodId = layer['layerBodId']
            models = models_from_bodid(layerBodId,
                                       scale=scale,
                                       srid=params.srid)
            if models:
                layersDB.append({layerBodId: models})
            else:
                gridSpec = get_grid_spec(layerBodId)
                if gridSpec and params.geometryType == 'esriGeometryPoint':
                    layersGrid.append({layerBodId: gridSpec})
    else:
        for layerBodId in params.layers:
            gridSpec = get_grid_spec(layerBodId)
            if gridSpec:
                if params.geometryType not in ('esriGeometryPoint',
                                               'esriGeometryEnvelope'):
                    raise exc.HTTPBadRequest(
                        'Only esriGeometryPoint or esriGeometryEnvelope'
                        'are supported for geometryType parameter for grid like data'
                    )
                layersGrid.append({layerBodId: gridSpec})
            else:
                models = models_from_bodid(layerBodId,
                                           scale=scale,
                                           srid=params.srid)
                # The layer has a model but not at the right scale
                if models is not None and len(models) == 0:
                    return response
                # There is no model for this layer
                elif models is None:
                    raise exc.HTTPBadRequest('No GeoTable was found for %s' %
                                             layerBodId)
                layersDB.append({layerBodId: models})
    featuresGrid = _identify_grid(params, layersGrid)
    featuresDB = _identify_db(params, layersDB)
    response['results'] = featuresGrid + featuresDB
    return response
Example #13
0
def metadata(request):
    params = BaseLayersValidation(request)
    model = get_bod_model(params.lang)
    query = params.request.db.query(model)
    query = _filter_on_chargeable_attr(params, query, model)
    if params.searchText is not None:
        query = full_text_search(
            query, [model.fullTextSearch, model.layerBodId, model.idGeoCat],
            params.searchText)
    results = computeHeader(params.mapName, params.srid)
    for layer in get_layers_metadata_for_params(params, query, model):
        results['layers'].append(layer)
    return results
Example #14
0
 def getlegend(self):
     from pyramid.renderers import render_to_response
     idlayer = self.request.matchdict.get('idlayer')
     model = get_bod_model(self.lang)
     query = self.request.db.query(model).filter(model.maps.ilike('%%%s%%' % self.mapName))
     query = query.filter(model.idBod==idlayer)
     for layer in query:
         legend = {'layer': layer.layerMetadata()}
     response = render_to_response('chsdi:templates/legend.mako', legend, request = self.request)
     if self.cbName is None:
         return response 
     else:
         return response.body
Example #15
0
 def mapservice(self):
     model = get_bod_model(self.lang)
     results = computeHeader(self.mapName)
     query = self.request.db.query(model)
     query = self._map_name_filter(query, model.maps)
     query = self._geodata_staging_filter(query, model.staging)
     query = self._full_text_search(query, [
         model.fullTextSearch,
         model.idBod,
         model.idGeoCat
     ])
     for q in query:
         layer = q.layerMetadata()
         results['layers'].append(layer)
     return results
Example #16
0
    def _get_layer_resource(self, idlayer):
        model = get_bod_model(self.lang)
        query = self.request.db.query(model)
        query = self._map_name_filter(query, model.maps)
        query = query.filter(model.idBod == idlayer)

        try:
            layer = query.one()
        except NoResultFound:
            raise exc.HTTPNotFound('No layer with id %s' % idlayer)
        except MultipleResultsFound:
            raise exc.HTTPInternalServerError()

        layer = layer.layerMetadata()

        return layer
Example #17
0
def legend(request):
    params = LayersParams(request)
    layerId = request.matchdict.get("layerId")
    model = get_bod_model(params.lang)
    query = params.request.db.query(model)
    layerMetadata = next(get_layers_metadata_for_params(params, query, model, layerIds=[layerId]))
    # FIXME datenstand if not defined
    # should be available in view_bod_layer_info
    if "attributes" in layerMetadata:
        if "dataStatus" in layerMetadata["attributes"]:
            status = layerMetadata["attributes"]["dataStatus"]
            if status == u"bgdi_created":
                layerMetadata["attributes"]["dataStatus"] = params.translate("None") + params.translate("Datenstand")
    legend = {"layer": layerMetadata, "hasLegend": _has_legend(layerId, params.lang)}
    response = render_to_response("chsdi:templates/legend.mako", {"legend": legend}, request=request)
    if params.cbName is None:
        return response
    return response.body
Example #18
0
def _get_feature_info_for_popup(request,
                                params,
                                isExtended=False,
                                isIframe=False):
    feature, vector_model = next(_get_features(params))
    layerModel = get_bod_model(params.lang)
    # TODO Remove this ugly hack
    layer = next(
        get_layers_metadata_for_params(
            params,
            request.db.query(layerModel),
            layerModel,
            layerIds=[
                params.layerId if
                params.layerId != 'ch.bfs.gebaeude_wohnungs_register_preview'
                else 'ch.bfs.gebaeude_wohnungs_register'
            ]))
    options = {}
    if 'feature' in feature:
        options.update(feature.pop('feature'))
    else:
        options.update(feature)

    # Regular html popup don't return a geometry
    if 'properties' in options:
        if hasattr(options, 'extra'):
            options['properties'].update(options['properties'].extra)
            options['bbox'] = options.extra['bbox']
        options['attributes'] = options.pop('properties')

    options.update({
        'featureId': options.get('featureId')
        or options.get('id'),  # For grid layer
        'attributes': options['attributes'],
        'scale': options.get('scale'),
        'attribution': layer.get('attributes')['dataOwner'],
        'fullName': layer.get('fullName'),
        'vector_model': vector_model,
        'isExtended': isExtended,
        'isIframe': isIframe,
        'time': params.time
    })
    return options
Example #19
0
def _identify(request):
    params = IdentifyServiceValidation(request)
    response = {'results': []}
    # Determine layer types
    # Grid layers are serverless
    layersDB = []
    layersGrid = []
    isScaleDependent = has_buffer(params.imageDisplay, params.mapExtent, params.tolerance)
    scale = get_scale(params.imageDisplay, params.mapExtent) if isScaleDependent else None
    if params.layers == 'all':
        model = get_bod_model(params.lang)
        query = params.request.db.query(model)
        for layer in get_layers_metadata_for_params(params, query, model):
            layerBodId = layer['layerBodId']
            models = models_from_bodid(layerBodId, scale=scale, srid=params.srid)
            if models:
                layersDB.append({layerBodId: models})
            else:
                gridSpec = get_grid_spec(layerBodId)
                if gridSpec and params.geometryType == 'esriGeometryPoint':
                    layersGrid.append({layerBodId: gridSpec})
    else:
        for layerBodId in params.layers:
            gridSpec = get_grid_spec(layerBodId)
            if gridSpec:
                if params.geometryType not in ('esriGeometryPoint', 'esriGeometryEnvelope'):
                    raise exc.HTTPBadRequest(
                        'Only esriGeometryPoint or esriGeometryEnvelope'
                        'are supported for geometryType parameter for grid like data')
                layersGrid.append({layerBodId: gridSpec})
            else:
                models = models_from_bodid(layerBodId, scale=scale, srid=params.srid)
                # The layer has a model but not at the right scale
                if models is not None and len(models) == 0:
                    return response
                # There is no model for this layer
                elif models is None:
                    raise exc.HTTPBadRequest('No GeoTable was found for %s' % layerBodId)
                layersDB.append({layerBodId: models})
    featuresGrid = _identify_grid(params, layersGrid)
    featuresDB = _identify_db(params, layersDB)
    response['results'] = featuresGrid + featuresDB
    return response
Example #20
0
def _identify(request):
    params = _get_features_params(request)

    if params.layers == 'all':
        model = get_bod_model(params.lang)
        query = params.request.db.query(model)
        layerIds = []
        for layer in get_layers_metadata_for_params(params, query, model):
            layerIds.append(layer['layerBodId'])
    else:
        layerIds = params.layers

    models = [
        models_from_bodid(layerId) for layerId in layerIds
        if models_from_bodid(layerId) is not None
    ]
    if models is None:
        raise exc.HTTPBadRequest('No GeoTable was found for %s' %
                                 ' '.join(layerIds))

    maxFeatures = 201
    features = []
    feature_gen = _get_features_for_filters(params,
                                            models,
                                            maxFeatures=maxFeatures,
                                            where=params.where)
    while True:
        try:
            feature = next(feature_gen)
        except InternalError as e:
            raise exc.HTTPBadRequest(
                'Your request generated the following database error: %s' % e)
        except StopIteration:
            break
        else:
            f = _process_feature(feature, params)
            features.append(f)

            if len(features) >= maxFeatures:
                break

    return {'results': features}
Example #21
0
def extendedhtmlpopup(request):
    params = _get_feature_params(request)
    params.returnGeometry = True
    feature, vectorModel = next(_get_features(params))

    layerModel = get_bod_model(params.lang)
    layer = next(
        get_layers_metadata_for_params(params,
                                       request.db.query(layerModel),
                                       layerModel,
                                       layerIds=[params.layerId]))
    feature.update({'attribution': layer.get('attributes')['dataOwner']})
    feature.update({'fullName': layer.get('fullName')})
    feature.update({'extended': True})

    response = _render_feature_template(vectorModel, feature, request, True)

    if params.cbName is None:
        return response
    return response.body
Example #22
0
def extendedhtmlpopup(request):
    params = _get_feature_params(request)
    params.returnGeometry = True
    feature, vectorModel = next(_get_features(params))

    layerModel = get_bod_model(params.lang)
    layer = next(get_layers_metadata_for_params(
        params,
        request.db.query(layerModel),
        layerModel,
        layerIds=[params.layerId]
    ))
    feature.update({'attribution': layer.get('attributes')['dataOwner']})
    feature.update({'fullName': layer.get('fullName')})
    feature.update({'extended': True})

    response = _render_feature_template(vectorModel, feature, request, True)

    if params.cbName is None:
        return response
    return response.body
Example #23
0
def _identify(request):
    params = _get_features_params(request)

    if params.layers == 'all':
        model = get_bod_model(params.lang)
        query = params.request.db.query(model)
        layerIds = []
        for layer in get_layers_metadata_for_params(params, query, model):
            layerIds.append(layer['layerBodId'])
    else:
        layerIds = params.layers

    models = [
        models_from_bodid(layerId) for
        layerId in layerIds
        if models_from_bodid(layerId) is not None
    ]
    if models is None:
        raise exc.HTTPBadRequest('No GeoTable was found for %s' % ' '.join(layerIds))

    maxFeatures = 201
    features = []
    feature_gen = _get_features_for_filters(params, models, maxFeatures=maxFeatures, where=params.where)
    while True:
        try:
            feature = next(feature_gen)
        except InternalError as e:
            raise exc.HTTPBadRequest('Your request generated the following database error: %s' % e)
        except StopIteration:
            break
        else:
            f = _process_feature(feature, params)
            features.append(f)

            if len(features) >= maxFeatures:
                break

    return {'results': features}
Example #24
0
def legend(request):
    params = LayersParams(request)
    layerId = request.matchdict.get('layerId')
    model = get_bod_model(params.lang)
    layerMetadata = next(
        _get_layers_metadata_for_params(
            params,
            params.request.db.query(model),
            model,
            layerIds=[layerId]
        ))
    legends_dir = os.path.join(os.path.dirname(__file__), '../static/images/legends')
    image = "%s_%s.png" % (layerId, params.lang)
    image_full_path = os.path.abspath(os.path.join(legends_dir, image))
    hasLegend = os.path.exists(image_full_path)

    # FIXME datenstand if not defined
    # should be available in view_bod_layer_info
    if 'attributes' in layerMetadata.keys():
        if 'dataStatus' in layerMetadata['attributes'].keys():
            status = layerMetadata['attributes']['dataStatus']
            if status == u'bgdi_created':
                layerMetadata['attributes']['dataStatus'] = params.translate('None') + params.translate('Datenstand')

    legend = {
        'layer': layerMetadata,
        'hasLegend': hasLegend
    }
    response = render_to_response(
        'chsdi:templates/legend.mako',
        {
            'legend': legend
        },
        request=request
    )
    if params.cbName is None:
        return response
    return response.body