Djangoには、ユーザーがデータベースエントリの指定された半径内にあるときにデータを返すと想定される位置認識サーバーがあります.. Pythonでコードスニペットが見つかりましたそれはちょうどオンライン(ここか他の場所では、私は本当に覚えていない)であり、私は0,0の座標に対してそれをテストしたときに動作するように見えました。私は今現在の場所から300メートル以内のデータベースエントリを持っており、半径は10キロメートルに設定されていますが、何らかの理由でサーバが結果を返すことはありません。私はこのコードで間違っているのですが、私はそれを修正する方法が全くわからないので、初心者はpythonにして、私のプロジェクトが完了するまで5日間のhaversineで私の要素から無力に失われてしまいました。ここ は、半正矢ベースのクエリのために私のコードです:Haversineベースのサーバーは、座標が完全一致の場合にのみデータを返します
class StoreList(generics.ListAPIView):
permission_classes = (permissions.IsAuthenticatedOrReadOnly,
IsOwnerOrReadOnly,)
serializer_class = StoreSerializer
def get_queryset(self):
lat = self.request.query_params.get('lat', None)
lon = self.request.query_params.get('lng', None)
if lat and lon:
lat = float(lat)
lon = float(lon)
# Haversine formula = https://en.wikipedia.org/wiki/Haversine_formula
lat1 = math.radians(lat) # lat in radians
lng1 = math.radians(lon) # lng in radians
lat2 = math.asin(math.sin(lat1)*math.cos(distance/R) +
math.cos(lat1)*math.sin(distance/R)*math.cos(bearing))
lng2 = lng1 + math.atan2(math.sin(bearing)*math.sin(distance/R)*math.cos(lat1),
math.cos(distance/R)-math.sin(lat1)*math.sin(lat2))
lat2 = math.degrees(lat2)
lng2 = math.degrees(lng2)
return Store.objects.filter(latitude__gte=lat1, latitude__lte=lat2)\
.filter(longitude__gte=lng1, longitude__lte=lng2)
この画像は、要求を受信したことを示し、座標は右ですが、結果セットが空のままである:(
が、結果セットが空のままであります –
@CoolBeans:データベースの内容を知らなくても何が起きているのかを知ることは難しいです。あなたのコードをもう一度見てみると、latitudeがlat1よりも大きい点をチェックしているように見えますが、元の点のlatitiudeではありません。元のポイントの緯度/経度を渡すのではなく、2つの新しい緯度と経度(NSEW境界の場合)を計算するために、haversineを使用したいと思うようです。 – BrenBarn
タンク..私は最終的に回避策を見つけることができました。答えは –