[drf]airbnb-api -17 Searching(feat..latitude and longitude)

Hyeseong·2021년 3월 31일
0
post-thumbnail

이번에 해볼 것은 위도와 경도를 구하여 한 지점의 반경안에서 방을 필터링 하도록하는거에요.

우선 구글 맵에서 어떻게 위도와 경도가 출력되는지 확인 해볼게요.

  • 구글 맵 접속
  • F12클릭 -> more tool버튼 클릭 -> sensor클릭

아래와 같이 특정 도시를 선택하여 나의 위치를 기준으로 구글맵을 다시 조회하면 나타나는데요.
저는 뭄바이로 했어요.

그럼 이제 반경을 구해야 봐야겠조?

x를 현재 위치라고 한다면

18<x<19까지 위도의 지점 모두를 잡아내고.
71<y<73까지 경도의 지점을 모두 찾아냅니다.

만약 위도를 현재 19에서 20으로 증가시키면 뭄바이를 벗어나서 Umargam 지역으로 바뀌는 만큼 1단위가 얼마나 큰 차이인지 알게되요. 그래서 범위를 한정하려면 소수점 단위로 가야할 것 같조?

그래서

    @action(detail=False)
    def search(self, request):
        max_price = request.GET.get('max_price',None)
        min_price = request.GET.get('min_price',None)
        beds = request.GET.get('beds',None)
        bedsrooms = request.GET.get('bedsrooms',None)
        bathrooms = request.GET.get('bathrooms',None)
        lat = request.GET.get('lat',None) # 위도 
        lng = request.GET.get('lng',None) # 경도
        
        filter_kwargs = {}

        if max_price is not None:
            filter_kwargs['price__lte'] = max_price
        if min_price is not None:
            filter_kwargs['price__gte'] = min_price
        if beds is not None:
            filter_kwargs['beds__gte'] = beds
        if bedsrooms is not None:
            filter_kwargs['bedsrooms__gte'] = bedsrooms
        if bathrooms is not None:
            filter_kwargs['bathrooms__gte'] = bathrooms
        if lat is not None and lng is not None:  			# 추가
            filter_kwargs['lat__gte'] = float(lat) - 0.005 # 추가
            filter_kwargs['lat__lte'] = float(lat) + 0.005 # 추가
            filter_kwargs['lng__gte'] = float(lng) - 0.005  # 추가
            filter_kwargs['lng__lte'] = float(lng) + 0.005 # 추가

        paginator = self.paginator # 기존 정의된 paginator를 끌어다 쓰기만 하면됨.
        try:
            rooms = Room.objects.filter(**filter_kwargs)
        except ValueError: # value값이
            rooms = Room.objects.all()
        results = paginator.paginate_queryset(rooms, request)
        serializer = RoomSerializer(results, many=True)
        return paginator.get_paginated_response(serializer.data)

filter_kwargs['lat__gte'] = float(lat) - 0.005 이 부분에 float이라고 되어있는데요. lat의 데이터타입을 찍어보면 str로 문자이기 때문이에요.

아무 방이나 정보를 위도와 경도 값으로 디테일하게 입력할 게요.

그런 다음 입력했던 값을 그대로 쿼리 파라미터로 해서 조회하면 되요.

이번에는 lat의 값을 조금 축소시킨 범위에서 찾아 볼게요.
0.005의 오차 범위 내의 값이라면 필터링에 성공되어야 겠조?

결론적으로 이를 통해서 latitude와 longitude값을 찾을 수 있어요.

profile
어제보다 오늘 그리고 오늘 보다 내일...

0개의 댓글