GeoDjango 距离查询返回不正确的结果

Posted

技术标签:

【中文标题】GeoDjango 距离查询返回不正确的结果【英文标题】:GeoDjango distance queries returning incorrect results 【发布时间】:2011-10-14 18:59:48 【问题描述】:

我刚刚在我的开发机器上启动并运行了 GeoDjango。问题是我无法让距离查询正常工作。无论我使用什么 SRID,距离结果都是完全关闭的。这是一个例子。

>>> from django.contrib.gis.measure import D
>>> from app.models import Place
>>> from django.contrib.gis.geos import Point
>>> qs = Place.objects.all()
>>> point = Point(-118, 34)
>>> qs.filter(coordinates__distance_lte=(point, D(m=1)))
[<Place: 7-Eleven>, <Place: Arthur Murray Dance Studio>, <Place: Costco>, <Place: AMC Century City 15>, <Place: 24 Hour Fitness>, <Place: Ralphs>, <Place: Houston's Restaurant>, <Place: CVS/pharmacy>, <Place: Shaky Alibi>, <Place: Sephora>, <Place: Trader Joe's>]

问题是这些地方距离point远不止1m。

我尝试过使用它,但运气不佳。这是另一个 SRID 的示例。

>>> qs = Place.objects.all().transform(3786)
>>> point = Point(-118, 34, srid=3786)
>>> qs.filter(coordinates__distance_lte=(point, D(m=1)))
[<Place: 7-Eleven>, <Place: Arthur Murray Dance Studio>, <Place: Costco>, <Place: AMC Century City 15>, <Place: 24 Hour Fitness>, <Place: Ralphs>, <Place: Houston's Restaurant>, <Place: CVS/pharmacy>, <Place: Shaky Alibi>, <Place: Sephora>, <Place: Trader Joe's>]

我有一种感觉,我只是选择了错误的 SRID,但我在网上遇到的任何一个 SRID 都没有奏效,或者给出的任何响应都没有一点用处。

非常感谢任何帮助!

【问题讨论】:

你可能想在这里问gis.stackexchange.com 感谢您的提醒...没有意识到 StackExchange 有一个与 GIS 相关的问题的站点。想知道我是应该把它留在这里,还是等待模组移动它。 【参考方案1】:

我不想回答自己的问题,但没有其他人站出来,我想出了解决方案。

我深入研究了 PostGIS,以将问题隔离到位置数据库本身或 Django。因此,我将上面一直使用的 Django ORM 查询转换为我期望 PostGIS 后端接收的理想查询。令我惊讶的是,正在生成的查询相当于:

SELECT id
FROM app_place
WHERE ST_DWithin(coordinates, ST_SetSRID(ST_Point(-118, 34), 3768), 1);

这就是问题所在。我需要的查询是:

SELECT id
FROM app_place
WHERE ST_Distance_Sphere(ST_SetSRID(ST_Point(-118, 34), 3768), coordinates) < 1;

我阅读了 Django 源代码以了解这里发生了什么,我意识到我在 coordinates 字段上设置了 geography=True。显然,这改变了 Django 在创建 SQL 查询时生成的 PostGIS 函数。它没有记录,但这里是relevant section。

简而言之,如果您遇到此问题,请从您的模型中删除 geography=True,然后您就可以继续使用了。

【讨论】:

嗨,丹,我也遇到了类似的问题:gis.stackexchange.com/questions/14232/…。理论上距离计算应该在 geography=True 下更准确,并使用 ST_Distance_Spheroid。任何建议(除了删除 geography=True,这将使我回到第一方......)将是最有帮助的。谢谢

以上是关于GeoDjango 距离查询返回不正确的结果的主要内容,如果未能解决你的问题,请参考以下文章

休眠查询不返回正确的结果

SQL BETWEEN 查询返回不正确的结果

标准 SQL 查询在 BigQuery 中返回正确结果,但在 Data Studio 中不返回

MySQL ORDER BY 根据日期时间查询返回不正确的结果

Access 2007 - 左连接返回正确结果,内连接不返回任何结果

PostgreSQL:多个存在返回不正确的结果