我可以将圆形和多边形存储在 postgis 中相同的空间索引列中吗?

Can I store circle and polygon within the same spatially indexed column in postgis?

根据他们的文档,空间对象可以是以下

POINT(0 0)

LINESTRING(0 0,1 1,1 2)

POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1))

MULTIPOINT(0 0,1 2)

MULTILINESTRING((0 0,1 1,1 2),(2 3,3 2,5 4))

MULTIPOLYGON(((0 0,4 0,4 4,0 4,0 0),(1 1,2 1,2 2,1 2,1 1)), ((-1 -1,-1 -2,-2 -2,-2 -1,-1 -1)))

GEOMETRYCOLLECTION(POINT(2 3),LINESTRING(2 3,3 4))

但是,没有圆类型,我只能在其中存储一个点及其半径。并且具有相同的功能,当我查询该点是否存在于其中时,我可以获得该圆的边界框。

没有 Postgis 类型可以 100% 准确地表示圆,即具有中心点和半径,SQL 服务器的 circular arcs. As pointed out in the comments, you can approximate a circle with the 2nd form of ST_Buffer,即 ST_Buffer(point, distance, num_seg_quarter_circle).当你增加第三个参数时,你会更接近一个实际的圆,代价是更多的计算时间和存储 space。 return类型的buffering a point会是Polygon,从运行ning可以看出,类似:

SELECT ST_GeometryType(ST_Buffer(ST_MakePoint(0,0),100));

我个人的看法是,虽然允许使用圆弧类型可能会提高涉及圆的计算精度,但它也会使事情复杂化,因为您不再处理完全由点、线串和多边形组成的几何对象(后者二,也是由点组成)。

你总是可以 运行 测试增加 ST_Buffer 的第三个参数,直到你得到一个可以接受的结果,但考虑到空间中固有的其他不准确性,例如地球被近似为大地水准面,我认为像这样近似地理围栏引起的问题很少见。如果你运行,

SELECT ST_Area(ST_Buffer(ST_MakePoint(0, 0), 1, num_segments));

对于 num_seg_quarter_circle 的不同值并与 PI 进行比较,您可以了解您与真实圆的接近程度。

如果您只需要确定某物是否在另一物的距离之内,请使用 ST_DWithin。您甚至可以使用空间索引使其更快。

如果这是您的用例,那么关于多边形与圆形的讨论就无关紧要了。缓冲总是会有少量错误,因为它很复杂(例如段数和其他参数)。 ST_Buffer 只是真实、准确缓冲区的近似值。缓冲在计算上也更加昂贵。参见 a good discussion on gis.SE, and a useful tip for newbies