예제 #1
0
def getParsedGeorefParams(job):
    if job.type == 'update':
        parsedGeorefParameter = ast.literal_eval(str(job.georefparams))['new']
    else:
        parsedGeorefParameter = ast.literal_eval(str(job.georefparams))
    epsg_code = int(str(parsedGeorefParameter['target']).split(':')[1])
    if parsedGeorefParameter['source'] == 'pixel' and epsg_code == 4314:
        return parseGcps(parsedGeorefParameter['gcps'])
    raise GeoreferenceProcessingError('Could not parse georeference parameter from georeference process %s ...'%job.id)
예제 #2
0
def processSingleGeorefProc(georefProc, dbsession, logger, testing=False):
    logger.debug('Process single georeference process with id %s ...' %
                 georefProc.id)

    # calculate georeference result
    logger.debug('Create persistent georeference result ...')
    messtischblatt = Messtischblatt.by_id(georefProc.messtischblattid,
                                          dbsession)
    if str(georefProc.type) == 'update':
        parsedGeorefParameter = ast.literal_eval(str(
            georefProc.clipparameter))['new']
    else:
        parsedGeorefParameter = ast.literal_eval(str(georefProc.clipparameter))

    epsg_code = int(str(parsedGeorefParameter['target']).split(':')[1])
    if parsedGeorefParameter['source'] == 'pixel' and epsg_code == 4314:
        gcps = parseGcps(parsedGeorefParameter['gcps'])
        clip_polygon = messtischblatt.BoundingBoxObj.asShapefile(
            os.path.join(TMP_DIR, messtischblatt.dateiname + 'clip_polygon'))
        destPath = georeference(
            messtischblatt.original_path,
            os.path.join(GEOREF_TARGET_DIR,
                         messtischblatt.dateiname + '.tif'), TMP_DIR, gcps,
            epsg_code, epsg_code, 'polynom', logger, clip_polygon)
        addOverviews(destPath, '2 4 8 16 32', logger)
        if destPath is None:
            logger.error(
                'Something went wrong while trying to process a georeference process.'
            )
            raise GeoreferenceProcessingError(
                'Something went wrong while trying to process a georeference process.'
            )

    if not testing:
        # push metadata to catalogue
        logger.debug(
            'Push metadata record for messtischblatt %s to cataloge service ...'
            % messtischblatt.id)
        insertMetadata(id=messtischblatt.id, db=dbsession, logger=logger)

    # update database
    logger.debug('Update database ...')

    # update verzeichnispfad for messtischblatt
    georefProc.processed = True
    messtischblatt.verzeichnispfad = destPath
    messtischblatt.isttransformiert = True
    refmtblayer = RefMtbLayer.by_id(MTB_LAYER_ID, messtischblatt.id, dbsession)
    if not refmtblayer:
        refmtblayer = RefMtbLayer(layer=MTB_LAYER_ID,
                                  messtischblatt=messtischblatt.id)
        dbsession.add(refmtblayer)
    dbsession.flush()

    return str(destPath)
예제 #3
0
def getParsedGeorefParams(job):
    if job.type == 'update':
        parsedGeorefParameter = ast.literal_eval(str(job.georefparams))['new']
    else:
        parsedGeorefParameter = ast.literal_eval(str(job.georefparams))
    epsg_code = int(str(parsedGeorefParameter['target']).split(':')[1])
    if parsedGeorefParameter['source'] == 'pixel' and epsg_code == 4314:
        return parseGcps(parsedGeorefParameter['gcps'])
    raise GeoreferenceProcessingError(
        'Could not parse georeference parameter from georeference process %s ...'
        % job.id)
예제 #4
0
def processSingleGeorefProc(georefProc, dbsession, logger, testing = False):
    logger.debug('Process single georeference process with id %s ...'%georefProc.id)
    
    # calculate georeference result 
    logger.debug('Create persistent georeference result ...')
    messtischblatt = Messtischblatt.by_id(georefProc.messtischblattid, dbsession)
    if str(georefProc.type) == 'update': 
        parsedGeorefParameter = ast.literal_eval(str(georefProc.clipparameter))['new']
    else:
        parsedGeorefParameter = ast.literal_eval(str(georefProc.clipparameter))
        
    epsg_code = int(str(parsedGeorefParameter['target']).split(':')[1])
    if parsedGeorefParameter['source'] == 'pixel' and epsg_code == 4314:
        gcps = parseGcps(parsedGeorefParameter['gcps'])
        clip_polygon = messtischblatt.BoundingBoxObj.asShapefile(os.path.join(TMP_DIR, messtischblatt.dateiname+'clip_polygon'))
        destPath = georeference(messtischblatt.original_path, os.path.join(GEOREF_TARGET_DIR,messtischblatt.dateiname+'.tif'), 
                         TMP_DIR, gcps, epsg_code, epsg_code, 'polynom', logger, clip_polygon)
        addOverviews(destPath, '2 4 8 16 32', logger)
        if destPath is None:
            logger.error('Something went wrong while trying to process a georeference process.')
            raise GeoreferenceProcessingError('Something went wrong while trying to process a georeference process.')
    
    if not testing:
        # push metadata to catalogue
        logger.debug('Push metadata record for messtischblatt %s to cataloge service ...'%messtischblatt.id)
        insertMetadata(id=messtischblatt.id,db=dbsession,logger=logger)
    
    # update database
    logger.debug('Update database ...')

    # update verzeichnispfad for messtischblatt
    georefProc.processed = True
    messtischblatt.verzeichnispfad = destPath
    messtischblatt.isttransformiert = True 
    refmtblayer = RefMtbLayer.by_id(MTB_LAYER_ID, messtischblatt.id, dbsession)
    if not refmtblayer:
        refmtblayer = RefMtbLayer(layer=MTB_LAYER_ID, messtischblatt=messtischblatt.id)
        dbsession.add(refmtblayer)
    dbsession.flush()   
        
    return str(destPath)
예제 #5
0
def georeferenceValidation(request):
    log.info('Receive request for processing georeference validation result')
    
    try:
        request_data = None
        if request.method == 'POST':
            request_data = request.json_body
            
        if request_data:
            validateId(request_data['id'])
            log.debug('Request data is valide: %s'%request_data)
            
        log.debug('Start creating validation result ...')
        messtischblatt = Messtischblatt.by_id(request_data['id'], request.db)
        # actual only support this option if target srs is EPSG:4314
        epsg_code = int(str(request_data['georeference']['target']).split(':')[1])
        if request_data['georeference']['source'] == 'pixel' and epsg_code == 4314:
            log.debug('Parse gcps ...')
            gcps = parseGcps(request_data['georeference']['gcps'])
            
            log.debug('Process georeference parameter ...')
            destPath = georeference(messtischblatt.original_path, os.path.join(GEOREFERENCE_MAPFILE_FOLDER,messtischblatt.dateiname+"::"+str(getUniqueId())+".vrt"), 
                         GEOREFERENCE_TMP_DIR, gcps, epsg_code, epsg_code, 'polynom', log)
        
            log.debug('Create temporary mapfile ...')
            wms_url = createMapfile(messtischblatt.dateiname, destPath, GEOREFERENCE_MAPFILE_TEMPLATE, GEOREFERENCE_MAPFILE_FOLDER, GEOREFERENCE_MAPFILE_DEFAULT_PARAMS)
            
            log.debug('Create response ...')  
            response = {'wms_url':wms_url,'layer_id':messtischblatt.dateiname,'extent':Messtischblatt.getExtent(messtischblatt.id, request.db)}
            return json.dumps(response, ensure_ascii=False, encoding='utf-8') 
        else:
            raise GeoreferenceParameterError('Wrong or missing service parameter')
    except GeoreferenceParameterError as e:
        message = 'Wrong or missing service parameter - %s'%e.value
        log.error(message)
        return HTTPBadRequest(message) 
    except Exception as e:
        message = 'Problems while computing validation result - %s'%e.value
        log.error(message)
        return HTTPInternalServerError(message)
예제 #6
0
def georeferenceValidation(request):
    log.info('Receive request for processing georeference validation result')
    
    try:
        request_data = None
        if request.method == 'POST':
            request_data = request.json_body
          
        mapObj = parseMapObjForId(request_data, 'id', request.db)
        log.debug('Id is valide: %s'%request_data)
                      
        log.debug('Start creating validation result ...')
        # actual only support this option if target srs is EPSG:4314
        epsg_code = int(str(request_data['georeference']['target']).split(':')[1])
        if request_data['georeference']['source'] == 'pixel' and epsg_code == 4314:
            log.debug('Parse gcps ...')
            gcps = parseGcps(request_data['georeference']['gcps'])
            
            log.debug('Process georeference parameter ...')
            destPath = georeference(mapObj.originalimage, os.path.join(GEOREFERENCE_MAPFILE_FOLDER,mapObj.apsdateiname+"::"+str(getUniqueId())+".vrt"), 
                         GEOREFERENCE_TMP_DIR, gcps, epsg_code, epsg_code, 'polynom', log)
        
            log.debug('Create temporary mapfile ...')
            wms_url = createMapfile(mapObj.apsdateiname, destPath, GEOREFERENCE_MAPFILE_TEMPLATE, GEOREFERENCE_MAPFILE_FOLDER, GEOREFERENCE_MAPFILE_DEFAULT_PARAMS)
            
            log.debug('Create response ...')  
            response = {'wms_url':wms_url,'layer_id':mapObj.apsdateiname,'extent':Map.getExtent(mapObj.id, request.db)}
            return response 
        else:
            raise GeoreferenceParameterError('Wrong or missing service parameter')
    except GeoreferenceParameterError as e:
        log.error(e)
        log.error(traceback.format_exc())
        raise HTTPBadRequest(ERROR_MSG) 
    except Exception as e:
        log.error(e)
        log.error(traceback.format_exc())
        raise HTTPInternalServerError(ERROR_MSG)