我试图根据地理位置的接近度检索一些帖子 正如您在代码中看到的,我使用的是GeoDjango,代码在视图中执行 问题是距离过滤器似乎完全被忽视了。
当我检查查询集上的距离时,我得到了预期的距离(1米和18公里),但是不应该检索18公里的帖子。
def get(self, request, format=None):
latlon=request.query_params
pnt = GEOSGeometry('SRID=28992;POINT(%s %s)'%(latlon['lat'],latlon['lon']))
posts = Post.objects.filter(point__distance_lte=(pnt, D(km=1)))
serialized = PostSerializer(posts, many=True)
for post in posts:
distance = pnt.distance(post.point)
print("Km distance:",distance * 100)
return JsonResponse(serialized.data, safe=False)
结果:
Km distance: 0.00015231546206626192
Km distance: 18.317378752081577
[18/Jul/2017 13:24:35] "GET /api/posts/?lon=5.8372264&lat=51.8125626 HTTP/1.1" 200 144
答案 0 :(得分:1)
我相信您的问题源于您创造点的reverse order of lat
and lon
。
作为旁注,我更喜欢使用Point()
方法创建点:
ptn = Point(x=latlon['lon'], y=latlon['lat'], srid=28992)
根据此评论进行修改:
我尝试过初始化程序,对我来说似乎是对的,谢谢。然而,似乎并没有解决这个问题。它几乎看起来默认距离单位是十米节,因为这可以正常工作。
posts = Post.objects.filter(point__distance_lte=(pnt, 0.05))
此搜索范围为5公里 - 埃文
由于上述问题并未解决您的问题,我将假设dwithin
's know problem with Distance
objects也适用于distance
个问题。
如上面链接的解决方案中所述,几何字段默认为WGS84,其中degrees
为默认度量单位。
0.05 degrees ~= 5 km
,这就是您的解决方案正常运行的原因。
也许geodjango团队应该被告知这一点?
答案 1 :(得分:0)
相同的SRID?我正在使用它,但是
source = models.PointField(geography=True, srid=4326)
然后在经理中:
def starts_within_range_of(self, my_start, distance):
ret_value = self.filter(
source__distance_lte=(my_start, distance))
return ret_value
但总是4326