[drf]airbnb-api -17 Searching(feat..latitude and longitude)
10479 ワード
今回は緯度と経度を求めて、一つの点の半径内で部屋を濾過します.
まず、グーグルマップに緯度と経度がどのように出力されているかを見てみましょう. Googleマップ接続 F 12->more toolボタンをクリック->センサ をクリック
下図のように、特定の都市を選択し、私の位置に応じてグーグルマップを再閲覧します.
ムンバイを選んだ
じゃ、今半径を求めなければなりません.見なければなりませんか.
xが現在位置である場合
1871緯度を現在の19から20に増やせば、ムンバイを離れてUmargam地区に移ると、1つの単位にどれだけの違いがあるかがわかります.だから範囲を限定するなら小数点単位だと思いますか?
だから.
緯度と経度値でどの部屋の情報も詳しく入力します.
そして入力した値をクエリーパラメータとしてクエリーすればいいです.
今回はlatの値を少し縮める範囲で探してみました.
0.005の誤差範囲内の値であれば、フィルタリングは成功するはずですか?
要するに、緯度と経度の値を見つけることができます.
まず、グーグルマップに緯度と経度がどのように出力されているかを見てみましょう.
下図のように、特定の都市を選択し、私の位置に応じてグーグルマップを再閲覧します.
ムンバイを選んだ
じゃ、今半径を求めなければなりません.見なければなりませんか.
xが現在位置である場合
18
だから.
@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の誤差範囲内の値であれば、フィルタリングは成功するはずですか?
要するに、緯度と経度の値を見つけることができます.
Reference
この問題について([drf]airbnb-api -17 Searching(feat..latitude and longitude)), 我々は、より多くの情報をここで見つけました https://velog.io/@hyeseong-dev/drfairbnb-api-17-Searchingfeat..latitude-and-longitudeテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol