在 Geodjango + Postgres 中存储一个圆圈

Posted

技术标签:

【中文标题】在 Geodjango + Postgres 中存储一个圆圈【英文标题】:Store a Circle in Geodjango + Postgres 【发布时间】:2012-06-12 01:31:51 【问题描述】:

希望在 geodjango 字段中存储一个圆,以便我可以使用 geodjango 查询 __contains 来确定一个点是否在圆中(类似于使用 PolygonField 可以完成的操作)。

目前将其存储为十进制半径和 GeoDjango 点字段,但需要一种方法来查询数据库中的位置列表,以便这些不同的圆(点字段和半径)包含我的搜索点(长/纬度)。

希望它有意义。

【问题讨论】:

如果圆方程是 (X-H)square2+(Y-K)square2=Rsquare2。如果 (H,K) 是 GeoDjango pointField 并且 R 是十进制并且所有这些圆圈都存储在 DB 中。如果我用搜索点(A,B)查询,我应该能够知道它将落在我的数据库中的哪个圆圈。 同***.com/questions/1627520/… 不太确定我是否会为这种类型的逻辑使用“包含”。你的圆将有一个中心点和一个半径......'点和圆心之间的距离小于半径'的逻辑应该起作用而不是'包含'。 【参考方案1】:

从技术上讲,PostGIS 支持CurvePolygonCircularString 几何类型,可用于存储曲线几何。例如,在 x=10, y=10 周围的 2 个单位半径已由 64 点缓冲多边形近似为:

SELECT ST_AsText(ST_LineToCurve(ST_Buffer(ST_MakePoint(10, 10), 2, 16)));
                   st_astext
------------------------------------------------
 CURVEPOLYGON(CIRCULARSTRING(12 10,8 10,12 10))
(1 row)

但是,这种方法通常不会使用,因为对这种几何类型的支持非常有限(即,ST_AsSVG,其他方法不起作用)。这些几何类型可能会造成很多麻烦,我建议不要这样做。

通常,所有几何图形都存储为受良好支持的类型:POINTLINESTRINGPOLYGON(带有可选的 MULTI- 前缀)。对于这些类型,使用ST_DWithin function(例如,GeoDjango 调用此 __dwithin,另请参见this question)来查询另一个几何图形是否在指定距离内。例如,如果您有一个点位置,您可以查看其他几何图形是否在距该点一定距离(即半径)内。

【讨论】:

以上是关于在 Geodjango + Postgres 中存储一个圆圈的主要内容,如果未能解决你的问题,请参考以下文章

Django 仅使用 Sqlite 按距离过滤(无 GeoDjango、PostGres、MySQL、GIS)

Postgis / Geodjango:无法确定数据库的 PostGIS 版本

GeoDjango:无法导入名称 GEOSException 已修复,现在 [WinError 126]

使用 django.contrib.gis.measure.D 时 GeoDjango dwithin 错误

在 OSX 上缺少 libgeos_c.so

Heoku Postgres 的问题“无法访问文件“$libdir/postgis-2.1”