def layer_detail(request, layername, template='layers/layer_detail.html'): layer = _resolve_layer( request, layername, 'base.view_resourcebase', _("You are not permitted to view this layer")) # assert False, str(layer_bbox) config = layer.attribute_config() # Add required parameters for GXP lazy-loading layer_bbox = layer.bbox bbox = [float(coord) for coord in list(layer_bbox[0:4])] config["srs"] = getattr(settings, 'DEFAULT_MAP_CRS', 'EPSG:900913') config["bbox"] = bbox if config["srs"] != 'EPSG:900913' \ else llbbox_to_mercator([float(coord) for coord in bbox]) config["title"] = layer.title config["queryable"] = True if layer.default_style: config["styles"] = layer.default_style.name if layer.storeType == "remoteStore": source_srid = None # Only grab the service proj/bbox if it is valid if None not in layer.service.bbox[0:4]: bbox = [float(coord) for coord in list(layer.service.bbox[0:4])] source_srid = layer.service.srid # Otherwise try the service directly # This is needed since previous services registered # did not store the bbox/srid in the model else: try: service_handler = get_service_handler( base_url=layer.service.base_url, service_type=layer.service.type) if getattr(service_handler.parsed_service, 'initialExtent', None): bbox[0] = service_handler.parsed_service.initialExtent[ 'xmin'] bbox[1] = service_handler.parsed_service.initialExtent[ 'ymin'] bbox[2] = service_handler.parsed_service.initialExtent[ 'xmax'] bbox[3] = service_handler.parsed_service.initialExtent[ 'ymax'] else: logger.info('Could not retrieve extent from service: {0}' .format(layer.service)) if getattr(service_handler.parsed_service, 'spatialReference', None): source_srid = \ service_handler.parsed_service.spatialReference[ 'latestWkid'] else: logger.info('Could not retrieve srid from service: {0}' .format(layer.service)) except Exception as e: logger.info('Failed to access service endpoint: {0}' .format(layer.service.base_url)) logger.info('Caught error: {0}'.format(e)) if source_srid is None: source_srid = layer.srid target_srid = 3857 if config["srs"] == 'EPSG:900913' else config["srs"] reprojected_bbox = bbox_to_projection(bbox, source_srid=source_srid, target_srid=target_srid) bbox = reprojected_bbox[:4] config['bbox'] = [float(coord) for coord in bbox] service = layer.service source_url = service.base_url use_proxy = (callable(uses_proxy_route) and uses_proxy_route(service.base_url)) components = urlsplit(service.base_url) query_params = None if components.query: query_params = OrderedDict( parse_qsl(components.query, keep_blank_values=True)) removed_query = [components.scheme, components.netloc, components.path, None, components.fragment] source_url = urlunsplit(removed_query) source_params = { "ptype": service.ptype, "remote": True, "url": source_url, "name": service.name, "use_proxy": use_proxy} if query_params is not None: source_params["params"] = query_params if layer.alternate is not None: config["layerid"] = layer.alternate maplayer = GXPLayer( name=layer.typename, ows_url=layer.ows_url, layer_params=json.dumps(config), source_params=json.dumps(source_params)) else: maplayer = GXPLayer( name=layer.typename, ows_url=layer.ows_url, layer_params=json.dumps(config)) # Update count for popularity ranking, # but do not includes admins or resource owners if request.user != layer.owner and not request.user.is_superuser: Layer.objects.filter( id=layer.id).update(popular_count=F('popular_count') + 1) # center/zoom don't matter; the viewer will center on the layer bounds map_obj = GXPMap( projection=getattr(settings, 'DEFAULT_MAP_CRS', 'EPSG:900913')) metadata = layer.link_set.metadata().filter( name__in=settings.DOWNLOAD_FORMATS_METADATA) granules = None all_granules = None filter = None if layer.is_mosaic: try: cat = gs_catalog cat._cache.clear() store = cat.get_store(layer.name) coverages = cat.mosaic_coverages(store) filter = None try: if request.GET["filter"]: filter = request.GET["filter"] except: pass offset = 10 * (request.page - 1) granules = cat.mosaic_granules( coverages['coverages']['coverage'][0]['name'], store, limit=10, offset=offset, filter=filter) all_granules = cat.mosaic_granules( coverages['coverages']['coverage'][0]['name'], store, filter=filter) except: granules = {"features": []} all_granules = {"features": []} context_dict = { "resource": layer, 'perms_list': get_perms(request.user, layer.get_self_resource()), "permissions_json": _perms_info_json(layer), "documents": get_related_documents(layer), "metadata": metadata, "is_layer": True, "wps_enabled": settings.OGC_SERVER['default']['WPS_ENABLED'], "granules": granules, "all_granules": all_granules, "filter": filter, } if 'access_token' in request.session: access_token = request.session['access_token'] else: u = uuid.uuid1() access_token = u.hex if bbox is not None: minx, miny, maxx, maxy = [float(coord) for coord in bbox] x = (minx + maxx) / 2 y = (miny + maxy) / 2 if layer.is_remote or getattr(settings, 'DEFAULT_MAP_CRS', 'EPSG:900913') == "EPSG:4326": center = list((x, y)) else: center = list(forward_mercator((x, y))) if center[1] == float('-inf'): center[1] = 0 BBOX_DIFFERENCE_THRESHOLD = 1e-5 # Check if the bbox is invalid valid_x = (maxx - minx) ** 2 > BBOX_DIFFERENCE_THRESHOLD valid_y = (maxy - miny) ** 2 > BBOX_DIFFERENCE_THRESHOLD if valid_x: width_zoom = math.log(360 / abs(maxx - minx), 2) else: width_zoom = 15 if valid_y: height_zoom = math.log(360 / abs(maxy - miny), 2) else: height_zoom = 15 map_obj.center_x = center[0] map_obj.center_y = center[1] map_obj.zoom = math.ceil(min(width_zoom, height_zoom)) context_dict["viewer"] = json.dumps( map_obj.viewer_json(request.user, access_token, *(default_map_config(request)[1] + [maplayer]))) context_dict["preview"] = getattr( settings, 'LAYER_PREVIEW_LIBRARY', 'leaflet') context_dict["crs"] = getattr( settings, 'DEFAULT_MAP_CRS', 'EPSG:900913') if layer.storeType == 'dataStore': links = layer.link_set.download().filter( name__in=settings.DOWNLOAD_FORMATS_VECTOR) else: links = layer.link_set.download().filter( name__in=settings.DOWNLOAD_FORMATS_RASTER) links_view = [item for idx, item in enumerate(links) if item.url and 'wms' in item.url or 'gwc' in item.url] links_download = [item for idx, item in enumerate(links) if item.url and 'wms' not in item.url and 'gwc' not in item.url] for item in links_view: if item.url and access_token: item.url = "%s&access_token=%s&time=%s" % \ (item.url, access_token, "0/9999") for item in links_download: if item.url and access_token: item.url = "%s&access_token=%s" % (item.url, access_token) if request.user.has_perm('view_resourcebase', layer.get_self_resource()): context_dict["links"] = links_view if request.user.has_perm('download_resourcebase', layer.get_self_resource()): if layer.storeType == 'dataStore': links = layer.link_set.download().filter( name__in=settings.DOWNLOAD_FORMATS_VECTOR) else: links = layer.link_set.download().filter( name__in=settings.DOWNLOAD_FORMATS_RASTER) context_dict["links_download"] = links_download if settings.SOCIAL_ORIGINS: context_dict["social_links"] = build_social_links(request, layer) return render_to_response(template, RequestContext(request, context_dict))
def layer_detail(request, layername, template='layers/layer_detail.html'): layer = _resolve_layer(request, layername, 'base.view_resourcebase', _("You are not permitted to view this layer")) # assert False, str(layer_bbox) config = layer.attribute_config() # Add required parameters for GXP lazy-loading layer_bbox = layer.bbox bbox = [float(coord) for coord in list(layer_bbox[0:4])] config["srs"] = getattr(settings, 'DEFAULT_MAP_CRS', 'EPSG:900913') config["bbox"] = bbox if config["srs"] != 'EPSG:900913' \ else llbbox_to_mercator([float(coord) for coord in bbox]) config["title"] = layer.title config["queryable"] = True if layer.default_style: config["styles"] = layer.default_style.name if layer.storeType == "remoteStore": source_srid = None # Only grab the service proj/bbox if it is valid if None not in layer.service.bbox[0:4]: bbox = [float(coord) for coord in list(layer.service.bbox[0:4])] source_srid = layer.service.srid # Otherwise try the service directly # This is needed since previous services registered # did not store the bbox/srid in the model else: try: service_handler = get_service_handler( base_url=layer.service.base_url, service_type=layer.service.type) if getattr(service_handler.parsed_service, 'initialExtent', None): bbox[0] = service_handler.parsed_service.initialExtent[ 'xmin'] bbox[1] = service_handler.parsed_service.initialExtent[ 'ymin'] bbox[2] = service_handler.parsed_service.initialExtent[ 'xmax'] bbox[3] = service_handler.parsed_service.initialExtent[ 'ymax'] else: logger.info( 'Could not retrieve extent from service: {0}'.format( layer.service)) if getattr(service_handler.parsed_service, 'spatialReference', None): source_srid = \ service_handler.parsed_service.spatialReference[ 'latestWkid'] else: logger.info( 'Could not retrieve srid from service: {0}'.format( layer.service)) except Exception as e: logger.info('Failed to access service endpoint: {0}'.format( layer.service.base_url)) logger.info('Caught error: {0}'.format(e)) if source_srid is None: source_srid = layer.srid target_srid = 3857 if config["srs"] == 'EPSG:900913' else config["srs"] reprojected_bbox = bbox_to_projection(bbox, source_srid=source_srid, target_srid=target_srid) bbox = reprojected_bbox[:4] config['bbox'] = [float(coord) for coord in bbox] service = layer.service source_url = service.base_url use_proxy = (callable(uses_proxy_route) and uses_proxy_route(service.base_url)) components = urlsplit(service.base_url) query_params = None if components.query: query_params = OrderedDict( parse_qsl(components.query, keep_blank_values=True)) removed_query = [ components.scheme, components.netloc, components.path, None, components.fragment ] source_url = urlunsplit(removed_query) source_params = { "ptype": service.ptype, "remote": True, "url": source_url, "name": service.name, "use_proxy": use_proxy } if query_params is not None: source_params["params"] = query_params if layer.alternate is not None: config["layerid"] = layer.alternate maplayer = GXPLayer(name=layer.typename, ows_url=layer.ows_url, layer_params=json.dumps(config), source_params=json.dumps(source_params)) else: maplayer = GXPLayer(name=layer.typename, ows_url=layer.ows_url, layer_params=json.dumps(config)) # Update count for popularity ranking, # but do not includes admins or resource owners if request.user != layer.owner and not request.user.is_superuser: Layer.objects.filter(id=layer.id).update( popular_count=F('popular_count') + 1) # center/zoom don't matter; the viewer will center on the layer bounds map_obj = GXPMap( projection=getattr(settings, 'DEFAULT_MAP_CRS', 'EPSG:900913')) metadata = layer.link_set.metadata().filter( name__in=settings.DOWNLOAD_FORMATS_METADATA) granules = None all_granules = None filter = None if layer.is_mosaic: try: cat = gs_catalog cat._cache.clear() store = cat.get_store(layer.name) coverages = cat.mosaic_coverages(store) filter = None try: if request.GET["filter"]: filter = request.GET["filter"] except: pass offset = 10 * (request.page - 1) granules = cat.mosaic_granules( coverages['coverages']['coverage'][0]['name'], store, limit=10, offset=offset, filter=filter) all_granules = cat.mosaic_granules( coverages['coverages']['coverage'][0]['name'], store, filter=filter) except: granules = {"features": []} all_granules = {"features": []} context_dict = { "resource": layer, 'perms_list': get_perms(request.user, layer.get_self_resource()), "permissions_json": _perms_info_json(layer), "documents": get_related_documents(layer), "metadata": metadata, "is_layer": True, "wps_enabled": settings.OGC_SERVER['default']['WPS_ENABLED'], "granules": granules, "all_granules": all_granules, "filter": filter, } if 'access_token' in request.session: access_token = request.session['access_token'] else: u = uuid.uuid1() access_token = u.hex if bbox is not None: minx, miny, maxx, maxy = [float(coord) for coord in bbox] x = (minx + maxx) / 2 y = (miny + maxy) / 2 if layer.is_remote or getattr(settings, 'DEFAULT_MAP_CRS', 'EPSG:900913') == "EPSG:4326": center = list((x, y)) else: center = list(forward_mercator((x, y))) if center[1] == float('-inf'): center[1] = 0 BBOX_DIFFERENCE_THRESHOLD = 1e-5 # Check if the bbox is invalid valid_x = (maxx - minx)**2 > BBOX_DIFFERENCE_THRESHOLD valid_y = (maxy - miny)**2 > BBOX_DIFFERENCE_THRESHOLD if valid_x: width_zoom = math.log(360 / abs(maxx - minx), 2) else: width_zoom = 15 if valid_y: height_zoom = math.log(360 / abs(maxy - miny), 2) else: height_zoom = 15 map_obj.center_x = center[0] map_obj.center_y = center[1] map_obj.zoom = math.ceil(min(width_zoom, height_zoom)) context_dict["viewer"] = json.dumps( map_obj.viewer_json(request.user, access_token, *(default_map_config(request)[1] + [maplayer]))) context_dict["preview"] = getattr(settings, 'LAYER_PREVIEW_LIBRARY', 'leaflet') context_dict["crs"] = getattr(settings, 'DEFAULT_MAP_CRS', 'EPSG:900913') if layer.storeType == 'dataStore': links = layer.link_set.download().filter( name__in=settings.DOWNLOAD_FORMATS_VECTOR) else: links = layer.link_set.download().filter( name__in=settings.DOWNLOAD_FORMATS_RASTER) links_view = [ item for idx, item in enumerate(links) if item.url and 'wms' in item.url or 'gwc' in item.url ] links_download = [ item for idx, item in enumerate(links) if item.url and 'wms' not in item.url and 'gwc' not in item.url ] for item in links_view: if item.url and access_token: item.url = "%s&access_token=%s&time=%s" % \ (item.url, access_token, "0/9999") for item in links_download: if item.url and access_token: item.url = "%s&access_token=%s" % (item.url, access_token) if request.user.has_perm('view_resourcebase', layer.get_self_resource()): context_dict["links"] = links_view if request.user.has_perm('download_resourcebase', layer.get_self_resource()): if layer.storeType == 'dataStore': links = layer.link_set.download().filter( name__in=settings.DOWNLOAD_FORMATS_VECTOR) else: links = layer.link_set.download().filter( name__in=settings.DOWNLOAD_FORMATS_RASTER) context_dict["links_download"] = links_download if settings.SOCIAL_ORIGINS: context_dict["social_links"] = build_social_links(request, layer) return render_to_response(template, RequestContext(request, context_dict))