def test_tile_url(self): """Test to return tile format.""" filename = os.path.join(gisdata.GOOD_DATA, 'raster/test_grid.tif') uploaded = file_upload(filename) tile_format = tile_url_format(uploaded.name) # Accessing this directly should return 404 response = self.client.get(tile_format) self.assertEqual(response.status_code, 404) qgis_tile_url = tile_url(uploaded, 11, 1576, 1054, internal=True) parse_result = urlparse.urlparse(qgis_tile_url) base_net_loc = urlparse.urlparse(settings.QGIS_SERVER_URL).netloc self.assertEqual(base_net_loc, parse_result.netloc) query_string = urlparse.parse_qs(parse_result.query) expected_query_string = { 'SERVICE': 'WMS', 'VERSION': '1.3.0', 'REQUEST': 'GetMap', 'BBOX': '10801469.341,-606604.256471,10821037.2203,-587036.37723', 'CRS': 'EPSG:3857', 'WIDTH': '256', 'HEIGHT': '256', 'LAYERS': 'test_grid', 'STYLE': 'default', 'FORMAT': 'image/png', 'TRANSPARENT': 'true', 'DPI': '96', 'MAP_RESOLUTION': '96', 'FORMAT_OPTIONS': 'dpi:96' } for key, value in expected_query_string.iteritems(): # urlparse.parse_qs returned a dictionary of list actual_value = query_string[key][0] self.assertEqual(actual_value, value) # Check that qgis server returns valid url # Use python requests because the endpoint is not django response = requests.get(qgis_tile_url) self.assertEqual(response.status_code, 200) self.assertEqual(response.headers.get('Content-Type'), 'image/png') self.assertEqual(what('', h=response.content), 'png') uploaded.delete()
def test_tile_url(self): """Test to return tile format.""" filename = os.path.join(gisdata.GOOD_DATA, 'raster/test_grid.tif') uploaded = file_upload(filename) tile_format = tile_url_format(uploaded.name) # Accessing this directly should return 404 response = self.client.get(tile_format) self.assertEqual(response.status_code, 404) qgis_tile_url = tile_url(uploaded, 11, 1576, 1054, internal=True) parse_result = urlparse.urlparse(qgis_tile_url) base_net_loc = urlparse.urlparse(settings.QGIS_SERVER_URL).netloc self.assertEqual(base_net_loc, parse_result.netloc) query_string = urlparse.parse_qs(parse_result.query) expected_query_string = { 'SERVICE': 'WMS', 'VERSION': '1.3.0', 'REQUEST': 'GetMap', 'BBOX': '10801469.341,-606604.256471,10821037.2203,-587036.37723', 'CRS': 'EPSG:3857', 'WIDTH': '256', 'HEIGHT': '256', 'LAYERS': 'test_grid', 'STYLE': 'default', 'FORMAT': 'image/png', 'TRANSPARENT': 'true', 'DPI': '96', 'MAP_RESOLUTION': '96', 'FORMAT_OPTIONS': 'dpi:96' } for key, value in expected_query_string.iteritems(): # urlparse.parse_qs returned a dictionary of list actual_value = query_string[key][0] self.assertEqual(actual_value, value) # Check that qgis server returns valid url # Use python requests because the endpoint is not django response = requests.get(qgis_tile_url) self.assertEqual(response.status_code, 200) self.assertEqual(response.headers.get('Content-Type'), 'image/png') self.assertEqual(what('', h=response.content), 'png') uploaded.delete()
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')