Geodjango距离查询未检索到正确的结果

时间:2017-07-18 11:26:57

标签: python django gis postgis geodjango

我试图根据地理位置的接近度检索一些帖子 正如您在代码中看到的,我使用的是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

2 个答案:

答案 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