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 tile_url(layer, z, x, y, style=None, internal=True): """Construct actual tile request to QGIS Server. Different than tile_url_format, this method will return url for requesting a tile, with all parameters filled out. :param layer: Layer to use :type layer: Layer :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 :param internal: Flag to switch between public url and internal url. Public url will be served by Django Geonode (proxified). :type internal: bool :return: Tile url :rtype: str """ try: qgis_layer = QGISServerLayer.objects.get(layer=layer) except QGISServerLayer.DoesNotExist: msg = 'No QGIS Server Layer for existing layer {0}'.format(layer.name) logger.debug(msg) raise x = int(x) y = int(y) z = int(z) # 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]]) if not style: style = 'default' if style not in [s.name for s in qgis_layer.styles.all()]: style = qgis_layer.default_style.name query_string = { 'SERVICE': 'WMS', 'VERSION': '1.3.0', 'REQUEST': 'GetMap', 'BBOX': bbox, 'CRS': 'EPSG:3857', 'WIDTH': '256', 'HEIGHT': '256', 'MAP': qgis_layer.qgis_project_path, 'LAYERS': layer.name, 'STYLE': style, 'FORMAT': 'image/png', 'TRANSPARENT': 'true', 'DPI': '96', 'MAP_RESOLUTION': '96', 'FORMAT_OPTIONS': 'dpi:96' } qgis_server_url = qgis_server_endpoint(internal) url = Request('GET', qgis_server_url, params=query_string).prepare().url return url
def tile_url(layer, z, x, y, style=None, internal=True): """Construct actual tile request to QGIS Server. Different than tile_url_format, this method will return url for requesting a tile, with all parameters filled out. :param layer: Layer to use :type layer: Layer :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 :param internal: Flag to switch between public url and internal url. Public url will be served by Django Geonode (proxified). :type internal: bool :return: Tile url :rtype: str """ try: qgis_layer = QGISServerLayer.objects.get(layer=layer) except QGISServerLayer.DoesNotExist: msg = 'No QGIS Server Layer for existing layer {0}'.format( layer.name) logger.debug(msg) raise x = int(x) y = int(y) z = int(z) # 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]]) if not style: style = 'default' if style not in [s.name for s in qgis_layer.styles.all()]: style = qgis_layer.default_style.name query_string = { 'SERVICE': 'WMS', 'VERSION': '1.3.0', 'REQUEST': 'GetMap', 'BBOX': bbox, 'CRS': 'EPSG:3857', 'WIDTH': '256', 'HEIGHT': '256', 'MAP': qgis_layer.qgis_project_path, 'LAYERS': layer.name, 'STYLE': style, 'FORMAT': 'image/png', 'TRANSPARENT': 'true', 'DPI': '96', 'MAP_RESOLUTION': '96', 'FORMAT_OPTIONS': 'dpi:96' } qgis_server_url = qgis_server_endpoint(internal) url = Request('GET', qgis_server_url, params=query_string).prepare().url return url