views.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. from rest_framework import viewsets
  2. from django.conf import settings
  3. from panorama.models import Point, Panorama, ReferencePoint, Reference
  4. from .serializers import *
  5. class ReferencePointViewSet(viewsets.ModelViewSet):
  6. queryset = ReferencePoint.objects.all()
  7. serializer_class = ReferencePointSerializer
  8. def get_queryset(self):
  9. """
  10. Allow to filter reference points, by only considering those in a
  11. disc around a given geographic position.
  12. Example filter:
  13. /api/v1/refpoints/?lat=42&lon=42&dist=10000
  14. returns all reference points around (42°, 42°) at less than 10
  15. kilometers.
  16. """
  17. queryset = ReferencePoint.objects.all()
  18. lat = self.request.QUERY_PARAMS.get('lat', None)
  19. lon = self.request.QUERY_PARAMS.get('lon', None)
  20. # In meters
  21. distance = self.request.QUERY_PARAMS.get('dist', None)
  22. if distance is not None:
  23. distance = int(distance)
  24. else:
  25. distance = settings.PANORAMA_MAX_DISTANCE
  26. if lat is not None and lon is not None:
  27. p = Point(float(lat), float(lon), 0)
  28. # Filter refpoints based on their (great circle) distance to
  29. # the parameter point. The database can't do it, so we load
  30. # all objects and filter them in Python.
  31. refpoints = [refpoint.id for refpoint in ReferencePoint.objects.all()
  32. if p.great_circle_distance(refpoint) <= distance]
  33. queryset = queryset.filter(id__in=refpoints)
  34. return queryset
  35. class PanoramaViewSet(viewsets.ModelViewSet):
  36. queryset = Panorama.objects.all()
  37. serializer_class = PanoramaSerializer
  38. class ReferenceViewSet(viewsets.ModelViewSet):
  39. queryset = Reference.objects.all()
  40. serializer_class = ReferenceSerializer