def getPage_profileMtb(request): try: messtischblatt_id = None if 'id' in request.params: messtischblatt_id = request.params['id'] log.info('Receive get profile mtb page for id %s.' % messtischblatt_id) messtischblatt = Messtischblatt.by_id(messtischblatt_id, request.db) user_id = authenticated_userid(request) if user_id: groups = groupfinder(user_id, request) if groups and 'g:moderator' in groups or 'g:admin' in groups: return { 'with_modify': True, 'zoomify_prop': messtischblatt.zoomify_properties, 'zoomify_width': messtischblatt.zoomify_width, 'zoomify_height': messtischblatt.zoomify_height, 'key': messtischblatt.dateiname } return { 'zoomify_prop': messtischblatt.zoomify_properties, 'zoomify_width': messtischblatt.zoomify_width, 'zoomify_height': messtischblatt.zoomify_height, 'key': messtischblatt.dateiname } except: log.error( 'Internal server error while trying to get profile page. Please try again or contact the page administrator.' ) raise InternalAuthentificationError( 'Internal server error while trying to get profile page. Please try again or contact the page administrator.' )
def updateDataSources(dbsession, database_params, vrt_target_dir, tmp_dir, cache_dir, logger, testing = True): logger.info('Get georeference processing queue ...') processingQueue = getGeoreferenceProcessQueue(dbsession, logger) logger.info('Reset objects ...') for objectId in processingQueue['reset']: logger.info('Reset object with id %s ...'%objectId) resetMapObject(objectId, dbsession, logger, testing) logger.info('Update single georeferencing ...') for timestamp in processingQueue['georeference']: logger.info('Update timestamps %s ...'%timestamp) for georefProcess in processingQueue['georeference'][timestamp]: logger.info('Update georeferencing for objectid %s ...'%georefProcess.messtischblattid) processSingleGeorefProc(georefProcess, dbsession, logger, testing) logger.info('Calculating tms cache ...') messtischblatt = Messtischblatt.by_id(georefProcess.messtischblattid, dbsession) buildTsmCache(messtischblatt.verzeichnispfad, cache_dir, logger) logger.info('Recalculate virtualdataset ...') if not testing: dbsession.commit() updateVirtualdatasetForTimestamp('%s-01-01 00:00:00'%timestamp, vrt_target_dir, tmp_dir, database_params, dbsession, logger, testing=testing) logger.info('Finishing updating the single georeferencing ...') return True
def publishGeorefParameters(request): log.info('Request - Publish georeference result.') try: log.debug('Parse parameters ...') objectid = request.params['objectid'] georeferenceid = request.params['georeferenceid'] messtischblatt = Messtischblatt.by_id(objectid, request.db) georeferenceprocess = Georeferenzierungsprozess.by_id( georeferenceid, request.db) log.debug('Udpate parameters') georeferenceprocess.publish = True messtischblatt.updated = False return json.dumps( { 'message': 'The georeference process is now published. The georeference map will soon be updated and than ready for accessing.' }, ensure_ascii=False, encoding='utf-8') except Exception as e: log.error( 'Error while trying to request georeference history information') log.error(e) return {}
def getTimestampsForId(request): """ Returns a json document which contains a a list of messtischblatt tuples which have the same blattnumber like the given object. """ try: log.info('Receive request for timestamps for a given object number.') dbsession = request.db object_id = request.GET.get('id') object = Messtischblatt.by_id(object_id, dbsession) spatial_relation_objects = Messtischblatt.allForBlattnr( object.blattnr, dbsession) response = [] for rel_object in spatial_relation_objects: if rel_object.isttransformiert: time = MdZeit.by_id(rel_object.id, dbsession).datierung response.append({ 'id': rel_object.id, 'time': time, 'extent': Messtischblatt.getExtent(rel_object.id, dbsession) }) return json.dumps({'maps': response}, ensure_ascii=False, encoding='utf-8') except DBAPIError: return Response(conn_err_msg, content_type='text/plain', status_int=500)
def getPage_profileMtb(request): try: messtischblatt_id = None if "objectid" in request.params: messtischblatt_id = request.params["objectid"] log.info("Receive get map profile page for id %s." % messtischblatt_id) georef = False if "georef" in request.params and request.params["georef"].lower() == "true": georef = True if georef: permalink = createPermalink(request, messtischblatt_id) return HTTPFound(location=permalink) messtischblatt = Messtischblatt.by_id(messtischblatt_id, request.db) metadata = MdCore.by_id(messtischblatt.id, request.db) metadata_datensatz = MdDatensatz.by_ObjectId(messtischblatt.id, request.db) return { "zoomify_prop": messtischblatt.zoomify_properties, "zoomify_width": messtischblatt.zoomify_width, "zoomify_height": messtischblatt.zoomify_height, "key": "vk20-md-%s" % messtischblatt.id, "titel_long": metadata.titel, "titel_short": metadata.titel_short, "permalink": metadata_datensatz.permalink, } except: log.error( "Internal server error while trying to get profile page. Please try again or contact the page administrator." ) raise InternalAuthentificationError( "Internal server error while trying to get profile page. Please try again or contact the page administrator." )
def resetGeorefParameters(request): try: log.info('Receive a reset georeference parameter requests.') login = checkIsUser(request) dbsession = request.db messtischblatt_id = request.params['mtbid'] georeference_process = Georeferenzierungsprozess.by_messtischblattid(messtischblatt_id, dbsession) referenz = georeference_process.clipparameter fehlerbeschreibung = 'Zuruecksetzen von Georeferenzierungsparameter für GeorefId=%s'%georeference_process.id if login and messtischblatt_id and referenz and fehlerbeschreibung and Users.by_username(login, dbsession): log.debug('Save reset process in table fehlermeldungen ...') newFehlermeldung = Fehlermeldung(objektid = messtischblatt_id, referenz = referenz, nutzerid = login, fehlerbeschreibung = fehlerbeschreibung, timestamp = getTimestampAsPGStr()) dbsession.add(newFehlermeldung) log.debug('Remove georeference process ...') dbsession.delete(georeference_process) log.debug('Remove refmtblayer ...') try: refmtblayer = RefMtbLayer.by_id(MTB_LAYER_ID, messtischblatt_id, dbsession) dbsession.delete(refmtblayer) except: log.debug('No entry for refmtblayer found ...') pass log.debug('Update messtischblatt db ...') messtischblatt = Messtischblatt.by_id(messtischblatt_id, dbsession) messtischblatt.isttransformiert = False return json.dumps({'status':'confirmed'}, ensure_ascii=False, encoding='utf-8') except DBAPIError: log.error('Problems while trying to remove georeference parameter from the database ...') return Response(conn_err_msg, content_type='text/plain', status_int=500)
def createResponseForSpecificGeoreferenceProcess(objectid, georeferenceid, request): log.debug('Create response for specific georeference process ...') messtischblatt = Messtischblatt.by_id(objectid, request.db) mtb_extent = Messtischblatt.getExtent(objectid, request.db) georeferenceprocess = Georeferenzierungsprozess.by_id(georeferenceid, request.db) pure_clipparameters = ast.literal_eval(str(georeferenceprocess.clipparameter)) gcps = None if 'new' in pure_clipparameters: # in case of an update process gcps = pure_clipparameters['new'] else: # in case of a new registered clip_parameter gcps = pure_clipparameters # get zoomify and metadata information log.debug('Create response ...') metadata = MdCore.by_id(messtischblatt.id, request.db) return { 'type':'update', 'objectid': messtischblatt.id, 'georeferenceid':georeferenceid, 'timestamp':str(georeferenceprocess.timestamp), 'gcps':gcps, 'extent': mtb_extent, 'zoomify': { 'properties': messtischblatt.zoomify_properties, 'width': messtischblatt.zoomify_width, 'height': messtischblatt.zoomify_height }, 'metadata': { 'dateiname': messtischblatt.dateiname, 'titel_long': metadata.titel, 'titel_short': metadata.titel_short } }
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)
def createGeneralResponse(objectid, request): log.debug('Create general response ...') lastGeoreferenceId = '' lastTimestamp = '' messtischblatt = Messtischblatt.by_id(objectid, request.db) mtb_extent = Messtischblatt.getExtent(objectid, request.db) isAlreadyGeorefProcess = Georeferenzierungsprozess.by_getLatestValidGeorefProcessForObjectId( messtischblatt.id, request.db) if isAlreadyGeorefProcess: return createResponseForSpecificGeoreferenceProcess( objectid, isAlreadyGeorefProcess.id, request) else: gcps = { 'source': 'pixel', 'target': 'EPSG:4314', 'gcps': [{ "source": [], "target": [mtb_extent[0], mtb_extent[1]] }, { "source": [], "target": [mtb_extent[0], mtb_extent[3]] }, { "source": [], "target": [mtb_extent[2], mtb_extent[1]] }, { "source": [], "target": [mtb_extent[2], mtb_extent[3]] }] } # get zoomify and metadata information log.debug('Create response ...') metadata = MdCore.by_id(messtischblatt.id, request.db) return { 'type': 'new', 'objectid': messtischblatt.id, 'georeferenceid': lastGeoreferenceId, 'timestamp': str(lastTimestamp), 'gcps': gcps, 'extent': mtb_extent, 'zoomify': { 'properties': messtischblatt.zoomify_properties, 'width': messtischblatt.zoomify_width, 'height': messtischblatt.zoomify_height }, 'metadata': { 'dateiname': messtischblatt.dateiname, 'titel_long': metadata.titel, 'titel_short': metadata.titel_short } }
def georeferenceUpdate(request): log.info('Receive request for processing georeference update result') try: userid = checkIsUser(request) 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('Check if there exists a registered georeference process for this messtischblatt ...') messtischblatt = Messtischblatt.by_id(request_data['id'], request.db) isAlreadyGeorefProcess = Georeferenzierungsprozess.by_messtischblattid(messtischblatt.id, request.db) if isAlreadyGeorefProcess is None: response = {'text':'There is no registered georeference process for this messtischblatt. Please move back to the confirm process.'} return json.dumps(response, ensure_ascii=False, encoding='utf-8') # actual only support this option if target srs is EPSG:4314 log.debug('Saving georeference process in the database ...') if request_data['georeference']: encoded_clip_params = convertUnicodeDictToUtf(request_data['georeference']) georefProcess = registerNewGeoreferenceProcessInDb(messtischblatt.id, userid, str(encoded_clip_params), 'update', request.db) log.debug('Set update status for messtischblatt ...') messtischblatt.setIsUpdated(True) log.debug('Create response ...') # right now the premise is that for the updated gcps are equal to the removed gcps. For every # updated gcps the users get new points achievement_points = len(request_data['georeference']['remove']['gcps'])*5 #gcps = getJsonDictPasspointsForMapObject(messtischblatt.id, request.db) response = {'text':'Georeference result updated. It will soon be ready for use.','georeferenceid':georefProcess.id, 'points':achievement_points, 'gcps':request_data['georeference']['new'] ,'type':'update'} return json.dumps(response, ensure_ascii=False, encoding='utf-8') else: log.error('The remove and new parameters are not valide - %s') raise GeoreferenceParameterError('The remove and new parameters are not valide.') 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 log.error(message) return HTTPInternalServerError(message)
def resetGeorefParameters(request): try: log.info('Receive a reset georeference parameter requests.') login = checkIsUser(request) dbsession = request.db messtischblatt_id = request.params['mtbid'] georeference_process = Georeferenzierungsprozess.by_messtischblattid( messtischblatt_id, dbsession) referenz = georeference_process.clipparameter fehlerbeschreibung = 'Zuruecksetzen von Georeferenzierungsparameter für GeorefId=%s' % georeference_process.id if login and messtischblatt_id and referenz and fehlerbeschreibung and Users.by_username( login, dbsession): log.debug('Save reset process in table fehlermeldungen ...') newFehlermeldung = Fehlermeldung( objektid=messtischblatt_id, referenz=referenz, nutzerid=login, fehlerbeschreibung=fehlerbeschreibung, timestamp=getTimestampAsPGStr()) dbsession.add(newFehlermeldung) log.debug('Remove georeference process ...') dbsession.delete(georeference_process) log.debug('Remove refmtblayer ...') try: refmtblayer = RefMtbLayer.by_id(MTB_LAYER_ID, messtischblatt_id, dbsession) dbsession.delete(refmtblayer) except: log.debug('No entry for refmtblayer found ...') pass log.debug('Update messtischblatt db ...') messtischblatt = Messtischblatt.by_id(messtischblatt_id, dbsession) messtischblatt.isttransformiert = False return json.dumps({'status': 'confirmed'}, ensure_ascii=False, encoding='utf-8') except DBAPIError: log.error( 'Problems while trying to remove georeference parameter from the database ...' ) return Response(conn_err_msg, content_type='text/plain', status_int=500)
def resetMapObject(mapObjectId, dbsession, logger, testing = False): logger.debug('Reset map object into unreferenced state.') messtischblatt = Messtischblatt.by_id(mapObjectId, dbsession) messtischblatt.isttransformiert = False messtischblatt.hasgeorefparams = 0 messtischblatt.verzeichnispfad = messtischblatt.original_path refmtblayer = RefMtbLayer.by_id(MTB_LAYER_ID, messtischblatt.id, dbsession) if refmtblayer: dbsession.delete(refmtblayer) if testing: dbsession.rollback() logger.debug('Remove metadata record from catalog instance') if not testing: gn_transaction_delete('vk20-md-%s'%messtischblatt.id, GN_SETTINGS['gn_username'], GN_SETTINGS['gn_password'], logger) return True
def getTimestampsForId(request): """ Returns a json document which contains a a list of messtischblatt tuples which have the same blattnumber like the given object. """ try: log.info('Receive request for timestamps for a given object number.') dbsession = request.db object_id = request.GET.get('id') object = Messtischblatt.by_id(object_id, dbsession) spatial_relation_objects = Messtischblatt.allForBlattnr(object.blattnr, dbsession) response = [] for rel_object in spatial_relation_objects: if rel_object.isttransformiert: time = MdZeit.by_id(rel_object.id, dbsession).datierung response.append({'id':rel_object.id,'time':time,'extent':Messtischblatt.getExtent(rel_object.id, dbsession)}) return json.dumps({'maps':response}, ensure_ascii=False, encoding='utf-8') except DBAPIError: return Response(conn_err_msg, content_type='text/plain', status_int=500)
def publishGeorefParameters(request): log.info('Request - Publish georeference result.') try: log.debug('Parse parameters ...') objectid = request.params['objectid'] georeferenceid = request.params['georeferenceid'] messtischblatt = Messtischblatt.by_id(objectid, request.db) georeferenceprocess = Georeferenzierungsprozess.by_id(georeferenceid, request.db) log.debug('Udpate parameters') georeferenceprocess.publish = True messtischblatt.updated = False return json.dumps({'message':'The georeference process is now published. The georeference map will soon be updated and than ready for accessing.'}, ensure_ascii=False, encoding='utf-8') except Exception as e: log.error('Error while trying to request georeference history information'); log.error(e) return {}
def deleteGeorefParameters(request): log.info('Request - Delete georeference result.') try: # remove georeference process georeferenceid = request.params['georeferenceid'] georeferenceprocess = Georeferenzierungsprozess.by_id(georeferenceid, request.db) messtischblattid = georeferenceprocess.messtischblattid request.db.delete(georeferenceprocess) # mark the messtischblatt as updated messtischblatt = Messtischblatt.by_id(messtischblattid, request.db) messtischblatt.udpated = True return json.dumps({'message':'The georeference process has been removed.'}, ensure_ascii=False, encoding='utf-8') except Exception as e: log.error('Error while trying to request georeference history information'); log.error(e) return {}
def updateDataSources(dbsession, database_params, vrt_target_dir, tmp_dir, cache_dir, logger, testing=True): logger.info('Get georeference processing queue ...') processingQueue = getGeoreferenceProcessQueue(dbsession, logger) logger.info('Reset objects ...') for objectId in processingQueue['reset']: logger.info('Reset object with id %s ...' % objectId) resetMapObject(objectId, dbsession, logger, testing) logger.info('Update single georeferencing ...') for timestamp in processingQueue['georeference']: logger.info('Update timestamps %s ...' % timestamp) for georefProcess in processingQueue['georeference'][timestamp]: logger.info('Update georeferencing for objectid %s ...' % georefProcess.messtischblattid) processSingleGeorefProc(georefProcess, dbsession, logger, testing) logger.info('Calculating tms cache ...') messtischblatt = Messtischblatt.by_id( georefProcess.messtischblattid, dbsession) buildTsmCache(messtischblatt.verzeichnispfad, cache_dir, logger) logger.info('Recalculate virtualdataset ...') if not testing: dbsession.commit() updateVirtualdatasetForTimestamp('%s-01-01 00:00:00' % timestamp, vrt_target_dir, tmp_dir, database_params, dbsession, logger, testing=testing) logger.info('Finishing updating the single georeferencing ...') return True
def resetMapObject(mapObjectId, dbsession, logger, testing=False): logger.debug('Reset map object into unreferenced state.') messtischblatt = Messtischblatt.by_id(mapObjectId, dbsession) messtischblatt.isttransformiert = False messtischblatt.hasgeorefparams = 0 messtischblatt.verzeichnispfad = messtischblatt.original_path refmtblayer = RefMtbLayer.by_id(MTB_LAYER_ID, messtischblatt.id, dbsession) if refmtblayer: dbsession.delete(refmtblayer) if testing: dbsession.rollback() logger.debug('Remove metadata record from catalog instance') if not testing: gn_transaction_delete('vk20-md-%s' % messtischblatt.id, GN_SETTINGS['gn_username'], GN_SETTINGS['gn_password'], logger) return True
def createGeneralResponse(objectid, request): log.debug('Create general response ...') lastGeoreferenceId = '' lastTimestamp = '' messtischblatt = Messtischblatt.by_id(objectid, request.db) mtb_extent = Messtischblatt.getExtent(objectid, request.db) isAlreadyGeorefProcess = Georeferenzierungsprozess.by_getLatestValidGeorefProcessForObjectId(messtischblatt.id, request.db) if isAlreadyGeorefProcess: return createResponseForSpecificGeoreferenceProcess(objectid, isAlreadyGeorefProcess.id, request) else: gcps = { 'source':'pixel', 'target':'EPSG:4314', 'gcps': [ {"source":[], "target":[mtb_extent[0],mtb_extent[1]]}, {"source":[], "target":[mtb_extent[0],mtb_extent[3]]}, {"source":[], "target":[mtb_extent[2],mtb_extent[1]]}, {"source":[], "target":[mtb_extent[2],mtb_extent[3]]} ] } # get zoomify and metadata information log.debug('Create response ...') metadata = MdCore.by_id(messtischblatt.id, request.db) return { 'type':'new', 'objectid': messtischblatt.id, 'georeferenceid':lastGeoreferenceId, 'timestamp':str(lastTimestamp), 'gcps':gcps, 'extent': mtb_extent, 'zoomify': { 'properties': messtischblatt.zoomify_properties, 'width': messtischblatt.zoomify_width, 'height': messtischblatt.zoomify_height }, 'metadata': { 'dateiname': messtischblatt.dateiname, 'titel_long': metadata.titel, 'titel_short': metadata.titel_short } }
def deleteGeorefParameters(request): log.info("Request - Delete georeference result.") try: # remove georeference process georeferenceid = request.params["georeferenceid"] georeferenceprocess = Georeferenzierungsprozess.by_id(georeferenceid, request.db) messtischblattid = georeferenceprocess.messtischblattid request.db.delete(georeferenceprocess) # mark the messtischblatt as updated messtischblatt = Messtischblatt.by_id(messtischblattid, request.db) messtischblatt.udpated = True return json.dumps( {"message": "The georeference process has been removed."}, ensure_ascii=False, encoding="utf-8" ) except Exception as e: log.error("Error while trying to request georeference history information") log.error(e) return {}
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)
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)
def getPage_profileMtb(request): try: messtischblatt_id = None if 'id' in request.params: messtischblatt_id = request.params['id'] log.info('Receive get profile mtb page for id %s.'%messtischblatt_id) messtischblatt = Messtischblatt.by_id(messtischblatt_id, request.db) user_id = authenticated_userid(request) if user_id: groups = groupfinder(user_id, request) if groups and 'g:moderator' in groups or 'g:admin' in groups: return {'with_modify':True, 'zoomify_prop':messtischblatt.zoomify_properties, 'zoomify_width':messtischblatt.zoomify_width,'zoomify_height':messtischblatt.zoomify_height, 'key':messtischblatt.dateiname} return {'zoomify_prop':messtischblatt.zoomify_properties,'zoomify_width':messtischblatt.zoomify_width, 'zoomify_height':messtischblatt.zoomify_height,'key':messtischblatt.dateiname} except: log.error('Internal server error while trying to get profile page. Please try again or contact the page administrator.') raise InternalAuthentificationError('Internal server error while trying to get profile page. Please try again or contact the page administrator.')
def createResponseForSpecificGeoreferenceProcess(objectid, georeferenceid, request): log.debug('Create response for specific georeference process ...') messtischblatt = Messtischblatt.by_id(objectid, request.db) mtb_extent = Messtischblatt.getExtent(objectid, request.db) georeferenceprocess = Georeferenzierungsprozess.by_id( georeferenceid, request.db) pure_clipparameters = ast.literal_eval( str(georeferenceprocess.clipparameter)) gcps = None if 'new' in pure_clipparameters: # in case of an update process gcps = pure_clipparameters['new'] else: # in case of a new registered clip_parameter gcps = pure_clipparameters # get zoomify and metadata information log.debug('Create response ...') metadata = MdCore.by_id(messtischblatt.id, request.db) return { 'type': 'update', 'objectid': messtischblatt.id, 'georeferenceid': georeferenceid, 'timestamp': str(georeferenceprocess.timestamp), 'gcps': gcps, 'extent': mtb_extent, 'zoomify': { 'properties': messtischblatt.zoomify_properties, 'width': messtischblatt.zoomify_width, 'height': messtischblatt.zoomify_height }, 'metadata': { 'dateiname': messtischblatt.dateiname, 'titel_long': metadata.titel, 'titel_short': metadata.titel_short } }
def getPage_profileMtb(request): try: messtischblatt_id = None if 'objectid' in request.params: messtischblatt_id = request.params['objectid'] log.info('Receive get map profile page for id %s.' % messtischblatt_id) georef = False if 'georef' in request.params and request.params['georef'].lower( ) == 'true': georef = True if georef: permalink = createPermalink(request, messtischblatt_id) return HTTPFound(location=permalink) messtischblatt = Messtischblatt.by_id(messtischblatt_id, request.db) metadata = MdCore.by_id(messtischblatt.id, request.db) metadata_datensatz = MdDatensatz.by_ObjectId(messtischblatt.id, request.db) return { 'zoomify_prop': messtischblatt.zoomify_properties, 'zoomify_width': messtischblatt.zoomify_width, 'zoomify_height': messtischblatt.zoomify_height, 'key': 'vk20-md-%s' % messtischblatt.id, 'titel_long': metadata.titel, 'titel_short': metadata.titel_short, 'permalink': metadata_datensatz.permalink } except: log.error( 'Internal server error while trying to get profile page. Please try again or contact the page administrator.' ) raise InternalAuthentificationError( 'Internal server error while trying to get profile page. Please try again or contact the page administrator.' )
def georeferenceConfirm(request): log.info('Receive request for processing georeference validation result') try: userid = checkIsUser(request) user = Users.by_username(userid, request.db) 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('Check if there is already a registered georeference process for this messtischblatt ...') messtischblatt = Messtischblatt.by_id(request_data['id'], request.db) isAlreadyGeorefProcess = Georeferenzierungsprozess.by_messtischblattid(messtischblatt.id, request.db) if isAlreadyGeorefProcess is not None: response = {'text':'There is already a registered georeference process for this messtischblatt. Please move forward to the update process.','georeferenceid':isAlreadyGeorefProcess.id} return json.dumps(response, ensure_ascii=False, encoding='utf-8') # actual only support this option if target srs is EPSG:4314 log.debug('Start saving georeference process in the database ...') epsg_code = int(str(request_data['georeference']['target']).split(':')[1]) if request_data['georeference']['source'] == 'pixel' and epsg_code == 4314: log.debug('Create georeference process record ...') timestamp = getTimestampAsPGStr() georeference_parameter = str(convertUnicodeDictToUtf(request_data['georeference'])) georefProcess = Georeferenzierungsprozess(messtischblattid = messtischblatt.id, nutzerid = userid, clipparameter = georeference_parameter, timestamp = timestamp, isvalide = True, type = 'new', refzoomify = True, publish = False, processed = False) request.db.add(georefProcess) request.db.flush() log.debug('Creating passpoints ...') # gcps = request_data['georeference']['gcps'] # passpoints = [] # for i in range(0,len(gcps)): # unrefPoint = [gcps[i]['source'][0],gcps[i]['source'][1]] # refPoint = 'POINT(%s %s)'%(gcps[i]['target'][0], gcps[i]['target'][1]) # passpoint = Passpoint(objectid = messtischblatt.id, userid = user.id, unrefpoint = unrefPoint, # refpoint = refPoint, deprecated = False, timestamp = timestamp, georeferenceprocessid = georefProcess.id) # request.db.add(passpoint) # passpoints.append(passpoints) log.debug('Create response ...') ##gcps = getJsonDictPasspointsForMapObject(messtischblatt.id, request.db) response = {'text':'Georeference result saved. It will soon be ready for use.','georeferenceid':georefProcess.id, 'points':20, 'gcps':request_data['georeference'] ,'type':'confirm'} 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 log.error(message) return HTTPInternalServerError(message)
def georeferenceUpdate(request): log.info('Receive request for processing georeference update result') try: userid = checkIsUser(request) 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( 'Check if there exists a registered georeference process for this messtischblatt ...' ) messtischblatt = Messtischblatt.by_id(request_data['id'], request.db) isAlreadyGeorefProcess = Georeferenzierungsprozess.by_messtischblattid( messtischblatt.id, request.db) if isAlreadyGeorefProcess is None: response = { 'text': 'There is no registered georeference process for this messtischblatt. Please move back to the confirm process.' } return json.dumps(response, ensure_ascii=False, encoding='utf-8') # actual only support this option if target srs is EPSG:4314 log.debug('Saving georeference process in the database ...') if request_data['georeference']: encoded_clip_params = convertUnicodeDictToUtf( request_data['georeference']) georefProcess = registerNewGeoreferenceProcessInDb( messtischblatt.id, userid, str(encoded_clip_params), 'update', request.db) log.debug('Set update status for messtischblatt ...') messtischblatt.setIsUpdated(True) log.debug('Create response ...') # right now the premise is that for the updated gcps are equal to the removed gcps. For every # updated gcps the users get new points achievement_points = len( request_data['georeference']['remove']['gcps']) * 5 #gcps = getJsonDictPasspointsForMapObject(messtischblatt.id, request.db) response = { 'text': 'Georeference result updated. It will soon be ready for use.', 'georeferenceid': georefProcess.id, 'points': achievement_points, 'gcps': request_data['georeference']['new'], 'type': 'update' } return json.dumps(response, ensure_ascii=False, encoding='utf-8') else: log.error('The remove and new parameters are not valide - %s') raise GeoreferenceParameterError( 'The remove and new parameters are not valide.') 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 log.error(message) return HTTPInternalServerError(message)
def getMetadataForMesstischblatt(id, db, logger): try: logger.debug('Start collection metadata information') mtb = Messtischblatt.by_id(id, db) metadata_core = MdCore.by_id(id, db) mdZeit = MdZeit.by_id(id, db) if mdZeit.datierung is None: metadata_time = '' else: metadata_time = mdZeit.datierung metadata_dataset = MdDatensatz.by_ObjectId(id, db) logger.debug('Metadata collection finish. Creating response') metadata = { 'westBoundLongitude':str(mtb.BoundingBoxObj.llc.x), 'eastBoundLongitude':str(mtb.BoundingBoxObj.urc.x), 'southBoundLatitude':str(mtb.BoundingBoxObj.llc.y), 'northBoundLatitude':str(mtb.BoundingBoxObj.urc.y), 'identifier':'vk20-md-%s'%mtb.id, 'dateStamp': datetime.now().strftime('%Y-%m-%d'), 'title': metadata_core.titel, 'cite_date': str(metadata_time), 'abstract': metadata_core.beschreibung, 'temporalExtent_begin': '%s-01-01'%metadata_time, 'temporalExtent_end': '%s-12-31'%metadata_time, 'permalink': metadata_dataset.permalink, 'hierarchylevel': 'Messtischblatt' if mtb.mdtype == 'M' else 'Äquidistantenkarte', 'overviews': [ # 'http://fotothek.slub-dresden.de/mids/df/dk/0010000/%s.jpg'%mtb.dateiname, # # TEMPLATE_OGC_SERVICE_LINK['wms_template']%({ # 'westBoundLongitude':str(mtb.BoundingBoxObj.llc.x), # 'southBoundLatitude':str(mtb.BoundingBoxObj.llc.y), # 'eastBoundLongitude':str(mtb.BoundingBoxObj.urc.x), # 'northBoundLatitude':str(mtb.BoundingBoxObj.urc.y), # 'srid':DATABASE_SRID, # 'time':metadata_time.datierung, # 'width':256, # 'height':256 # }), 'http://fotothek.slub-dresden.de/thumbs/df/dk/0010000/%s.jpg'%mtb.dateiname ], 'wms_params': { 'westBoundLongitude':str(mtb.BoundingBoxObj.llc.x), 'southBoundLatitude':str(mtb.BoundingBoxObj.llc.y), 'eastBoundLongitude':str(mtb.BoundingBoxObj.urc.x), 'northBoundLatitude':str(mtb.BoundingBoxObj.urc.y), 'srid':DATABASE_SRID, 'time':metadata_time, 'width':256, 'height':256 }, 'onlineresource':[ { 'url':'http://kartenforum.slub-dresden.de/vkviewer/permalink?objectid=%s'%mtb.id, 'protocol':'HTTP', 'name':'Permalink' }, { 'url':TEMPLATE_OGC_SERVICE_LINK['wms_template']%({ 'westBoundLongitude':str(mtb.BoundingBoxObj.llc.x), 'southBoundLatitude':str(mtb.BoundingBoxObj.llc.y), 'eastBoundLongitude':str(mtb.BoundingBoxObj.urc.x), 'northBoundLatitude':str(mtb.BoundingBoxObj.urc.y), 'srid':DATABASE_SRID, 'time':metadata_time, 'width':256, 'height':256 }), 'protocol':'OGC:WMS-1.1.1-http-get-map', 'name':'WEB MAP SERVICE (WMS)' }, { 'url':metadata_dataset.permalink, 'protocol':'HTTP', 'name':'Permalink' } ] } return metadata except: logger.error('Problems while trying to collect the metadata for the messtischblatt with id %s'%id) raise
def georeferenceConfirm(request): log.info('Receive request for processing georeference validation result') try: userid = checkIsUser(request) user = Users.by_username(userid, request.db) 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( 'Check if there is already a registered georeference process for this messtischblatt ...' ) messtischblatt = Messtischblatt.by_id(request_data['id'], request.db) isAlreadyGeorefProcess = Georeferenzierungsprozess.by_messtischblattid( messtischblatt.id, request.db) if isAlreadyGeorefProcess is not None: response = { 'text': 'There is already a registered georeference process for this messtischblatt. Please move forward to the update process.', 'georeferenceid': isAlreadyGeorefProcess.id } return json.dumps(response, ensure_ascii=False, encoding='utf-8') # actual only support this option if target srs is EPSG:4314 log.debug('Start saving georeference process in the database ...') epsg_code = int( str(request_data['georeference']['target']).split(':')[1]) if request_data['georeference'][ 'source'] == 'pixel' and epsg_code == 4314: log.debug('Create georeference process record ...') timestamp = getTimestampAsPGStr() georeference_parameter = str( convertUnicodeDictToUtf(request_data['georeference'])) georefProcess = Georeferenzierungsprozess( messtischblattid=messtischblatt.id, nutzerid=userid, clipparameter=georeference_parameter, timestamp=timestamp, isvalide=True, type='new', refzoomify=True, publish=False, processed=False) request.db.add(georefProcess) request.db.flush() log.debug('Creating passpoints ...') # gcps = request_data['georeference']['gcps'] # passpoints = [] # for i in range(0,len(gcps)): # unrefPoint = [gcps[i]['source'][0],gcps[i]['source'][1]] # refPoint = 'POINT(%s %s)'%(gcps[i]['target'][0], gcps[i]['target'][1]) # passpoint = Passpoint(objectid = messtischblatt.id, userid = user.id, unrefpoint = unrefPoint, # refpoint = refPoint, deprecated = False, timestamp = timestamp, georeferenceprocessid = georefProcess.id) # request.db.add(passpoint) # passpoints.append(passpoints) log.debug('Create response ...') ##gcps = getJsonDictPasspointsForMapObject(messtischblatt.id, request.db) response = { 'text': 'Georeference result saved. It will soon be ready for use.', 'georeferenceid': georefProcess.id, 'points': 20, 'gcps': request_data['georeference'], 'type': 'confirm' } 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 log.error(message) return HTTPInternalServerError(message)