Dan*_*erz 8 python django postgresql postgis geodjango
我刚刚在我的开发机器上启动并运行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>]
Run Code Online (Sandbox Code Playgroud)
问题是这些地方远离1米远point.
我试着玩弄它,但运气不好.这是另一个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>]
Run Code Online (Sandbox Code Playgroud)
我有一种感觉,我只是选择了错误的SRID,但没有一个我在网上遇到的SRID工作,或者给出了任何甚至适度有用的响应.
任何帮助是极大的赞赏!
我讨厌回答我自己的问题,但是没有其他人加入到我的盘子里,我想出了解决方案.
我深入研究PostGIS,将问题与位置数据库本身或Django隔离开来.所以我将上面使用的Django ORM查询转换为我希望PostGIS后端接收的理想查询.令我惊讶的是,正在生成的查询等同于:
SELECT id
FROM app_place
WHERE ST_DWithin(coordinates, ST_SetSRID(ST_Point(-118, 34), 3768), 1);
Run Code Online (Sandbox Code Playgroud)
那就是问题所在.我需要的查询是:
SELECT id
FROM app_place
WHERE ST_Distance_Sphere(ST_SetSRID(ST_Point(-118, 34), 3768), coordinates) < 1;
Run Code Online (Sandbox Code Playgroud)
我通读了Django来源,弄清楚这里发生了什么,我意识到我已经开始geography=True了我的coordinates领域.显然,这会改变Django在创建SQL查询时生成的PostGIS函数.它没有文档,但这是相关部分.
简而言之,如果您遇到此问题,请geography=True从您的模型中移除,您应该很高兴.