diff --git a/app/api/tasks.py b/app/api/tasks.py index 41625b8a..99b3ec57 100644 --- a/app/api/tasks.py +++ b/app/api/tasks.py @@ -17,6 +17,7 @@ from django.db import transaction from django.http import FileResponse from django.http import HttpResponse from django.http import StreamingHttpResponse +from django.contrib.gis.geos import Polygon from app.vendor import zipfly from rest_framework import status, serializers, viewsets, filters, exceptions, permissions, parsers from rest_framework.decorators import action @@ -175,7 +176,15 @@ class TaskViewSet(viewsets.ViewSet): for a in assets: query['available_assets__contains'] = "{" + a + "}" - # TODO bounding box filtering + bbox = request.query_params.get('bbox') + if bbox is not None: + try: + xmin, ymin, xmax, ymax = [float(v) for v in bbox.split(",")] + except: + raise exceptions.ValidationError("Invalid bbox parameter") + + geom = Polygon.from_bbox((xmin, ymin, xmax, ymax)) + query['orthophoto_extent__intersects'] = geom tasks = self.queryset.filter(**query) tasks = filters.OrderingFilter().filter_queryset(self.request, tasks, self) diff --git a/app/static/app/js/components/MapPreview.jsx b/app/static/app/js/components/MapPreview.jsx index 5244564c..dbfc9e8a 100644 --- a/app/static/app/js/components/MapPreview.jsx +++ b/app/static/app/js/components/MapPreview.jsx @@ -226,13 +226,13 @@ _('Example:'), } computeBbox = exifData => { - // minx, maxx, miny, maxy - let bbox = [Infinity, -Infinity, Infinity, -Infinity]; + // minx, miny, maxx, maxy + let bbox = [Infinity, Infinity, -Infinity, -Infinity]; exifData.forEach(ed => { if (ed.gps){ bbox[0] = Math.min(bbox[0], ed.gps.longitude); - bbox[1] = Math.max(bbox[1], ed.gps.longitude); - bbox[2] = Math.min(bbox[2], ed.gps.latitude); + bbox[1] = Math.min(bbox[1], ed.gps.latitude); + bbox[2] = Math.max(bbox[2], ed.gps.longitude); bbox[3] = Math.max(bbox[3], ed.gps.latitude); } }); diff --git a/app/static/app/js/components/NewTaskPanel.jsx b/app/static/app/js/components/NewTaskPanel.jsx index f63becfd..9ea64ed7 100644 --- a/app/static/app/js/components/NewTaskPanel.jsx +++ b/app/static/app/js/components/NewTaskPanel.jsx @@ -76,11 +76,10 @@ class NewTaskPanel extends React.Component { } loadAlignTasks = (bbox) => { - // TODO: filter by bbox this.setState({alignTasks: [], alignTo: "auto", loadingAlignTasks: true}); this.alignTasksRequest = - $.getJSON(`/api/projects/${this.props.projectId}/tasks/?ordering=-created_at&status=${statusCodes.COMPLETED}&available_assets=georeferenced_model.laz`, tasks => { + $.getJSON(`/api/projects/${this.props.projectId}/tasks/?ordering=-created_at&status=${statusCodes.COMPLETED}&available_assets=georeferenced_model.laz&bbox=${bbox.join(",")}`, tasks => { if (Array.isArray(tasks)){ this.setState({loadingAlignTasks: false, alignTasks: tasks}); }else{ @@ -179,7 +178,6 @@ class NewTaskPanel extends React.Component { handleImagesBboxChange = (bbox) => { if (this.props.showAlign){ - console.log("TODO! Load alignment tasks that fit within", bbox); this.loadAlignTasks(bbox); } }