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


今回は緯度と経度を求めて、一つの点の半径内で部屋を濾過します.
まず、グーグルマップに緯度と経度がどのように出力されているかを見てみましょう.
  • Googleマップ接続
  • F 12->more toolボタンをクリック->センサ
  • をクリック
    下図のように、特定の都市を選択し、私の位置に応じてグーグルマップを再閲覧します.
    ムンバイを選んだ


    じゃ、今半径を求めなければなりません.見なければなりませんか.
    xが現在位置である場合
    1871緯度を現在の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の誤差範囲内の値であれば、フィルタリングは成功するはずですか?

    要するに、緯度と経度の値を見つけることができます.