在PostGIS中创建圈?


22

我正在使用SRID:900913中的几何图形的PostGIS 1.5.2。我需要创建一个以点列表为中心的圆,半径为600公里。我正在使用此查询:

INSERT INTO circles (geom) (
   SELECT ST_Buffer(point, 600000, 'quad_segs=8') 
   FROM points
);

但是创建的圆的半径不超过600公里(半径接近此长度,但不完全相同)。

还有其他在PostGIS中创建圆的方法吗?

注意:所代表的信息来自西班牙。正确的投影是4326,但是客户端使用Google栅格,因此我将数据存储在900913中,以避免重新投影并提高性能。


1
您如何测量半径以找出它们不是600公里?
昏暗

1
@underdark我知道两个城市之间的距离以及以该城市之一为中心生成的圆并不延伸到其他城市。我使用gmap-pedometer.com
angelcervera 2011年


@underdark使用SELECT ST_Distance( (select point from points where id = 7), (select point from points where id = 42));返回的距离超过gmap-pedometer.com的100 km,但是如果我认为此长度正确,则圆半径是完美的。但是人们使用第一个距离作为半径,而不使用st_distance返回的距离。可以将第一距离转换为第二距离吗?
angelcervera 2011年

Answers:


15

尝试这个:

 SELECT ST_Transform(geometry( 
            ST_Buffer(geography( 
                ST_Transform( point, 4326 )), 
                600000)), 
            900913) FROM points`

这会翻转到地理区域,然后使用内置的SRID选择(具有讽刺意味的是)翻转回几何体,在该几何体中运行良好的平面缓冲区,然后翻转。墨卡托方法的麻烦在于墨卡托无法保持距离。使用更合适的局部投影可获得更好的结果,而上述方法就是这种情况。


4

您可以增加quad_seg值以获得更准确的圆。要获得真实的圆,您必须使用弯曲的几何类型,但是我不知道什么软件可以显示出来。

srid 90013的准确性也很差,因为它是覆盖整个世界的投影。

使用局部投影可以获得更准确的结果。


@ nicklas-aven因为我使用的是900913投影而不是4326,所以在600km的距离中可能有100km的差异吗?
angelcervera 2011年

1
对的,这是可能的。gis.stackexchange.com/questions/3264/…令我无法相信时,请Pauls评论她。问题是没有计划4326。
尼克拉斯·阿芬(NicklasAvén)2011年

3

这取决于您创建圈子的位置。他们是在赤道附近还是在两极附近?

看一下这张地图。您认为Antartica或格陵兰真的那么大吗?那就是您使用的投影,对不对?

我建议您快速阅读此USGS文档中有关预测的内容,尤其是下表,该表格可让您快速了解哪些预测适用于哪些情况。

毕竟,我想我应该终于回答您的问题了:)

尼克拉斯说的是很好的建议。是否有适合您当地的特定投影效果?

否则,您可能需要查看新的PostGIS Geography类型。但是,最合适的答案取决于您的数据位于何处。

更新:从现在开始,我们知道您的数据在西班牙,您是否打算将其存储在UTM Zone 31N之类的本地投影中,使用它进行操作,然后再将其投影回Google Web Mercator?


1
+1:将地理类型用于覆盖大面积区域的地图。这里的问题是postgis中没有用于地理类型的本地缓冲区功能。但是有一个内置的强制转换为“最佳填充”,先构建缓冲区,然后再返回4326。因此,了解数据并手动选择填充可以更好地控制。
NicklasAvén2011年

尼克拉斯(Nicklas),您对演员表的判断是正确的,并且我同意100%的当地预测(即知道您的数据)。不过,如果答案是他只想拥有“全球”数据,恕我直言,那么地理类型内部的转换逻辑将在确定哪种SR适用于该特定距离操作而不是其他任何方法方面做得更好。复杂的自定义逻辑。关于地理类型的另一件好事是,尽管当前许多操作都被转换为笛卡尔数学,但这些操作仍在不断更新以使用球面数学。
2011年

2

您可以使用新的SQL / MM Part 3几何类型CIRCULARSTRING和/或CURVEPOLYGON。

但是,请注意,内部函数和外部程序都对此类型的支持是有限的。您可以使用ST_CurveToLine对其进行可视化。

此外,这有点令人反感(从PostGIS 2.0 svn开始),SELECT ST_Area('CURVEPOLYGON(CIRCULARSTRING(2 1, 1 2, 0 1, 1 0, 2 1))'::geometry)只是π的粗略近似。(将的3.14033115695475与3.14159265358979进行比较pi())。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.