6.12. 测量函数
6.12.1. ST_Area
ST_Area— 返回输入对象是 polygon 或者 multi-polygon 对象的面积。对于 geometry 对象来说,面积单位是 SRID 规定的单位,对于 geography 对象,面积是平方米
用法
float ST_Area(geometry g1); float ST_Area(geography geog, boolean use_spheroid=true);
描述
返回输入对象是 polygon 或者 multi-polygon 对象的面积。返回 ST_Surface 或 ST_MultiSurface value 的面积值。对于 geometry 对象来说,面积单位是 SRID 规定的单位,对于 geography 对象,面积是平方米。默认计算的是大地坐标系(目前只有 WGS84)的下的面积。如果想要计算更快但精度略低,需要计算球面积。使用方法如下:ST_Area (geog,false).
-
该函数方法实现了规范 OpenGIS Simple Features Implementation Specification for SQL 1.1.
-
该函数方法实现了规范 SQL/MM specification. SQL-MM 3: 8.1.2, 9.5.3
-
该函数支持 Polyhedral Surface 类型几何对象.
注意
对 polyhedral surface 对象来说,值支持 2D polyhedral surface 对象 (非 2.5D 对象). 对 2.5D 对象,可能会返回一个非 0 值,但是只适用于 polygon 或 multipolygon 的面完全处于 XY 平面内的情形
-
该方法由 SFCGAL 库提供后台支持.
样例
返回马萨诸塞州的一个地块的平方英尺的面积,并转换得到平方米。注意:这里返回的结果是平方英尺,因为 SRID 为 2249,是参考系 Mass State Plane 坐标系的单位英尺。
SELECT ST_Area(the_geom) As sqft, ST_Area(the_geom)*POWER(0.3048,2) As sqm FROM (SELECT ST_GeomFromText('POLYGON((743238 2967416,743238 2967450, 743265 2967450,743265.625 2967416,743238 2967416))',2249) ) As foo(the_geom); sqft | sqm ---------+------------- 928.625 | 86.27208552
返回以平方英尺计算的面积(SRID:2249),并将其转换为马萨诸塞州以平方米计算的值(SRID:26986)。
SELECT ST_Area(the_geom) As sqft, ST_Area(ST_Transform(the_geom,26986)) As sqm FROM (SELECT ST_GeomFromText('POLYGON((743238 2967416,743238 2967450, 743265 2967450,743265.625 2967416,743238 2967416))',2249) ) As foo(the_geom); sqft | sqm ---------+------------------ 928.625 | 86.2724304199219
使用 geography 数据类型计算并返回以平方英尺和平方米计量的面积。 注意我们将 geometry 类型转换为 geography 类型(在此之前,需首先保证 geometry 类型的数据使用 WGS 84 经纬度,即 SRID 为 4326)。 Geography 总是以米为单位。这里只是一个例子,用于比较。 使用 Geography 类型计算时,通常你的数据表中存储的就是 Geography 类型的数据。
SELECT ST_Area(the_geog)/POWER(0.3048,2) As sqft_spheroid, ST_Area(the_geog,false)/POWER (0.3048,2) As sqft_sphere, ST_Area(the_geog) As sqm_spheroid FROM (SELECT geography( ST_Transform( ST_GeomFromText('POLYGON((743238 2967416,743238 2967450,743265 2967450,743265.625 2967416,743238 2967416))',2249 ) ,4326 ) ) ) As foo(the_geog); sqft_spheroid | sqft_sphere | sqm_spheroid ------------------+------------------+------------------ 928.684405217197 | 927.186481558724 | 86.2776044452694
如果你的数据已经是 geography 类型:
SELECT ST_Area(the_geog)/POWER(0.3048,2) As sqft, ST_Area(the_geog) As sqm FROM somegeogtable;
参考
ST_GeomFromText, ST_GeographyFromText, ST_SetSRID, ST_Transform
6.12.2. ST_Azimuth
ST_Azimuth — 返回几何对象点 A 从正北方向按顺时针旋转到点 B 时候所需要的角度
用法
float ST_Azimuth(geometry pointA, geometry pointB); float ST_Azimuth(geography pointA, geography pointB);
描述
返回几何对象点 A 从正北方向按顺时针旋转到点 B 时候所需要的角度,如果两个点重合,则返回 NULL 值。该方位角以正北方向为标准起始线,该线定义如下:North = 0; East = PI/2; South = PI; West = 3PI/2。
方位角是一个定义成角度的数学概念,在这种情形下需要一个参考平面和一个点来定义弧度。
方位角在与函数 ST_Translate 结合起来使用的时候特别有用,可以用于绕着一个几何对象的垂直轴来旋转一定角度。
样例
以度为单位的几何对象方位角:
SELECT ST_Azimuth(ST_Point(25,45), ST_Point(75,100))/(2*pi())*360 as degA_B, ST_Azimuth(ST_Point(75,100), ST_Point(25,45))/(2*pi())*360 As degB_A;
使用更加易于记忆的 KingbaseES 内置角度函数,可以得到同样的结果:
SELECT degrees( ST_Azimuth(ST_Point(25,45), ST_Point(75,100)) ) as degA_B, degrees( ST_Azimuth(ST_Point(75,100), ST_Point(25,45)) ) As degB_A; dega_b | degb_a ------------------+------------------ 42.2736890060937 | 222.273689006094
参考
ST_Point, ST_Translate, ST_Project, KingbaseES Math Functions
6.12.3. ST_Angle
ST_Angle — 求夹角。
用法
float ST_Angle(geometry point1, geometry point2, geometry point3, geometry point4); float ST_Angle(geometry line1, geometry line2);
描述
对于 3 个点,按顺时针方向计算 P1P2P3 的夹角。 如果输入 2 条线,则以 2 条线的首尾点来计算夹角。如果输入 4 个点, 则顺时针方向计算 P1P2 与 P3P4 的夹角。 计算结果总是正值,在 0 到 2π 之间。
ST_Angle(P1,P2,P3)=ST_Angle(P2,P1,P2,P3)
结果单位是弧度,可以用 KES 内置的 degrees () 函数将其转为角度。
样例
WITH rand AS ( SELECT s, random() * 2 * PI() AS rad1 , random() * 2 * PI() AS rad2 FROM generate_series(1,2,2) AS s ) , points AS ( SELECT s, rad1,rad2, ST_MakePoint(cos1+s,sin1+s) as p1, ST_MakePoint(s,s) AS p2, ST_MakePoint(cos2+s,sin2+s) as p3 FROM rand ,cos(rad1) cos1, sin(rad1) sin1 ,cos(rad2) cos2, sin(rad2) sin2 ) SELECT s, ST_AsText(ST_SnapToGrid(ST_MakeLine(ARRAY[p1,p2,p3]),0.001)) AS line , degrees(ST_Angle(p1,p2,p3)) as computed_angle , round(degrees(2*PI()-rad2 -2*PI()+rad1+2*PI()))::int%360 AS reference , round(degrees(2*PI()-rad2 -2*PI()+rad1+2*PI()))::int%360 AS reference FROM points ; 1 | line | computed_angle | reference ------------------+------------------ 1 | LINESTRING(1.511 1.86,1 1,0.896 0.005) | 155.27033848688 | 155
6.12.4. ST_ClosestPoint
ST_ClosestPoint — 返回 2 维平面内离 g2 几何对象最近的 g1 上的点。这个点也是 g1 和 g2 之间最短的线的第一个点
用法
geometry ST_ClosestPoint(geometry g1, geometry g2);
描述
返回 2 维平面内离 g2 几何对象最近的 g1 上的点。这个点也是 g1 和 g2 之间最短的线的第一个点
注意
如果输入对象是 3D 几何对象,应该选择使用 ST_3DClosestPoint.
样例
图 6.12.1 点与线之间的最近点,就是这个点自身,但是线与点之间的最近点,是这条线上的一个点。
SELECT ST_AsText(ST_ClosestPoint(pt,line) ) AS cp_pt_line, ST_AsText(ST_ClosestPoint(line,pt )) As cp_line_pt FROM (SELECT 'POINT(100 100)'::geometry As pt, 'LINESTRING (20 80, 98 190, 110 180, 50 75 )'::geometry As line ) As foo; ) As foo; cp_pt_line | cp_line_pt ----------------+----------------------------------------- POINT(100 100) | POINT(73.0769230769231 115.384615384615)
图 6.12.2 多边形 A 上离多边形 B 最近的点
SELECT ST_AsText( ST_ClosestPoint( ST_GeomFromText(' POLYGON((175 150, 20 40, 50 60, 125 100, 175 150 ST_Buffer( ST_GeomFromText('POINT(110 170)'), 20) ) ) As ptwkt; ptwkt --------------------------------- POINT(140.752120669087 125.695053378061)
参考
ST_3DClosestPoint,ST_Distance, ST_LongestLine, ST_ShortestLine, ST_MaxDistance
6.12.5. ST_3DClosestPoint
ST_3DClosestPoint — 返回 3 维内离 g2 几何对象最近的 g1 上的点。这个点也是 g1 和 g2 之间最短的线的第一个点
用法
geometry ST_3DClosestPoint(geometry g1, geometry g2);
描述
返回 3 维内离 g2 几何对象最近的 g1 上的点。这个点也是 g1 和 g2 之间最短的线的第一个点。最短的 3D 线段的长度就是这两个几何对象之间的距离。
-
这个函数支持 3D 对象,并且不会删除 z 坐标
-
该函数支持 Polyhedral Surface 类型几何对象.
样例
线与点,二维与三维坐标系中的最近点:
SELECT ST_AsEWKT(ST_3DClosestPoint(line,pt)) AS cp3d_line_pt, ST_AsEWKT(ST_ClosestPoint(line,pt)) As cp2d_line_pt FROM (SELECT 'POINT(100 100 30)'::geometry As pt, 'LINESTRING (20 80 20, 98 190 1, 110 180 3, 50 75 1000)':: geometry As line ) As foo; cp3d_line_pt | cp2d_line_pt ----------------------------------------------------------+----------------------------------------- POINT(54.6993798867619 128.935022917228 11.5475869506606) | POINT(73.0769230769231 115.384615384615)
线与多个点,二维与三维坐标系中的最近点:
linestring and multipoint -- both 3d and 2d closest point SELECT ST_AsEWKT(ST_3DClosestPoint(line,pt)) AS cp3d_line_pt, ST_AsEWKT(ST_ClosestPoint(line,pt)) As cp2d_line_pt FROM (SELECT 'MULTIPOINT(100 100 30, 50 74 1000)'::geometry As pt, 'LINESTRING (20 80 20, 98 190 1, 110 180 3, 50 75 900)':: ← geometry As line ) As foo; cp3d_line_pt | cp2d_line_pt -----------------------------------------------------------+-------------- POINT(54.6993798867619 128.935022917228 11.5475869506606) | POINT(50 75)
多线串与多边形,二维与三维坐标系中的最近点:
SELECT ST_AsEWKT(ST_3DClosestPoint(poly, mline)) As cp3d, ST_AsEWKT(ST_ClosestPoint(poly, mline)) As cp2d FROM (SELECT ST_GeomFromEWKT('POLYGON((175 150 5, 20 40 5, 35 45 5, 50 60 5, ← 100 100 5, 175 150 5))') As poly, ST_GeomFromEWKT('MULTILINESTRING((175 155 2, 20 40 20, 50 60 -2, 125 100 1, 175 155 1), (1 10 2, 5 20 1))') As mline ) As foo; cp3d | cp2d -------------------------------------------+-------------- POINT(39.993580415989 54.1889925532825 5) | POINT(20 40)
参考
ST_AsEWKT, ST_ClosestPoint, ST_3DDistance, ST_3DShortestLine
6.12.6. ST_Distance
ST_Distance — 对于 geometry 类型对象,返回两个几何对象的 2 维的最小笛卡尔距离。对于 geography 类型对象,返回 WGS84 参考系两个 geography 对象之间的最小空间距离,距离单位是米
用法
float ST_Distance(geometry g1, geometry g2); float ST_Distance(geography gg1, geography gg2); float ST_Distance(geography gg1, geography gg2, boolean use_spheroid);
描述
对于 geometry 类型对象,返回两个几何对象的 2 维的最小笛卡尔距离。对于 geography 类型对象,返回 WGS84 参考系两个 geography 对象之间的最小空间距离,距离单位是米,如果 use_spheroid 参数传递的值是 false,那么返回的是球面距离,而不是椭圆面距离
-
该函数方法实现了规范 OpenGIS Simple Features Implementation Specification for SQL 1.1.
-
该函数方法实现了规范 SQL/MM specification. SQL-MM 3: 5.1.23
-
该函数支持 CircularString 和 Curve 几何类型对象
-
该方法有 SFCGAL 库提供支持
样例 : 基础几何对象样例
以 WGS 84 坐标系中经纬度为单位的几何对象距离:
SELECT ST_Distance( ST_GeomFromText('POINT(-72.1235 42.3521)',4326), ST_GeomFromText('LINESTRING(-72.1260 42.45, -72.123 42.1546)', 4326) ); st_distance ----------------- 0.00150567726382282
以米为单位的距离(SRID 为 26986,对马萨诸塞州而言更为准确):
SELECT ST_Distance( ST_Transform(ST_GeomFromText('POINT(-72.1235 42.3521)',4326),26986), ST_Transform(ST_GeomFromText('LINESTRING(-72.1260 42.45, -72.123 42.1546)', 4326) ← ,26986) ); st_distance ----------------- 123.797937878454
以米为单位的距离(SRID 为 2163,精度最低):
SELECT ST_Distance( ST_Transform(ST_GeomFromText('POINT(-72.1235 42.3521)',4326),2163), ST_Transform(ST_GeomFromText('LINESTRING(-72.1260 42.45, -72.123 42.1546)', 4326) ← ,2163) ); st_distance ------------------ 126.664256056812
样例 : Geography
与第一个样例类似,但采用米为单位,并在椭球体坐标系中计算,速度稍快,精度稍低:
SELECT ST_Distance(gg1, gg2) As spheroid_dist, ST_Distance(gg1, gg2, false) As sphere_dist FROM (SELECT ST_GeographyFromText('SRID=4326;POINT(-72.1235 42.3521)') As gg1, ST_GeographyFromText('SRID=4326;LINESTRING(-72.1260 42.45, -72.123 42.1546)') As gg2 ← ) As foo ; spheroid_dist | sphere_dist ------------------+------------------ 123.802076746848 | 123.475736916397
参考
ST_3DDistance, ST_DWithin, ST_Distance_Sphere, ST_Distance_Spheroid, ST_MaxDistance, ST_Transform
6.12.7. ST_3DDistance
ST_3DDistance — 对于 3 维的 geometry 类型对象,返回两个几何对象的最短笛卡尔距离 (基于 SRS 表),单位以投影系单位为准。
用法
float ST_3DDistance(geometry g1, geometry g2);
描述
对于 3 维的 geometry 类型对象,返回两个几何对象的最短笛卡尔距离 (基于 SRS 表),单位以投影系单位为准。
-
这个函数支持 3D 对象,并且不会删除 z 坐标
-
该函数支持 Polyhedral Surface 类型几何对象.
-
该函数方法实现了规范 SQL/MM specification. SQL-MM ?
-
该方法由 SFCGAL 库提供后台支持.
样例
几何对象距离,以米为单位(SRID: 2163),3D 点与线和 2D 点与线的例子。
注意:当前不支持垂直方向上的数据,所以 Z 坐标没有被转换,且假定其单位就是最终结果的单位。
SELECT ST_3DDistance( ST_Transform(ST_GeomFromEWKT('SRID=4326;POINT(-72.1235 42.3521 4)'),2163), ST_Transform(ST_GeomFromEWKT('SRID=4326;LINESTRING(-72.1260 42.45 15, -72.123 42.1546 20)'),2163) ) As dist_3d, ST_Distance( ST_Transform(ST_GeomFromText('POINT(-72.1235 42.3521)',4326),2163), ST_Transform(ST_GeomFromText('LINESTRING(-72.1260 42.45, -72.123 42.1546)', 4326) ,2163) ) As dist_2d; dist_3d | dist_2d -----------------------+----------------- 127.295059324629 | 126.66425605671
多线串与多边形之间二维和三维的距离,与三维最近点的例子相似:
SELECT ST_3DDistance(poly, mline) As dist3d, ST_Distance(poly, mline) As dist2d FROM (SELECT ST_GeomFromEWKT('POLYGON((175 150 5, 20 40 5, 35 45 5, 50 60 5, 100 100 5, 175 150 5))') As poly, ST_GeomFromEWKT('MULTILINESTRING((175 155 2, 20 40 20, 50 60 -2, 125 100 1,175 155 1), (1 10 2, 5 20 1))') As mline ) As foo; dist3d | dist2d -------------------------+-------- 0.716635696066337 | 0
参考
ST_Distance, ST_3DClosestPoint, ST_3DDWithin, ST_3DMaxDistance, ST_3DShortestLine, ST_Transform
6.12.8. ST_DistanceSphere
ST_DistanceSphere — 返回两个以经纬度表示的几何对象的最小距离。该函数使用一个半径为 6370986 球体做参照。该函数的计算比 ST_DistanceSpheroid 要快,但是精度要差一些。
用法
float ST_DistanceSphere(geometry geomlonlatA, geometry geomlonlatB);
描述
返回两个以经纬度表示的几何对象的最小距离。该函数使用一个半径为 6370986 球体做参照。该函数的计算比 ST_DistanceSpheroid 要快,但是精度要差一些。
注意
该函数当前不看几何对象的 SRID,因为它会假定给定的几何对象是在 WGS 84 坐标系中的,坐标用经纬度表示。
样例
SELECT round(CAST(ST_DistanceSphere(ST_Centroid(the_geom), ST_GeomFromText('POINT(-118 38) ← ',4326)) As numeric),2) As dist_meters, round(CAST(ST_Distance(ST_Transform(ST_Centroid(the_geom),32611), ST_Transform(ST_GeomFromText('POINT(-118 38)', 4326),32611)) As numeric),2) As dist_utm11_meters, round(CAST(ST_Distance(ST_Centroid(the_geom), ST_GeomFromText('POINT(-118 38)', 4326)) As numeric),5) As dist_degrees, round(CAST(ST_Distance(ST_Transform(the_geom,32611), ST_Transform(ST_GeomFromText('POINT(-118 38)', 4326),32611)) As numeric),2) As min_dist_line_point_meters FROM (SELECT ST_GeomFromText('LINESTRING(-118.584 38.374,-118.583 38.5)', 4326) As the_geom) as foo; dist_meters | dist_utm11_meters | dist_degrees | min_dist_line_point_meters ------------+-------------------+--------------+---------------------------- 70424.47 | 70438.00 | 0.72900 | 65871.18
参考
ST_Distance, ST_DistanceSpheroid
6.12.9. ST_DistanceSpheroid
ST_DistanceSpheroid — 根据给定的椭球面参考系,计算两个经纬度表示的几何对象的最小距离。
用法
float ST_DistanceSpheroid(geometry geomlonlatA, geometry geomlonlatB, spheroid measurement_spheroid);
描述
根据给定的椭球面参考系,计算两个经纬度表示的几何对象的最小距离。
注意
该函数目前不看几何对象的 SRID 值,并假定输入的是椭球面坐标。
样例
SELECT round(CAST( ST_DistanceSpheroid(ST_Centroid(the_geom), ST_GeomFromText('POINT(-118 38)',4326), ' ← SPHEROID["WGS 84",6378137,298.257223563]') As numeric),2) As dist_meters_spheroid, round(CAST(ST_DistanceSphere(ST_Centroid(the_geom), ST_GeomFromText('POINT(-118 38) ← ',4326)) As numeric),2) As dist_meters_sphere, round(CAST(ST_Distance(ST_Transform(ST_Centroid(the_geom),32611), ST_Transform(ST_GeomFromText('POINT(-118 38)', 4326),32611)) As numeric),2) As dist_utm11_meters FROM (SELECT ST_GeomFromText('LINESTRING(-118.584 38.374,-118.583 38.5)', 4326) As the_geom) as foo; dist_meters_spheroid | dist_meters_sphere | dist_utm11_meters ---------------------+--------------------+------------------- 70454.92 | 70424.47 | 70438.00
参考
ST_Distance, ST_DistanceSphere
6.12.10. ST_FrechetDistance
ST_FrechetDistance - 基于论文 `Computing Discrete Fréchet Distance<http://www.kr.tuwien.ac.at/staff/eiter/et-archive/cdtr9464.pdf>`_ 实现 Fréchet 距离算法,使用两个几何对象上的有限个离散点的距离,来衡量几何对象之间的相似度。
用法
float ST_FrechetDistance(geometry g1, geometry g2, float densifyFrac = -1);
描述
基于论文 `Computing Discrete Fréchet Distance<http://www.kr.tuwien.ac.at/staff/eiter/et-archive/cdtr9464.pdf>`_ 实现 Fréchet 距离算法,使用两个几何对象上的有限个离散点的距离,来衡量几何对象之间的相似度。 Fréchet 距离是一种综合考虑曲线上点的位置和顺序,基于点之间的距离来衡量曲线相似度的指标。 它的准确性通常会优于 Hausdorff 距离。
当提供了可选参数 densifyFrac 时,该函数在计算离散点的距离之前先执行一个分段稠密化操作。 参数 densifyFrac 规定了稠密化后的每个分段在曲线总长度上所占的比例。 稠密化之后曲线被切分成等长的线段,每条线段的长度接近上述给定的比例。
长度单位是几何对象所在的空间坐标系中的长度单位。
注意
当前的实现只支持离散的顶点。它可以被扩展到支持任意密度的点。
注意
指定的 densifyFrac 越小,计算出的 Fréchet 距离精度越高。但是,计算时间和内存占用量会随着切分线段数的平方增长。
样例
postgres=# SELECT st_frechetdistance('LINESTRING (0 0, 100 0)'::geometry, 'LINESTRING (0 0, 50 50, 100 0)'::geometry); st_frechetdistance -------------------- 70.7106781186548 (1 row) SELECT st_frechetdistance('LINESTRING (0 0, 100 0)'::geometry, 'LINESTRING (0 0, 50 50, 100 0)'::geometry, 0.5); st_frechetdistance -------------------- 50 (1 row)
参考
ST_HausdorffDistance
6.12.11. ST_HausdorffDistance
ST_HausdorffDistance — 返回两个几何对象的 Hausdorff 距离。该距离用来表示两个几何对象有多类似或有多不相同。距离单位是这两个几何对象所在的空间参考系所用的距离单位
用法
float ST_HausdorffDistance(geometry g1, geometry g2); float ST_HausdorffDistance(geometry g1, geometry g2, float densifyFrac);
描述
该函数是离散豪斯多夫距离的算法实现。这是针对于离散点的豪斯多夫距离。参考 Wikipedia article on Hausdorff distance Martin Davis note on how Hausdorff Distance calculation was used to prove correctness of the CascadePolygonUnion approach. 当指定参数 densifyFrac 时候,该函数在计算离散豪斯多夫距离前会先把一个分段致密化。
参数 densifyFrac 会将每一个分段致密化。每一个分段会被分割成距离相等的更小分段,而所有分段的总距离最接近给出的大分段总距离。
注意
该函数当前的实现只支持离散位置的点。该函数可以允许扩展到任意点的数量。
注意
注意该函数实现的算法不等同于标准的豪斯多夫距离。然而对于一个很大的几何对象集合来说,这是一个很接近的结果。 该函数一个重要的适用对象是 LINESTRING,这些几何对象必须相互之间基本平行,长度基本相等。对于 LINESTRING 的相似性度量来说很有用。
样例
对于每一栋建筑物,找出最能代表它的地块。 首先我们需要将地块与建筑物进行交集计算。 DISTINCT ON 子句确保我们对每栋建筑物只选出一次,ORDER BY .. ST_HausdorffDistance 子句让我们选出与建筑物最接近的地块。
SELECT DISTINCT ON(buildings.gid) buildings.gid, parcels.parcel_id FROM buildings INNER JOIN parcels ON ST_Intersects(buildings.geom,parcels.geom) ORDER BY buildings.gid, ST_HausdorffDistance(buildings.geom, parcels.geom); system=# SELECT ST_HausdorffDistance( 'LINESTRING (0 0, 2 0)'::geometry, 'MULTIPOINT (0 1, 1 0, 2 1)'::geometry); st_hausdorffdistance ---------------------- 1 (1 row) system=# SELECT st_hausdorffdistance('LINESTRING (130 0, 0 0, 0 150)'::geometry, ' LINESTRING (10 10, 10 150, 130 10)'::geometry, 0.5); st_hausdorffdistance ---------------------- 70 (1 row)
6.12.12. ST_Length
ST_Length — 返回一个 LINESTRING 或 MULTILINESTRING 类型对象的 2 维长度。长度单位对于 geometry 类型对象来说以空间参考系规定的单位为标准,geography 类型以椭圆参考系为参考系,单位是米
用法
float ST_Length(geometry a_2dlinestring); float ST_Length(geography geog, boolean use_spheroid=true);
描述
对于 geometry 类型对象来说,返回一个 LINESTRING 或 MULTILINESTRING、ST_Curve, ST_MultiCurve 返回值对应的类型对象的 2 维笛卡尔长度。对于区域面类型的几何对象,该函数返回 0,要想计算区域面类型的长度,需要使用函数 ST_Perimeter。长度单位对于 geometry 类型对象来说以空间参考系规定的单位为标准。对于 geography 类型对象,单位是米,使用 ST_Perimeter 函数来计算区域面类型的对象长度。当前对于几何类型对象来说,该函数是 ST_Length2D 别名,但是将来会对更高维度几何对象进行支持。
注意
对于 geography 类型对象,该函数默认使用椭球参考系来计算,如果想计算更快
但精度差异性的,使用函数 ST_Length (gg,false);
-
该函数方法实现了规范 OpenGIS Simple Features Implementation Specification for SQL 1.1. s2.1.5.1
-
该函数方法实现了规范 SQL/MM specification. SQL-MM 3: 7.1.2, 9.3.4
-
该方法由 SFCGAL 库提供后台支持.
Geometry 样例
以英尺为单位返回线的长度。注意:之所以以英尺为单位,是因为 SRID 为 2249:
SELECT ST_Length(ST_GeomFromText('LINESTRING(743238 2967416,743238 2967450,743265 2967450,743265.625 2967416,743238 2967416)',2249)); st_length --------- 122.630744000095
将 WGS 84 坐标系下的线串转换为马萨诸塞州以米为单位坐标系,返回长度值。
SELECT ST_Length( ST_Transform( ST_GeomFromEWKT('SRID=4326;LINESTRING(-72.1260 42.45, -72.1240 42.45666, -72.123 42.1546)'), 26986 ) ); st_length --------- 34309.4563576191
Geography 样例
返回 WGS 84 坐标系下 geography 类型的线的长度,默认使用球面而非椭球面进行计算。
SELECT ST_Length(the_geog) As length_spheroid, ST_Length(the_geog,false) As length_sphere FROM (SELECT ST_GeographyFromText( 'SRID=4326;LINESTRING(-72.1260 42.45, -72.1240 42.45666, -72.123 42.1546)') As the_geog) As foo; length_spheroid | length_sphere -----------------+------------------ 34310.5703627305 | 34346.2060960742 (1 row)
参考
ST_GeographyFromText, ST_GeomFromEWKT, ST_Length_Spheroid, ST_Perimeter, ST_Transform
6.12.13. ST_Length2D
ST_Length2D — 返回一个 LINESTRING 或 MULTILINESTRING 类型对象的 2 维长度,该函数是函数 ST_Length 的别名
用法
float ST_Length2D(geometry a_2dlinestring);
描述
返回一个 LINESTRING 或 MULTILINESTRING 类型对象的 2 维长度,该函数是函数 ST_Length 的别名
参考
ST_Length, ST_3DLength
6.12.14. ST_3DLength
ST_3DLength — 返回一个 LINESTRING 或 MULTILINESTRING 类型对象的 3 维或 2 维长度。
用法
float ST_3DLength(geometry a_3dlinestring);
描述
返回一个 LINESTRING 或 MULTILINESTRING 类型对象的 3 维或 2 维长度。对于 2 维的 LINESTRING 类型对象,该函数只会返回其 2 维长度 (与函数 ST_Length 和 ST_Length2D 返回值一样)。
-
这个函数支持 3D 对象,并且不会删除 z 坐标。
样例
以英尺为单位,返回一条 3D 线缆的长度。 注意:其单位为英尺是因为 SRID: 2249 坐标系中的长度单位为英尺。
SELECT ST_3DLength(ST_GeomFromText('LINESTRING(743238 2967416 1,743238 2967450 1,743265 2967450 3,743265.625 2967416 3,743238 2967416 3)',2249)); ST_3DLength ----------- 122.704716741457
参考
ST_Length, ST_Length2D
6.12.15. ST_LengthSpheroid
ST_LengthSpheroid — 在椭圆参考系中计算一个 linestring/multilinestring 的 2D 或 3D 长度,如果几何类型对象的坐标是经纬度形式,并且长度不需要重投影的话,使用该函数很有用
用法
float ST_LengthSpheroid(geometry a_linestring, spheroid a_spheroid);
描述
在椭圆参考系中计算一个 linestring/multilinestring 的 2D 或 3D 长度,如果几何类型对象的坐标是经纬度形式,并且长度不需要重投影的话,使用该函数很有用。椭圆面是一个单独的数据库类型对象,构建方法如下:
SPHEROID[<NAME>,<SEMI-MAJOR AXIS>,<INVERSE FLATTENING>] SPHEROID["GRS_1980",6378137,298.257222101]
注意
如果输入的几何类型对象不是 MULTILINESTRING or LINESTRING 返回 0
-
这个函数支持 3D 对象,并且不会删除 z 坐标。
样例
SELECT ST_Length_Spheroid( geometry_column, 'SPHEROID["GRS_1980",6378137,298.257222101]' ) FROM geometry_table; SELECT ST_Length_Spheroid( the_geom, sph_m ) As tot_len, ST_Length_Spheroid(ST_GeometryN(the_geom,1), sph_m) As len_line1,ST_Length_Spheroid(ST_GeometryN(the_geom,2), sph_m) As len_line2 FROM (SELECT ST_GeomFromText('MULTILINESTRING((-118.584 38.374,-118.583 38.5),(-71.05957 42.3589 , -71.061 43))') As the_geom, CAST('SPHEROID["GRS_1980",6378137,298.257222101]' As spheroid) As sph_m) as foo; tot_len | len_line1 |len_line2 ------------------+------------------+------------------ 85204.5207562955 | 13986.8725229309 | 71217.6482333646 --3D SELECT ST_Length_Spheroid( the_geom, sph_m ) As tot_len, ST_Length_Spheroid(ST_GeometryN(the_geom,1), sph_m) As len_line1, ST_Length_Spheroid(ST_GeometryN(the_geom,2), sph_m) As len_line2 FROM (SELECT ST_GeomFromEWKT('MULTILINESTRING((-118.584 38.374 20,-118.583 38.5 30) , (-71.05957 42.3589 75, -71.061 43 90))') As the_geom, CAST('SPHEROID["GRS_1980",6378137,298.257222101]' As spheroid) As sph_m) as foo; tot_len | len_line1 | len_line2 ------------------+-----------------+------------------ 85204.5259107402 | 13986.876097711 | 71217.6498130292
参考
ST_GeometryN, ST_Length, ST_3DLength_Spheroid
6.12.16. ST_LongestLine
ST_LongestLine — 返回两个几何对象之间的 2 维最长距离。如果有多个线段都是最长线段,那么返回第一个最长的。该线段的起点在 g1,终点在 g2. 该函数返回的线段的长度与用函数 ST_MaxDistance 计算 g1 和 g2 的距离值一样。
用法
geometry ST_LongestLine(geometry g1, geometry g2);
描述
返回两个几何对象之间的 2 维最长距离。
样例
图 6.12.3 点和线之间最长的连线
SELECT ST_AsText( ST_LongestLine('POINT(100 100)'::geometry, 'LINESTRING (20 80, 98 190, 110 180, 50 75 )'::geometry) ) As lline; lline --------------------------------- LINESTRING(100 100,98 190)
图 6.12.4 两个多边形之间最长的线
SELECT ST_AsText( ST_LongestLine( ST_GeomFromText('POLYGON ((175 150, 20 40, 50 60, 125 100, 175 150))'), ST_Buffer(ST_GeomFromText('POINT(110 170)'), 20) ) ) As llinewkt; lline ----------------------------------------------------- LINESTRING(20 40,121.111404660392 186.629392246051)
图 6.12.5 从一个优美的城市的一部分旅行到另一部分的最长直线距离。注意:最大距离 = 最长连线的长度
SELECT ST_AsText(ST_LongestLine(c.the_geom, c.the_geom)) As llinewkt, ST_MaxDistance(c.the_geom,c.the_geom) As max_dist, ST_Length(ST_LongestLine(c.the_geom, c.the_geom)) As lenll FROM (SELECT ST_BuildArea(ST_Collect(the_geom)) As the_geom FROM (SELECT ST_Translate(ST_SnapToGrid(ST_Buffer(ST_Point(50 ,generate_series (50,190, 50) ),40, 'quad_segs=2'),1), x, 0) As the_geom ) As c; FROM generate_series(1,100,50) As x) AS foo llinewkt | max_dist | lenll --------------------------+------------------+------------------ LINESTRING(23 22,129 178) | 188.605408193933 | 188.605408193933
参考
ST_MaxDistance, ST_ShortestLine, ST_LongestLine
6.12.17. ST_3DLongestLine
ST_3DLongestLine — 返回两个几何对象之间最长的 3 维线段
用法
geometry ST_3DLongestLine(geometry g1, geometry g2);
描述
返回两个几何对象之间的 3 维最长距离。如果有多个线段都是最长线段,那么返回第一个最长的。该线段的起点在 g1,终点在 g2. 该函数返回的线段的长度与用函数 ST_3DMaxDistance 计算 g1 和 g2 的距离值一样。
-
这个函数支持 3D 对象,并且不会删除 z 坐标
-
该函数支持 Polyhedral Surface 类型几何对象.
样例
线串和点之间 3D 和 2D 的最长连线:
SELECT ST_AsEWKT(ST_3DLongestLine(line,pt)) AS lol3d_line_pt, ST_AsEWKT(ST_LongestLine(line,pt)) As lol2d_line_pt FROM (SELECT 'POINT(100 100 30)'::geometry As pt, 'LINESTRING (20 80 20, 98 190 1, 110 180 3, 50 75 1000)':: geometry As line ) As foo; lol3d_line_pt | lol2d_line_pt -----------------------------------+---------------------------- LINESTRING(50 75 1000,100 100 30) | LINESTRING(98 190,100 100)
线串和点集之间 3D 和 2D 的最长连线:
SELECT ST_AsEWKT(ST_3DLongestLine(line,pt)) AS lol3d_line_pt, ST_AsEWKT(ST_LongestLine(line,pt)) As lol2d_line_pt FROM (SELECT 'MULTIPOINT(100 100 30, 50 74 1000)'::geometry As pt, 'LINESTRING (20 80 20, 98 190 1, 110 180 3, 50 75 900)':: geometry As line ) As foo; lol3d_line_pt |lol2d_line_pt ---------------------------------+-------------------------- LINESTRING(98 190 1,50 74 1000) | LINESTRING(98 190,50 74)
多线串和多边形之间 3D 和 2D 的最长连线:
SELECT ST_AsEWKT(ST_3DLongestLine(poly, mline)) As lol3d, ST_AsEWKT(ST_LongestLine(poly, mline)) As lol2d FROM (SELECT ST_GeomFromEWKT('POLYGON((175 150 5, 20 40 5, 35 45 5, 50 60 5, 100 100 5, 175 150 5))') As poly, ST_GeomFromEWKT('MULTILINESTRING((175 155 2, 20 40 20, 50 60 -2, 125100 1, 175 155 1), (1 10 2, 5 20 1))') As mline ) As foo; lol3d | lol2d -----------------------------+-------------------------- LINESTRING(175 150 5,1 10 2) | LINESTRING(175 150,1 10)
参考
ST_3DClosestPoint, ST_3DDistance, ST_LongestLine, ST_3DShortestLine, ST_3DMaxDistance
6.12.18. ST_MaxDistance
ST_MaxDistance — 返回两个几何对象的最长距离,距离单位是投影单位
用法
float ST_MaxDistance(geometry g1, geometry g2);
描述
注意
返回两个几何对象的最大距离,单位以投影系的单位为准。如果 g1 和 g2 的几何类型相同,该函数会返回两个几何对象上的点的最大距离
样例
点与线之间的最大距离:
system=# SELECT ST_MaxDistance('POINT(0 0)'::geometry, 'LINESTRING ( 2 0, 0 2 )'::geometry ); st_maxdistance ----------------- 2 (1 row) system=# SELECT ST_MaxDistance('POINT(0 0)'::geometry, 'LINESTRING ( 2 2, 2 2 )'::geometry ); st_maxdistance ------------------ 2.82842712474619 (1 row)
参考
ST_Distance, ST_LongestLine, ST_DFullyWithin
6.12.19. ST_3DMaxDistance
ST_3DMaxDistance — 对于 3 维的 geometry 类型对象,返回两个几何对象的最大笛卡尔距离 (基于 SRS 表),单位以投影系单位为准
用法
float ST_3DMaxDistance(geometry g1, geometry g2);
描述
对于 3 维的 geometry 类型对象,返回两个几何对象的最大笛卡尔距离 (基于 SRS 表),单位以投影系单位为准
这个函数支持 3D 对象,并且不会删除 z 坐标。
-
该函数支持 Polyhedral Surface 类型几何对象.
样例
Geometry 类型的例子,单位为米(SRID:2163),3D 点和线与 2D 点和线相比较。 注意:当前不支持垂直方向的数据,因此 Z 坐标没有被转换,并被假定与最终结果单位相同。
SELECT ST_3DMaxDistance( ST_Transform(ST_GeomFromEWKT('SRID=4326;POINT(-72.1235 42.3521 10000)'),2163), ST_Transform(ST_GeomFromEWKT('SRID=4326;LINESTRING(-72.1260 42.45 15, -72.123 42.154620)'),2163) ) As dist_3d, ST_MaxDistance( ST_Transform(ST_GeomFromEWKT('SRID=4326;POINT(-72.1235 42.3521 10000)'),2163), ST_Transform(ST_GeomFromEWKT('SRID=4326;LINESTRING(-72.1260 42.45 15, -72.123 42.154620)'),2163) ) As dist_2d; dist_3d | dist_2d -----------------+------------------ 24383.7467488441 | 22247.8472107251
参考
ST_Distance, ST_3DDWithin, ST_3DMaxDistance, ST_Transform
6.12.20. ST_MinimumClearance
ST_MinimumClearance — 字面意思为 “最小间隙”,可以理解为 “最小失效间隙”,是一种几何对象鲁棒性的量化尺度。
用法
float ST_MinimumClearance(geometry g);
描述
对于一个能够通过 ST_Valid (polygon) 或 ST_IsSimple (line) 函数检查的几何对象,当其中一个顶点移动了一小段距离后,有可能会变成一个非法的几何对象。 这种情况并不少见,常常发生在将几何对象转换成基于文本的格式(如:WKT, KML, GML GeoJSON)或没有使用双精度浮点格式的二进制格式(MapInfo TAB)时。
一个几何对象的 "minimum clearance" 是指要使其变得非法时,一个顶点需要移动的最小距离。 它可以被看作一种几何对象鲁棒性的量化尺度。这个距离越大,鲁棒性越好。
当一个几何对象具有 “最小失效间隙” e 时,我们可以说:
-
几何对象中任意两个不同的点之间的距离不小于 e 。
-
一个顶点如果不是几何对象中某条线段的端点,那么它与这条线段的距离不小于 e 。
如果一个几何对象中不存在 “最小失效间隙” (例如:单个 Point、不重叠的 MultiPoint),那么该函数将返回 Infinity 。
样例
SELECT ST_MinimumClearance('POLYGON ((0 0, 1 0, 1 1, 0.5 3.2e-4, 0 0))'); st_minimumclearance --------------------- 0.00032
参考
ST_MinimumClearanceLine
6.12.21. ST_MinimumClearanceLine
ST_MinimumClearanceLine — 返回一条有两个端点、长度等于该给定几何对象 “最小失效间隙” 的 LineString 对象。
用法
Geometry ST_MinimumClearanceLine(geometry g);
描述
返回一条有两个端点、长度等于该给定几何对象 “最小失效间隙” 的 LineString 对象。 如果一个几何对象中不存在 “最小失效间隙” ,那么该函数将返回 LINESTRING EMPTY 。
样例
SELECT ST_AsText(ST_MinimumClearanceLine('POLYGON ((0 0, 1 0, 1 1, 0.5 3.2e-4, 0 0))')); st_astext ------------------------------- LINESTRING(0.5 0.00032,0.5 0)
参考
ST_MinimumClearance
6.12.22. ST_Perimeter
ST_Perimeter — 返回 ST_Surface 或 ST_MultiSurface (返回 Polygon, Multipolygon 类型对象) 值对应的 geometry 和 geography 类型对象的周长。对于 geometry 类型对象,返回的长度以空间参考系规定的单位做标准,对于 geography 类型对象, 单位是米
用法
float ST_Perimeter(geometry g1); float ST_Perimeter(geography geog, boolean use_spheroid=true);
描述
返回 ST_Surface 或 ST_MultiSurface (返回 Polygon, Multipolygon 类型对象) 值对应的 geometry 和 geography 类型对象的 2D 周长。对于非表面型几何类型对象,返回 0。对于 LINESTRING 类型对象,使用函数 ST_Length。对于 geometry 类型对象,返回的长度以空间参考系规定的单位做标准,对于 geography 类型对象,单位是米。如果参数 use_spheroid 值为 false,那么该函数会使用地球作为球面参考系,而不是椭圆参考系。当前该函数是函数 ST_Perimeter2D 的别名,但将来该函数会支持更高维度的对象
-
该函数方法实现了规范 OpenGIS Simple Features Implementation Specification for SQL 1.1. s2.1.5.1
-
该函数方法实现了规范 SQL/MM specification. SQL-MM 3: 8.1.3, 9.5.4
样例: Geometry
返回单个多边形与多边形集合的周长,单位为英尺(SRID: 2249)。
SELECT ST_Perimeter(ST_GeomFromText('POLYGON((743238 2967416,743238 2967450,743265 2967450, 743265.625 2967416,743238 2967416))', 2249)); st_perimeter --------- 122.630744000095 (1 row) SELECT ST_Perimeter(ST_GeomFromText('MULTIPOLYGON(((763104.471273676 2949418.44119003, 763104.477769673 2949418.42538203, 763104.189609677 2949418.22343004,763104.471273676 2949418.44119003)), ((763104.471273676 2949418.44119003,763095.804579742 2949436.33850239, 763086.132105649 2949451.46730207,763078.452329651 2949462.11549407, 763075.354136904 2949466.17407812,763064.362142565 2949477.64291974, 763059.953961626 2949481.28983009,762994.637609571 2949532.04103014, 762990.568508415 2949535.06640477,762986.710889563 2949539.61421415, 763117.237897679 2949709.50493431,763235.236617789 2949617.95619822, 763287.718121842 2949562.20592617,763111.553321674 2949423.91664605, 763104.471273676 2949418.44119003)))', 2249)); st_perimeter --------- 845.227713366825 (1 row)
样例: Geography
返回单个多边形与多边形集合的周长,单位为米(Geography 类型,WGS 84 经纬度):
SELECT ST_Perimeter(geog) As per_meters, ST_Perimeter(geog)/0.3048 As per_ft FROM ST_GeogFromText('POLYGON((-71.1776848522251 42.3902896512902,-71.1776843766326 42.3903829478009, -71.1775844305465 42.3903826677917,-71.1775825927231 42.3902893647987,-71.1776848522251 42.3902896512902))') As geog; ← per_meters | per_ft -----------------+------------------ 37.3790462565251 | 122.634666195949
多边形集合的例子:
SELECT ST_Perimeter(geog) As per_meters, ST_Perimeter(geog,false) As per_sphere_meters, ← ST_Perimeter(geog)/0.3048 As per_ft FROM ST_GeogFromText('MULTIPOLYGON(((-71.1044543107478 42.340674480411,-71.1044542869917 42.3406744369506, -71.1044553562977 42.340673886454,-71.1044543107478 42.340674480411)), ((-71.1044543107478 42.340674480411,-71.1044860600303 42.3407237015564,-71.1045215770124 42.3407653385914, -71.1045498002983 42.3407946553165,-71.1045611902745 42.3408058316308,-71.1046016507427 42.340837442371, -71.104617893173 42.3408475056957,-71.1048586153981 42.3409875993595,-71.1048736143677 42.3409959528211, -71.1048878050242 42.3410084812078,-71.1044020965803 42.3414730072048, -71.1039672113619 42.3412202916693,-71.1037740497748 42.3410666421308, -71.1044280218456 42.3406894151355,-71.1044543107478 42.340674480411)))') As geog; per_meters | per_sphere_meters| per_ft -----------------+------------------+------------------ 257.634283683311 | 257.412311446337 | 845.256836231335
参考
ST_GeogFromText, ST_GeomFromText, ST_Length
6.12.23. ST_Perimeter2D
ST_Perimeter2D — 如果输入对象是 polygon 或 multipolygon 对象,则返回 2 维周长。该函数是函数 ST_Perimeter 的别名。
用法
float ST_Perimeter2D(geometry geomA);
描述
如果输入对象是 polygon 或 multipolygon 对象,则返回 2 维周长。该函数是函数 ST_Perimeter 的别名。
注意
该函数是函数 ST_Perimeter 的别名。未来版本的 ST_Perimeter 会返回一个几何对象的最高维度中的周长。目前该函数的实现还在研究中
参考
ST_Perimeter
6.12.24. ST_3DPerimeter
ST_3DPerimeter — 如果输入对象是 polygon 或 multipolygon 对象,则返回 3 维周长。
用法
float ST_3DPerimeter(geometry geomA);
描述
如果输入对象是 polygon 或 multipolygon 对象,则返回 3 维周长。如果输入对象是 2 维的几何对象,那么返回的是 2 维周长这个函数支持 3D 对象,并且不会删除 z 坐标。
样例
返回一个略微被抬升到空中的多边形的周长,以英尺为单位:
SELECT ST_3DPerimeter(the_geom), ST_Perimeter2d(the_geom), ST_Perimeter(the_geom) FROM (SELECT ST_GeomFromEWKT('SRID=2249;POLYGON((743238 2967416 2,743238 2967450 1, 743265.625 2967416 1,743238 2967416 2))') As the_geom) As foo; ST_3DPerimeter | st_perimeter2d | st_perimeter -----------------+------------------+------------------ 105.465793597674 | 105.432997272188 | 105.432997272188
参考
ST_GeomFromEWKT, ST_Perimeter, ST_Perimeter2D
6.12.25. ST_Project
ST_Project — 返回一个输入类型为距离(单位:米)和方位角(单位:弧度)经投影转换后的 Point 类型
用法
geography ST_Project(geography g1, float distance, float azimuth);
描述
返回一个输入类型为距离(单位:米)和方位角(单位:弧度)经投影转换后的 Point 类型距离、方位角和投影系统是对两个点操作。描述位置关系的全部要素方位角有时候被称为航向角。 它的值的计算起始轴是正北方向,记为 0 方位角东方的方位角是 90 度,南方的方位角是 180 度,西方的方位角是 270 度距离单位是米
样例: 使用角度,投影点位于 100,000 米外,方位角 45 度处
SELECT ST_AsText(ST_Project('POINT(0 0)'::geography, 100000, radians(45.0))); st_astext ------------------------------------------ POINT(0.63523102912532 0.63947233472882) (1 row)
样例: 使用弧度,投影点位于 100,000 米外,方位角 pi/4 弧度处
SELECT ST_AsText(ST_Project('POINT(0 0)'::geography, 100000, pi()/4)); st_astext ------------------------------------------ POINT(0.63523102912532 0.63947233472882) (1 row)
参考
ST_Azimuth, ST_Distance, KingbaseES 数学函数
6.12.26. ST_ShortestLine
ST_ShortestLine — 返回两个几何对象之间最短的 2 维线段
用法
geometry ST_ShortestLine(geometry g1, geometry g2);
描述
返回两个几何对象之间 2 维最短的线段,如果函数找到这两个几何对象之间不止一条线段,那么只会返回第一条。如果 g1 和 g2 只在一个点相交,该函数会返回一条返回起点和终点都在该交点的线段。如果 g1 和 g2 相交不止一个点,该函数会返回起点和终点都在同一点的线段,但该交点可以是 g1 和 g2 相交的任意一点。返回的线段起点总是属于 g1,终点属于 g2。该函数返回的线段的 3D 长度总是和 ST_Distance 计算 g1 和 g2 之间的距离值是一样的。
样例
图 6.12.6 Shortest line between point and linestring
SELECT ST_AsText( ST_ShortestLine('POINT(100 100) '::geometry, 'LINESTRING (20 80, 98190, 110 180, 50 75 )'::geometry) ) As sline; sline -------------------------------------------------------- LINESTRING(100 100,73.0769230769231 115.384615384615)
参考
ST_ClosestPoint, ST_Distance, ST_LongestLine, ST_MaxDistance
参考
ST_ClosestPoint, ST_Distance, ST_LongestLine, ST_MaxDistance
6.12.27. ST_3DShortestLine
ST_3DShortestLine — 返回两个 3 维几何对象之间最短的线段
用法
geometry ST_3DShortestLine(geometry g1, geometry g2);
描述
返回两个 3 维几何对象之间最短的线段,如果函数找到这两个 3 维几何对象之间不止一条线段,那么只会返回第一条。如果 g1 和 g2 只在一个点相交,该函数会返回一条返回起点和终点都在该交点的线段。如果 g1 和 g2 相交不止一个点,该函数会返回起点和终点都在同一点的线段,但该交点可以是 g1 和 g2 相交的任意一点。返回的线段起点总是属于 g1,终点属于 g2。该函数返回的线段的 3D 长度总是和 ST_3Ddistance 计算 g1 和 g2 之间的距离值是一样的。
-
这个函数支持 3D 对象,并且不会删除 z 坐标
-
该函数支持 Polyhedral Surface 类型几何对象.
样例
线串与点,3D 与 2D 最短连线:
SELECT ST_AsEWKT(ST_3DShortestLine(line,pt)) AS shl3d_line_pt, ST_AsEWKT(ST_ShortestLine(line,pt)) As shl2d_line_pt FROM (SELECT 'POINT(100 100 30)'::geometry As pt, 'LINESTRING (20 80 20, 98 190 1, 110 180 3, 50 75 1000)':: geometry As line ) As foo; shl3d_line_pt |shl2d_line_pt -------------------------------------------------------------------------+---------------------------------------------------- LINESTRING(54.6993798867619 128.935022917228 11.5475869506606,100 100 30)|LINESTRING(73.0769230769231 115.384615384615,100 100)
线串与点集,3D 与 2D 最短连线:
SELECT ST_AsEWKT(ST_3DShortestLine(line,pt)) AS shl3d_line_pt, ST_AsEWKT(ST_ShortestLine(line,pt)) As shl2d_line_pt FROM (SELECT 'MULTIPOINT(100 100 30, 50 74 1000)'::geometry As pt, 'LINESTRING (20 80 20, 98 190 1, 110 180 3, 50 75 900)':: geometry As line ) As foo; shl3d_line_pt |shl2d_line_pt --------------------------------------------------------------------------+---------------------- LINESTRING(54.6993798867619 128.935022917228 11.5475869506606,100 100 30) | LINESTRING(50 75,50 74)
多线串与多边形,3D 与 2D 最短连线:
SELECT ST_AsEWKT(ST_3DShortestLine(poly, mline)) As shl3d, ST_AsEWKT(ST_ShortestLine(poly, mline)) As shl2d FROM (SELECT ST_GeomFromEWKT('POLYGON((175 150 5, 20 40 5, 35 45 5, 50 60 5, 100 100 5, 175 150 5))') As poly, ST_GeomFromEWKT('MULTILINESTRING((175 155 2, 20 40 20, 50 60 -2, 125 100 1, 175 155 1), (1 10 2, 5 20 1))') As mline ) As foo; shl3d | shl2d -------------------------------------------------------------------------------------------------+------------------------ LINESTRING(39.993580415989 54.1889925532825 5,40.4078575708294 53.6052383805529 5.03423778139177)| LINESTRING(20 40,20 40)
参考
ST_3DClosestPoint, ST_3DDistance, ST_LongestLine, ST_ShortestLine, ST_3DMaxDistance