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

时间:2015-01-27 19:26:14

标签: geospatial postgis postgresql-9.3 spatial-query spatial-index

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

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))

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

2 个答案:

答案 0 :(得分:5)

没有Postgis类型来表示具有100%准确度的圆,即具有中心点和半径,与SQL Server的circular arcs一样。正如评论中所指出的,您可以使用ST_Buffer的第二种形式(即ST_Buffer(point, distance, num_seg_quarter_circle))来近似圆圈。随着增加第3个参数,您将更接近实际圆,代价是更大的计算时间和存储空间。 缓冲点的返回类型将是Polygon,从运行中可以看出,如:

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

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

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

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

对于num_seg_quarter_circle的不同值并与PI进行比较,您可以了解您与真实圆圈的距离。

答案 1 :(得分:0)

如果您需要确定某物是否在另一个物体的距离内,请使用ST_DWithin。您甚至可以通过使用空间索引来加快速度。

如果这是你的用例,那么对多面体v。circle的讨论是无关紧要的。缓冲将始终具有少量误差,因为它很复杂(例如,段的数量和其他参数)。 ST_Buffer只是真实精确缓冲区的近似值。缓冲在计算上也更加昂贵。请参阅a good discussion on gis.SEuseful tip for newbies

相关问题