<p>所以。。我发现算法哪里出错了。。感谢@ncole458的帖子<a href="https://gist.github.com/ncole458/9a934dc937e78d2ba268" rel="nofollow">Answer source</a></p>
<p>以下是功能齐全的服务器代码:</p>
<pre><code>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))
lat1 = math.degrees(lat1)
lat2 = math.degrees(lat2)
lat2 = math.degrees(lat2)
lng2 = math.degrees(lng2)
"""
lat1 = lat - math.degrees(distance / R)
lat2 = lat + math.degrees(distance / R)
lng1 = lon - math.degrees(distance / R / math.cos(math.degrees(lat)))
lng2 = lon + math.degrees(distance / R / math.cos(math.degrees(lat)))
return Store.objects.filter(latitude__gte=lat1, latitude__lte=lat2)\
.filter(longitude__gte=lng1, longitude__lte=lng2)
</code></pre>