【发布时间】:2011-12-03 00:15:51
【问题描述】:
我正在处理一些相机数据。我有一些点,包括方位角、角度、距离,当然还有坐标场属性。在 postgresql postgis 中,我想用函数绘制这样的形状。
我怎样才能画出这个粉红色的范围形状? 一开始我应该画 360 度圆然后从我的形状中提取出来......我不知道怎么做?
【问题讨论】:
标签: postgresql openlayers postgis
我正在处理一些相机数据。我有一些点,包括方位角、角度、距离,当然还有坐标场属性。在 postgresql postgis 中,我想用函数绘制这样的形状。
我怎样才能画出这个粉红色的范围形状? 一开始我应该画 360 度圆然后从我的形状中提取出来......我不知道怎么做?
【问题讨论】:
标签: postgresql openlayers postgis
我会 create a circle 以您的半径距离围绕点 (x,y),然后使用下面的信息创建一个高度大于半径的三角形。
然后使用这两个多边形在两个几何图形之间进行 ST_Intersection。
注意:此方法仅在角度小于 180 度时有效。
请注意,如果您将外边缘延伸并与圆弧的中点成 90 度角相交,则您有一个角和一个相邻边。现在你可以 SOH CAH TOA!
设点 A = (x,y)
要获得最高点:
点 B = (x + 半径, y + (r * tan(角度)))
获取底点:
点 C = (x + 半径, y - (r * tan(角度)))
现在您有了三角形,您需要将它旋转到您的方位角,轴心点为 A。这意味着您在进行旋转时需要将 A 点放在原点。旋转是最棘手的部分。它一直用于计算机图形学。 (实际上,如果你知道 OpenGL,你可以让它为你做旋转。)
注意:此方法围绕原点逆时针旋转一个角度 (theta)。您可能需要相应地调整方位角。
第一步: translate 你的三角形,使 A(你原来的 x,y)在 0,0。无论您对 x 和 y 添加/减去什么,对其他两个点执行相同操作。
(你需要翻译它,因为你需要A点在原点)
第二步:然后使用旋转矩阵旋转点B和C。更多信息here,但我会给你公式:
Your new point is (x', y')
对 B 点和 C 点执行此操作。
第三步:通过加减将它们翻译回原处。如果你上次减去 x,这次就加上。
最后,使用点 {A,B,C} 创建一个三角形。
然后做一个ST_Intersection(geom_circle,geom_triangle);
因为这需要大量计算,所以最好编写一个程序来完成所有这些计算,然后填充一个表格。
【讨论】:
PostGIS 支持曲线,因此实现这一点的一种方法可能需要较少的数学运算,那就是执行以下操作:
SELECT ST_GeomFromText('COMPOUNDCURVE((0 0, 0 10), CIRCULARSTRING(0 10, 7.071 7.071, 10 0), (10 0, 0 0))')
这描述了一个原点为 0,0、半径为 10 度(地理坐标)、张角为 45° 的扇区。
使用附加函数将其从真实曲线转换为LINESTRING,降低坐标精度,并将其转换为 WKT:
SELECT ST_AsText(ST_SnapToGrid(ST_CurveToLine(ST_GeomFromText('COMPOUNDCURVE((0 0, 0 10), CIRCULARSTRING(0 10, 7.071 7.071, 10 0), (10 0, 0 0))')), 0.01))
给予:
这需要一些预先计算的信息(中心的位置、两个相邻的顶点以及线段边缘上的另一个点),但它具有实际生成真正弯曲的几何图形的明显优势.它也适用于张角大于 180° 的线段。
提示:示例中使用的7.071 x 和 y 位置可以这样计算:
x = {radius} cos {angle} = 10 cos 45 ≈ 7.0171y = {radius} sin {angle} = 10 sin 45 ≈ 7.0171角落案例:在反子午线和两极。
【讨论】: