DECLARE @g1 geometry;
DECLARE @g2 geometry;
SET @g1 = geometry::STGeomFromText('LINESTRING(1 1, 5 1, 3 5, 1 1)', 0);
SET @g2 = geometry::STGeomFromText('CIRCULARSTRING(1 1, 3 1, 5 1, 4 3, 3 5, 2 3, 1 1)', 0);
IF @g1.STIsValid() = 1 AND @g2.STIsValid() = 1
BEGIN
SELECT @g1.ToString(), @g2.ToString()
SELECT @g1.STLength() AS [LS Length], @g2.STLength() AS [CS Length]
请注意,CircularString 实例需要七个点来定义三角形。 LineString 实例只需要四个点定义三角形。 原因是 CircularString 实例存储的是圆弧线段而非直线线段。 存储在 CircularString 实例中的三角形的边是 ABC、CDE 和 EFA。 存储在 LineString 实例中的三角形的边是 AC、CE 和 EA。
请考虑以下示例:
SET @g1 = geometry::STGeomFromText('LINESTRING(0 0, 2 2, 4 0)', 0);
SET @g2 = geometry::STGeomFromText('CIRCULARSTRING(0 0, 2 2, 4 0)', 0);
SELECT @g1.STLength() AS [LS Length], @g2.STLength() AS [CS Length];
下面是结果集。
LS Length CS Length
5.65685... 6.28318...
与 LineString 实例相比,CircularString 实例使用更少的点来存储曲线边界,而且更精确。 CircularString 实例对于存储圆边界(如针对特定点的 20 英里搜索半径)很有用。 LineString 实例则适合存储线性边界(如方形城市街区)。
LineString 和 CompoundCurve 的比较
以下代码示例显示如何使用 LineString 和 CompoundCurve 实例存储相同的图形:
SET @g = geometry::Parse('LINESTRING(2 2, 4 2, 4 4, 2 4, 2 2)');
SET @g = geometry::Parse('COMPOUNDCURVE((2 2, 4 2), (4 2, 4 4), (4 4, 2 4), (2 4, 2 2))');
SET @g = geometry::Parse('COMPOUNDCURVE((2 2, 4 2, 4 4, 2 4, 2 2))');
在上述示例中, LineString 实例或 CompoundCurve 实例都可以存储该图形。 下一个示例使用 CompoundCurve 存储饼图切片:
SET @g = geometry::Parse('COMPOUNDCURVE(CIRCULARSTRING(2 2, 1 3, 0 2),(0 2, 1 0, 2 2))');
CompoundCurve 实例可以直接存储圆弧线段 (2 2, 1 3, 0 2),但是 LineString 实例则必须将曲线转换为几个更小的直线线段。
CircularString 和 CompoundCurve 的比较
以下代码示例显示如何将饼图切片存储在 CircularString 实例中:
DECLARE @g geometry;
SET @g = geometry::Parse('CIRCULARSTRING( 0 0, 1 2.1082, 3 6.3246, 0 7, -3 6.3246, -1 2.1082, 0 0)');
SELECT @g.ToString(), @g.STLength();
如果使用 CircularString 实例存储饼图切片,要求每个直线线段使用三个点。 如果一个中间点未知,必须计算它或必须将直线线段的端点加倍,如以下代码段所示:
SET @g = geometry::Parse('CIRCULARSTRING( 0 0, 3 6.3246, 3 6.3246, 0 7, -3 6.3246, 0 0, 0 0)');
CompoundCurve 实例允许 LineString 和 CircularString 组件,因此只需要知道饼图切片的直线线段的两个点。 此代码示例显示如何使用 CompoundCurve 存储相同的图形:
DECLARE @g geometry;
SET @g = geometry::Parse('COMPOUNDCURVE(CIRCULARSTRING( 3 6.3246, 0 7, -3 6.3246), (-3 6.3246, 0 0, 3 6.3246))');
SELECT @g.ToString(), @g.STLength();
Polygon 和 CurvePolygon 的比较
在定义外部环和内部环时,CurvePolygon 实例可以使用 CircularString 和 CompoundCurve。 Polygon 实例不能。
空间数据 (SQL Server)
geometry 数据类型方法引用
geography 数据类型方法引用
STNumCurves(geometry 数据类型)
STNumCurves(geography 数据类型)
STGeomFromText(geometry 数据类型)
STGeomFromText(geography 数据类型)
Coming soon: Throughout 2024 we will be phasing out GitHub Issues as the feedback mechanism for content and replacing it with a new feedback system. For more information see: https://aka.ms/ContentUserFeedback.
提交和查看相关反馈