Skip to content

适用虚谷数据库版本

v12.9



适用虚谷数据库版本

v12.9


ST_OFFSETCURVE

📄字数 2.9K
👁️阅读量 加载中...

功能描述

返回距输入线给定距离和方向的偏移线。

语法格式

sql
GEOMETRY ST_OFFSETCURVE(GEOMETRY line, DOUBLE signed_distance, varchar style_parameters='');

参数说明

  • line:目标 LINE 对象。
  • signed_distance:距离
  • style_parameters:样式参数,以空格分隔的键=值对字符串。可选,默认为 NULL。
    • 'quad_segs=#' :用于近似四分之一圆的线段数(默认为 8)。
    • 'join=round|mitre|bevel' :连接样式(默认为“round”)。
    • 'mitre_limit=#.#' :斜接比率限制,仅影响斜接连接样式。

函数返回类型

GEOMETRY 类型

使用说明

  1. 返回几何图形的所有点与输入几何图形的距离不超过给定距离。
  2. 对于计算围绕中心线的平行线很有用。
  3. 对于正距离,偏移位于输入线的左侧并保持相同的方向。 对于负距离,它位于右侧且方向相反。
  4. 距离单位以空间参考系的单位来测量。
  5. 请注意,对于某些拼图形状的输入几何图形,输出可能是 MULTILINESTRING 或 EMPTY。
  6. 此函数是由 GEOS 模块执行的。
  7. 此函数忽略 Z 维度。 即使在 3D 几何体上使用时,它也始终给出 2D 结果。

示例

15、'quad_segs=4 join=round' 原始线及其偏移 15 个单位:

sql
SQL> SELECT ST_AsText(ST_OffsetCurve(ST_GeomFromText(
     'LINESTRING(164 16,144 16,124 16,104 16,84 16,64 16,
         44 16,24 16,20 16,18 16,17 17,
         16 18,16 20,16 40,16 60,16 80,16 100,
         16 120,16 140,16 160,16 180,16 195)'),
         15, 'quad_segs=4 join=round'));

+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                                                                                                                                EXPR1                                                                                                                                                                |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| LINESTRING(164 1,18 1,15.073645169758077 1.288220793951544,12.259748514523654 2.141807012330698,9.66644650470597 3.527955815461818,7.393398282201788 5.393398282201788,5.393398282201788 7.393398282201788,3.527955815461818 9.66644650470597,2.141807012330696 12.259748514523654,1.288220793951544 15.073645169758075,1 18,1 195) |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

(1 row)

-15, 'quad_segs=4 join=round' 原始线及其偏移量-15个单位:

sql
SQL> SELECT ST_AsText(ST_OffsetCurve(geom,
         -15, 'quad_segs=4 join=round')) As notsocurvy
     FROM (SELECT ST_GeomFromText(
     'LINESTRING(164 16,144 16,124 16,104 16,84 16,64 16,
         44 16,24 16,20 16,18 16,17 17,
         16 18,16 20,16 40,16 60,16 80,16 100,
         16 120,16 140,16 160,16 180,16 195)') As geom);

+---------------------------------+
|           NOTSOCURVY            |
+---------------------------------+
| LINESTRING(164 31,31 31,31 195) |
+---------------------------------+

(1 row)

双偏移以获得更多曲线,请注意第一个反转方向,因此 -30+15 = -15:

sql
SQL> SELECT ST_AsText(ST_OffsetCurve(ST_OffsetCurve(geom,
         -30, 'quad_segs=4 join=round'), -15, 'quad_segs=4 join=round')) As morecurvy
     FROM (SELECT ST_GeomFromText(
     'LINESTRING(164 16,144 16,124 16,104 16,84 16,64 16,
         44 16,24 16,20 16,18 16,17 17,
         16 18,16 20,16 40,16 60,16 80,16 100,
         16 120,16 140,16 160,16 180,16 195)') As geom);

+---------------------------------+
|            MORECURVY            |
+---------------------------------+
| LINESTRING(164 61,61 61,61 195) |
+---------------------------------+

(1 row)

双偏移以获得更多曲线,与常规偏移 15 结合以获得平行线。 与原图重叠。

sql
SQL> SELECT ST_AsText(ST_Collect(
         ST_OffsetCurve(geom, 15, 'quad_segs=4 join=round'),
         ST_OffsetCurve(ST_OffsetCurve(geom,
         -30, 'quad_segs=4 join=round'), -15, 'quad_segs=4 join=round')
         )) As parallel_curves
         FROM (SELECT ST_GeomFromText(
     'LINESTRING(164 16,144 16,124 16,104 16,84 16,64 16,
         44 16,24 16,20 16,18 16,17 17,
         16 18,16 20,16 40,16 60,16 80,16 100,
         16 120,16 140,16 160,16 180,16 195)') As geom);

+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                                                                                                                                         PARALLEL_CURVES                                                                                                                                                                          |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| MULTILINESTRING((164 1,18 1,15.073645169758077 1.288220793951544,12.259748514523654 2.141807012330698,9.66644650470597 3.527955815461818,7.393398282201788 5.393398282201788,5.393398282201788 7.393398282201788,3.527955815461818 9.66644650470597,2.141807012330696 12.259748514523654,1.288220793951544 15.073645169758075,1 18,1 195),(164 61,61 61,61 195)) |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

(1 row)

15、'quad_segs=4 join=bevel' 显示为原始线:

sql
SQL> SELECT ST_AsText(ST_OffsetCurve(ST_GeomFromText(
     'LINESTRING(164 16,144 16,124 16,104 16,84 16,64 16,
         44 16,24 16,20 16,18 16,17 17,
         16 18,16 20,16 40,16 60,16 80,16 100,
         16 120,16 140,16 160,16 180,16 195)'),
             15, 'quad_segs=4 join=bevel'));

+-----------------------------------------------------------------------------------------------------------+
|                                                   EXPR1                                                   |
+-----------------------------------------------------------------------------------------------------------+
| LINESTRING(164 1,18 1,7.393398282201788 5.393398282201788,5.393398282201788 7.393398282201788,1 18,1 195) |
+-----------------------------------------------------------------------------------------------------------+

(1 row)

5、-15收集,join=mitre mitre_limit=2.1

sql
SQL> SELECT ST_AsText(ST_Collect(
         ST_OffsetCurve(geom, 15, 'quad_segs=4 join=mitre mitre_limit=2.2'),
         ST_OffsetCurve(geom, -15, 'quad_segs=4 join=mitre mitre_limit=2.2')
         ) )
         FROM (SELECT ST_GeomFromText(
     'LINESTRING(164 16,144 16,124 16,104 16,84 16,64 16,
         44 16,24 16,20 16,18 16,17 17,
         16 18,16 20,16 40,16 60,16 80,16 100,
         16 120,16 140,16 160,16 180,16 195)') As geom);

+------------------------------------------------------------------------------------------------+
|                                             EXPR1                                              |
+------------------------------------------------------------------------------------------------+
| MULTILINESTRING((164 1,11.786796564403577 1,1 11.786796564403577,1 195),(164 31,31 31,31 195)) |
+------------------------------------------------------------------------------------------------+

(1 row)