def legend(request, layername, layertitle=None): try: layer = Layer.objects.get(name=layername) except ObjectDoesNotExist: msg = 'No layer found for %s' % layername logger.debug(msg) raise Http404(msg) try: qgis_layer = QGISServerLayer.objects.get(layer=layer) except ObjectDoesNotExist: msg = 'No QGIS Server Layer for existing layer %s' % layername logger.debug(msg) raise Http404(msg) basename, _ = os.path.splitext(qgis_layer.base_layer_path) legend_path = QGIS_SERVER_CONFIG['legend_path'] legend_filename = legend_path % os.path.basename(basename) if not os.path.exists(legend_filename): if not os.path.exists(os.path.dirname(legend_filename)): os.makedirs(os.path.dirname(legend_filename)) if not layertitle: layertitle = 'FALSE' qgis_server = QGIS_SERVER_CONFIG['qgis_server_url'] query_string = { 'MAP': qgis_layer.base_layer_path, 'SERVICE': 'WMS', 'VERSION': '1.3.0', 'REQUEST': 'GetLegendGraphic', 'LAYER': layer.name, 'LAYERTITLE': layertitle, 'FORMAT': 'image/png', 'TILED': 'true', 'TRANSPARENT': 'true', 'LEGEND_OPTIONS': 'fontAntiAliasing:true;fontSize:11;fontName:Arial' } url = qgis_server + '?' for param, value in query_string.iteritems(): url += param + '=' + value + '&' urlretrieve(url, legend_filename) logger.info(url) if image_format(legend_filename) != 'png': logger.error('%s is not valid PNG.' % legend_filename) os.remove(legend_filename) if not os.path.exists(legend_filename): return HttpResponse('The legend could not be found.', status=409) with open(legend_filename, 'rb') as f: return HttpResponse(f.read(), mimetype='image/png')
def legend(request, layername, layertitle=False, style=None): """Get the legend from a layer. :param layername: The layer name in Geonode. :type layername: basestring :param layertitle: Add the layer title in the legend. Default to False. :type layertitle: bool :param style: Layer style to choose :type style: str :return: The HTTPResponse with a PNG. """ layer = get_object_or_404(Layer, name=layername) qgis_layer = get_object_or_404(QGISServerLayer, layer=layer) # get default style name if not style: # generate style cache if not qgis_layer.default_style: try: style_list(layer, internal=False) except Exception: logger.warning("Failed to fetch styles") # refresh values qgis_layer.refresh_from_db() if qgis_layer.default_style: style = qgis_layer.default_style.name tiles_directory = QGIS_SERVER_CONFIG['tiles_directory'] legend_path = QGIS_SERVER_CONFIG['legend_path'] legend_filename = legend_path % (qgis_layer.qgis_layer_name, style) # GOOD -- Verify with normalised version of path legend_filename = os.path.normpath(legend_filename) if not legend_filename.startswith(tiles_directory): return HttpResponseServerError() if not os.path.exists(legend_filename): if not os.path.exists(os.path.dirname(legend_filename)): os.makedirs(os.path.dirname(legend_filename)) url = legend_url(layer, layertitle, style=style, internal=True) result = cache_request.apply_async((url, legend_filename)) # Attempt to run task synchronously if not result.get(): # If not succeded, provides error message. return HttpResponseServerError('Failed to fetch legend.') if image_format(legend_filename) != 'png': logger.error('%s is not valid PNG.' % legend_filename) os.remove(legend_filename) if not os.path.exists(legend_filename): return HttpResponse('The legend could not be found.', status=409) with open(legend_filename, 'rb') as f: return HttpResponse(f.read(), content_type='image/png')
def legend(request, layername, layertitle=False, style=None): """Get the legend from a layer. :param layername: The layer name in Geonode. :type layername: basestring :param layertitle: Add the layer title in the legend. Default to False. :type layertitle: bool :param style: Layer style to choose :type style: str :return: The HTTPResponse with a PNG. """ layer = get_object_or_404(Layer, name=layername) qgis_layer = get_object_or_404(QGISServerLayer, layer=layer) # get default style name if not style: # generate style cache if not qgis_layer.default_style: try: style_list(layer, internal=False) except BaseException: print 'Failed to fetch styles' # refresh values qgis_layer.refresh_from_db() if qgis_layer.default_style: style = qgis_layer.default_style.name legend_path = QGIS_SERVER_CONFIG['legend_path'] legend_filename = legend_path % (qgis_layer.qgis_layer_name, style) if not os.path.exists(legend_filename): if not os.path.exists(os.path.dirname(legend_filename)): os.makedirs(os.path.dirname(legend_filename)) url = legend_url(layer, layertitle, style=style, internal=True) result = cache_request.delay(url, legend_filename) # Attempt to run task synchronously if not result.get(): # If not succeded, provides error message. return HttpResponseServerError('Failed to fetch legend.') if image_format(legend_filename) != 'png': logger.error('%s is not valid PNG.' % legend_filename) os.remove(legend_filename) if not os.path.exists(legend_filename): return HttpResponse('The legend could not be found.', status=409) with open(legend_filename, 'rb') as f: return HttpResponse(f.read(), content_type='image/png')
def wms_get_map(params): logger.debug('WMS GetMap') qgis_server = QGIS_SERVER_CONFIG['qgis_server_url'] layer = Layer.objects.get(typename=params.pop('LAYERS')) params['LAYERS'] = layer.name try: qgis_layer = QGISServerLayer.objects.get(layer=layer) except ObjectDoesNotExist: msg = 'No QGIS Server Layer for existing layer %s' % layer.name logger.debug(msg) raise Http404(msg) basename, _ = os.path.splitext(qgis_layer.base_layer_path) params['map'] = basename + '.qgs' url = qgis_server + '?' for param, value in params.iteritems(): url += param + '=' + value + '&' logger.debug(url) bbox_string = params['BBOX'].replace('-', 'n') bbox = bbox_string.split(',') map_tile_path = QGIS_SERVER_CONFIG['map_tile_path'] tile_filename = map_tile_path % (os.path.basename(basename), bbox[0], bbox[1], bbox[2], bbox[3]) logger.debug(tile_filename) if not os.path.exists(tile_filename): if not os.path.exists(os.path.dirname(tile_filename)): os.makedirs(os.path.dirname(tile_filename)) urlretrieve(url, tile_filename) if image_format(tile_filename) != 'png': logger.error('%s is not valid PNG.' % tile_filename) os.remove(tile_filename) if not os.path.exists(tile_filename): return HttpResponse('The legend could not be found.', status=409) with open(tile_filename, 'rb') as f: return HttpResponse(f.read(), mimetype='image/png')
def tile(request, layername, z, x, y, style=None): """Get the tile from a layer. :param layername: The layer name in Geonode. :type layername: basestring :param z: TMS coordinate, zoom parameter :type z: int, str :param x: TMS coordinate, longitude parameter :type x: int, str :param y: TMS coordinate, latitude parameter :type y: int, str :param style: Layer style to choose :type style: str :return: The HTTPResponse with a PNG. """ x = int(x) y = int(y) z = int(z) layer = get_object_or_404(Layer, name=layername) qgis_layer = get_object_or_404(QGISServerLayer, layer=layer) # get default style name if not style: # generate style cache if not qgis_layer.default_style: try: style_list(layer, internal=False) except BaseException: print 'Failed to fetch styles' # refresh values qgis_layer.refresh_from_db() if qgis_layer.default_style: style = qgis_layer.default_style.name tile_path = QGIS_SERVER_CONFIG['tile_path'] tile_filename = tile_path % (qgis_layer.qgis_layer_name, style, z, x, y) if not os.path.exists(tile_filename): if not os.path.exists(os.path.dirname(tile_filename)): os.makedirs(os.path.dirname(tile_filename)) # Use internal url url = tile_url(layer, z, x, y, style=style, internal=True) result = cache_request.delay(url, tile_filename) # Attempt to run task synchronously if not result.get(): # If not succeded, provides error message. return HttpResponseServerError('Failed to fetch tile.') if image_format(tile_filename) != 'png': logger.error('%s is not valid PNG.' % tile_filename) os.remove(tile_filename) if not os.path.exists(tile_filename): return HttpResponse('The tile could not be found.', status=409) with open(tile_filename, 'rb') as f: return HttpResponse(f.read(), content_type='image/png')
def tile(request, layername, z, x, y): x = int(x) y = int(y) z = int(z) try: layer = Layer.objects.get(name=layername) except ObjectDoesNotExist: msg = 'No layer found for %s' % layername logger.debug(msg) raise Http404(msg) try: qgis_layer = QGISServerLayer.objects.get(layer=layer) except ObjectDoesNotExist: msg = 'No QGIS Server Layer for existing layer %s' % layername logger.debug(msg) raise Http404(msg) basename, _ = os.path.splitext(qgis_layer.base_layer_path) tile_path = QGIS_SERVER_CONFIG['tile_path'] tile_filename = tile_path % (os.path.basename(basename), z, x, y) if not os.path.exists(tile_filename): if not os.path.exists(os.path.dirname(tile_filename)): os.makedirs(os.path.dirname(tile_filename)) # Call the WMS top, left = num2deg(x, y, z) bottom, right = num2deg(x + 1, y + 1, z) transform = CoordTransform(SpatialReference(4326), SpatialReference(3857)) top_left_corner = Point(left, top, srid=4326) bottom_right_corner = Point(right, bottom, srid=4326) top_left_corner.transform(transform) bottom_right_corner.transform(transform) bottom = bottom_right_corner.y right = bottom_right_corner.x top = top_left_corner.y left = top_left_corner.x bbox = ','.join([str(val) for val in [left, bottom, right, top]]) qgis_server = QGIS_SERVER_CONFIG['qgis_server_url'] query_string = { 'SERVICE': 'WMS', 'VERSION': '1.3.0', 'REQUEST': 'GetMap', 'BBOX': bbox, 'CRS': 'EPSG:3857', 'WIDTH': '256', 'HEIGHT': '256', 'MAP': qgis_layer.base_layer_path, 'LAYERS': layer.name, 'STYLES': 'default', 'FORMAT': 'image/png', 'TRANSPARENT': 'true', 'DPI': '96', 'MAP_RESOLUTION': '96', 'FORMAT_OPTIONS': 'dpi:96' } url = qgis_server + '?' for param, value in query_string.iteritems(): url += param + '=' + value + '&' urlretrieve(url, tile_filename) if image_format(tile_filename) != 'png': logger.error('%s is not valid PNG.' % tile_filename) os.remove(tile_filename) if not os.path.exists(tile_filename): return HttpResponse('The legend could not be found.', status=409) with open(tile_filename, 'rb') as f: return HttpResponse(f.read(), mimetype='image/png')
def thumbnail(request, layername): try: layer = Layer.objects.get(name=layername) except ObjectDoesNotExist: msg = 'No layer found for %s' % layername logger.debug(msg) raise Http404(msg) try: qgis_layer = QGISServerLayer.objects.get(layer=layer) except ObjectDoesNotExist: msg = 'No QGIS Server Layer for existing layer %s' % layername logger.debug(msg) raise Http404(msg) basename, _ = os.path.splitext(qgis_layer.base_layer_path) thumbnail_path = QGIS_SERVER_CONFIG['thumbnail_path'] thumbnail_filename = thumbnail_path % os.path.basename(basename) if not os.path.exists(thumbnail_filename): if not os.path.exists(os.path.dirname(thumbnail_filename)): os.makedirs(os.path.dirname(thumbnail_filename)) # We get the extent of the layer. x_min = layer.resourcebase_ptr.bbox_x0 x_max = layer.resourcebase_ptr.bbox_x1 y_min = layer.resourcebase_ptr.bbox_y0 y_max = layer.resourcebase_ptr.bbox_y1 # We calculate the margins according to 10 percent. percent = 10 delta_x = (x_max - x_min) / 100 * percent delta_y = (y_max - y_min) / 100 * percent # We apply the margins to the extent. margin = [ y_min - delta_y, x_min - delta_x, y_max + delta_y, x_max + delta_x ] # Call the WMS. bbox = ','.join([str(val) for val in margin]) qgis_server = QGIS_SERVER_CONFIG['qgis_server_url'] query_string = { 'SERVICE': 'WMS', 'VERSION': '1.3.0', 'REQUEST': 'GetMap', 'BBOX': bbox, 'CRS': 'EPSG:4326', 'WIDTH': '250', 'HEIGHT': '250', 'MAP': qgis_layer.base_layer_path, 'LAYERS': layer.name, 'STYLES': 'default', 'FORMAT': 'image/png', 'TRANSPARENT': 'true', 'DPI': '96', 'MAP_RESOLUTION': '96', 'FORMAT_OPTIONS': 'dpi:96' } url = qgis_server + '?' for param, value in query_string.iteritems(): url += param + '=' + value + '&' urlretrieve(url, thumbnail_filename) logger.info(url) if image_format(thumbnail_filename) != 'png': logger.error('%s is not valid PNG.' % thumbnail_filename) os.remove(thumbnail_filename) if not os.path.exists(thumbnail_filename): msg = 'The thumbnail could not be found.' return HttpResponse(msg, status=409) with open(thumbnail_filename, 'rb') as f: return HttpResponse(f.read(), mimetype='image/png')
def map_thumbnail(request, map_id): logger.debug('Fetching thumbnail for the map %s.' % map_id) try: map_object = Map.objects.get(id=map_id) except ObjectDoesNotExist: msg = 'Maps not found for %s' % map_id logger.debug(msg) raise Http404(msg) map_file = 'map_%s' % map_id map_project = os.path.join(QGIS_SERVER_CONFIG['layer_directory'], map_file + '.qgs') if not os.path.exists(map_project): msg = 'Map project not found for %s' % map_project logger.debug(msg) raise Http404(msg) thumbnail_filename = QGIS_SERVER_CONFIG['thumbnail_path'] % map_file if not os.path.exists(thumbnail_filename): if not os.path.exists(os.path.dirname(thumbnail_filename)): os.makedirs(os.path.dirname(thumbnail_filename)) # We get the extent of these layers. bbox = [float(i) for i in map_object.bbox_string.split(',')] x_min, x_max, y_min, y_max = bbox # We calculate the margins according to 10 percent. percent = 10 delta_x = (x_max - x_min) / 100 * percent delta_y = (y_max - y_min) / 100 * percent # We apply the margins to the extent. margin = [ y_min - delta_y, x_min - delta_x, y_max + delta_y, x_max + delta_x ] # Call the WMS. bbox = ','.join([str(val) for val in margin]) qgis_server = QGIS_SERVER_CONFIG['qgis_server_url'] query_string = { 'SERVICE': 'WMS', 'VERSION': '1.3.0', 'REQUEST': 'GetMap', 'BBOX': bbox, 'CRS': 'EPSG:4326', 'WIDTH': '250', 'HEIGHT': '250', 'MAP': map_project, 'LAYERS': map_file, 'STYLES': 'default', 'FORMAT': 'image/png', 'TRANSPARENT': 'true', 'DPI': '96', 'MAP_RESOLUTION': '96', 'FORMAT_OPTIONS': 'dpi:96' } url = qgis_server + '?' for param, value in query_string.iteritems(): url += param + '=' + value + '&' urlretrieve(url, thumbnail_filename) logger.info(url) if image_format(thumbnail_filename) != 'png': logger.error('%s is not valid PNG.' % thumbnail_filename) os.remove(thumbnail_filename) if not os.path.exists(thumbnail_filename): msg = 'The thumbnail could not be found.' return HttpResponse(msg, status=409) with open(thumbnail_filename, 'rb') as f: return HttpResponse(f.read(), content_type='image/png')