本文介绍时空函数中的处理函数。
引擎与版本
处理函数仅适用于宽表引擎。无版本要求。
函数列表
Lindorm GanosBase支持的处理函数如下表所示。
函数 | 说明 |
返回以指定点为中心点,以指定距离为半径的所有点组成的Geometry对象。 | |
返回以指定点为中心点,以指定距离为半径的所有点在球面上组成的Geometry对象。 | |
将两个或者两个以上的Geometry对象组合为Multi*(包括MultiPoint、MultiLineString、MultiPolygon)或者GeometryCollection对象并返回。 | |
返回Geometry对象A与Geometry对象B不相交的部分。 | |
返回Geometry对象A与Geometry对象B的交集对应的Geometry对象。 | |
返回包含指定Geometry对象的最小Circle Polygon对象。 | |
返回完全包含指定Geometry对象的最小圆形的半径。 | |
将不合法的Geometry对象转换为合法对象并返回。 | |
返回两个或者两个以上Geometry对象并集后的Geometry对象。 |
ST_Buffer
返回以指定点为中心点,以指定距离为半径的所有点组成的Geometry对象,距离的单位为degree。
语法
ST_Buffer(geometry g, double radius)
参数说明
参数 | 描述 |
g | 指定的Geometry对象。 |
radius | 指定的距离,即buffer半径,单位为degree。 |
Geometry对象支持Point、LineString、Polygon、MultiPoint、MultiLineString、MultiPolygon和GeometryCollection类型。
如果指定的radius为正,返回向外扩展后的Geometry对象。如果指定的radius为负,返回向内收缩后的Geometry对象,返回结果可能为EMPTY。
仅支持采用默认的buffer style,弧段分段数(quadrantSegments)默认值为8,端盖样式(endCapStyle)默认值为round。
示例
示例1
SELECT ST_AsText(ST_Buffer(ST_GeomFromText('POINT(120.18 30.25)'), 0.05)) AS buffer;
返回结果:
+--------------------------------+ | buffer | +--------------------------------+ | POLYGON ((120.23 30.25, | | 120.22903926402017 | | 30.240245483899194, | | 120.22619397662557 | | 30.230865828381745, | | 120.22157348061513 | | 30.22222148834902, | | 120.21535533905933 | | 30.21464466094067, | | 120.20777851165099 | | 30.208426519384872, | | 120.19913417161825 | | 30.203806023374437, | | 120.18975451610082 | | 30.200960735979837, 120.18 | | 30.2, 120.1702454838992 | | 30.200960735979837, | | 120.16086582838176 | | 30.203806023374437, | | 120.15222148834903 | | 30.208426519384872, | | 120.14464466094068 | | 30.21464466094067, | | 120.13842651938488 | | 30.22222148834902, | | 120.13380602337445 | | 30.230865828381745, | | 120.13096073597984 | | 30.240245483899194, | | 120.13000000000001 | | 30.25, 120.13096073597984 | | 30.259754516100806, | | 120.13380602337445 | | 30.269134171618255, | | 120.13842651938488 | | 30.27777851165098, | | 120.14464466094068 | | 30.28535533905933, | | 120.15222148834903 | | 30.291573480615128, | | 120.16086582838176 | | 30.296193976625563, | | 120.1702454838992 | | 30.299039264020163, 120.18 | | 30.3, 120.18975451610082 | | 30.299039264020163, | | 120.19913417161825 | | 30.296193976625563, | | 120.20777851165099 | | 30.291573480615128, | | 120.21535533905933 | | 30.28535533905933, | | 120.22157348061513 | | 30.27777851165098, | | 120.22619397662557 | | 30.269134171618255, | | 120.22903926402017 | | 30.259754516100806, 120.23 | | 30.25)) | +--------------------------------+
示例2
SELECT ST_AsText(ST_Buffer(ST_GeomFromText('LINESTRING (120.18 30.25, 120.16 30.23)'), 0.01)) AS buffer;
返回结果:
+--------------------------------+ | buffer | +--------------------------------+ | POLYGON ((120.16707106781186 | | 30.222928932188132, | | 120.1655557023302 | | 30.221685303876974, | | 120.16382683432364 | | 30.220761204674886, | | 120.16195090322016 | | 30.220192147195966, 120.16 | | 30.22, 120.15804909677983 | | 30.22019214719597, | | 120.15617316567635 | | 30.22076120467489, | | 120.1544442976698 | | 30.221685303876978, | | 120.15292893218813 | | 30.222928932188136, | | 120.15168530387697 | | 30.224444297669805, | | 120.15076120467488 | | 30.226173165676354, | | 120.15019214719597 | | 30.22804909677984, | | 120.14999999999999 | | 30.230000000000004, | | 120.15019214719597 | | 30.231950903220163, | | 120.15076120467488 | | 30.233826834323654, | | 120.15168530387697 | | 30.2355557023302, | | 120.15292893218813 | | 30.23707106781187, | | 120.17292893218814 | | 30.257071067811868, | | 120.17444429766981 | | 30.258314696123026, | | 120.17617316567636 | | 30.259238795325114, | | 120.17804909677984 | | 30.259807852804034, 120.18 | | 30.26, 120.18195090322017 | | 30.25980785280403, | | 120.18382683432365 | | 30.25923879532511, | | 120.1855557023302 | | 30.258314696123023, | | 120.18707106781187 | | 30.257071067811864, | | 120.18831469612303 | | 30.255555702330195, | | 120.18923879532512 | | 30.253826834323647, | | 120.18980785280404 | | 30.25195090322016, | | 120.19000000000001 | | 30.249999999999996, | | 120.18980785280404 | | 30.248049096779837, | | 120.18923879532512 | | 30.246173165676346, | | 120.18831469612303 | | 30.2444442976698, | | 120.18707106781187 | | 30.242928932188132, | | 120.16707106781186 | | 30.222928932188132)) | +--------------------------------+
ST_BufferSphere
返回以指定点为中心点,以指定距离为半径的所有点在球面上组成的Geometry对象,距离的单位为米。
语法
ST_BufferSphere(geometry g, double radius)
参数说明
参数 | 描述 |
g | 指定的Geometry对象。 |
radius | 指定的距离,即buffer半径,单位为米。 |
Geometry对象支持Point、LineString、Polygon、MultiPoint、MultiLineString、MultiPolygon和GeometryCollection类型。
如果指定的radius为正,返回向外扩展后的Geometry对象。如果指定的radius为负,返回向内收缩后的Geometry对象,返回结果可能为EMPTY。
仅支持采用默认的buffer style,弧段分段数(quadrantSegments)默认值为8,端盖样式(endCapStyle)默认值为round。
示例
示例1
SELECT ST_AsText(ST_BufferSphere(ST_GeomFromText('POINT(120.18 30.25)'), 500)) AS buffer;
返回结果:
+--------------------------------+ | buffer | +--------------------------------+ | POLYGON ((120.1851909310331 | | 30.25011173053024, | | 120.18511627294788 | | 30.249230378090658, | | 120.18484500297895 | | 30.248378605521545, | | 120.18438755060062 | | 30.247589145091563, | | 120.1837614989031 | | 30.246892333708224, | | 120.18299090835872 | | 30.24631494733322, | | 120.18210539193977 | | 30.245879172318283, | | 120.18113897716789 | | 30.24560175314354, | | 120.18012879881775 | | 30.245493349257533, | | 120.17911367245745 | | 30.245558125686234, | | 120.17813260355221 | | 30.245793593106626, | | 120.17722328930826 | | 30.246190703510113, | | 120.17642067070908 | | 30.24673419777976, | | 120.17575559027851 | | 30.247403191844143, | | 120.17525360707266 | | 30.248171978919647, | | 120.1749340144007 | | 30.249011017060198, | | 120.17480909803247 | | 30.249888064116504, | | 120.17488366345407 | | 30.250769416537622, | | 120.17515485043153 | | 30.251621204446096, | | 120.17561224212514 | | 30.252410693237966, | | 120.17623826468355 | | 30.253107541687907, | | 120.17700886207045 | | 30.253684968191145, | | 120.17789442027193 | | 30.254120780286797, | | 120.1788609054053 | | 30.25439822784955, | | 120.17987117198402 | | 30.25450664710903, | | 120.18088639100795 | | 30.254441870698788, | | 120.18186754290468 | | 30.254206387939035, | | 120.1827769178333 | | 30.25380924917365, | | 120.1835795655716 | | 30.253265717837415, | | 120.1842446391596 | | 30.252596683644782, | | 120.18474658058295 | | 30.251827859488568, | | 120.18506610289342 | | 30.250988792960012, | | 120.1851909310331 | | 30.25011173053024)) | +--------------------------------+
示例2
SELECT ST_AsText(ST_BufferSphere(ST_GeomFromText('LINESTRING (120.18 30.25, 120.16 30.23)'), 20)) AS buffer;
返回结果:
+--------------------------------+ | buffer | +--------------------------------+ | POLYGON ((120.1601568095326 | | 30.229881789491696, | | 120.16012723865646 | | 30.22985749603038, | | 120.16009277809007 | | 30.229838678911875, | | 120.16005475213065 | | 30.229826061263992, | | 120.16001462208855 | | 30.22982012797305, | | 120.15997393013107 | | 30.229821107050387, | | 120.15993424001891 | | 30.22982896087028, | | 120.15989707701289 | | 30.229843387615915, | | 120.15986386926043 | | 30.229863832877875, | | 120.15983589291346 | | 30.229889510959428, | | 120.15981422308717 | | 30.229919435069952, | | 120.15979969254388 | | 30.22995245524614, | | 120.15979285969011 | | 30.22998730254394, | | 120.15979398711634 | | 30.23002263780298, | | 120.15980303150468 | | 30.230057103109367, | | 120.15981964529222 | | 30.230089373979652, | | 120.15984319002649 | | 30.230118210260056, | | 120.17984317814214 | | 30.250118233425205, | | 120.17987275990819 | | 30.250142523059253, | | 120.17990723145967 | | 30.250161335607235, | | 120.17994526807108 | | 30.250173948109982, | | 120.17998540801094 | | 30.250179875873307, | | 120.18002610871608 | | 30.25017889109486, | | 120.18006580607275 | | 30.25017103161881, | | 120.18010297452594 | | 30.250156599481485, | | 120.18013618570674 | | 30.25013614930418, | | 120.18016416332479 | | 30.25011046697896, | | 120.18018583221566 | | 30.250080539466826, | | 120.18020035965924 | | 30.250047516868772, | | 120.18020718737982 | | 30.25001266822753, | | 120.18020605299972 | | 30.249977332758547, | | 120.18019700012098 | | 30.2499428683844, | | 120.18018037664854 | | 30.249910599550603, | | 120.1801568214192 | | 30.249881766327974, | | 120.1601568095326 | | 30.229881789491696)) | +--------------------------------+
ST_Collect
将两个或者两个以上的Geometry对象组合为Multi*(包括MultiPoint、MultiLineString、MultiPolygon)或者GeometryCollection对象并返回。
语法
ST_Collect(geometry geomA, geometry geomB)
ST_Collect(geometry geomA, geometry geomB, ...,geometry geomN)
参数说明
参数 | 描述 |
geomA | 指定的第一个Geometry对象。 |
geomB | 指定的第二个Geometry对象。 |
geomN | 指定的第N个Geometry对象。 |
函数
ST_Collect
返回结果为Multi*或者GeometryCollection类型,在Lindorm GanosBase SQL中仅支持读取,不支持写入。函数
ST_Collect
和函数ST_Union
可以相互替换来使用,但是有以下区别:函数
ST_Collect
的返回结果为Multi*或者GeometryCollection类型,而函数ST_Union
的返回结果可能是单个Geometry对象。函数
ST_Union
在节点相交处分割LineString,而函数ST_Collect
返回的是MultiLineString类型。一般情况下,
ST_Collect
比ST_Union
函数计算速度快。因为ST_Collect
不会分解输入的Geometry对象的边界或者检查MultiPolygon对象是否有重叠部分,只是把输入的多个Geometry对象组合成一个Multi*类型,或者把Multi*类型组合成一个GeometryCollection集合类型。
示例
示例1:返回MultiPoint对象。
SELECT ST_AsText(ST_Collect(ST_MakePoint(0,0),ST_MakePoint(0,1))) AS g;
返回结果:
+---------------------------+ | g | +---------------------------+ | MULTIPOINT ((0 0), (0 1)) | +---------------------------+
示例2:返回GeometryCollection对象。
SELECT ST_AsText(ST_Collect(ST_MakePoint(0,0),ST_GeomFromText('LINESTRING(0 2,0 3)'))) AS g;
返回结果:
+--------------------------------+ | g | +--------------------------------+ | GEOMETRYCOLLECTION (POINT (0 | | 0), LINESTRING (0 2, 0 3)) | +--------------------------------+
ST_Difference
返回Geometry对象A与Geometry对象B不相交的部分。
语法
ST_Difference(geometry geomA, geometry geomB)
参数说明
参数 | 描述 |
geomA | 指定的第一个Geometry对象。 |
geomB | 指定的第二个Geometry对象。 |
Geometry对象支持Point、LineString、Polygon、MultiPoint、MultiLineString、MultiPolygon和GeometryCollection类型。
如果Geometry对象A完全被Geometry对象B包含或者Geometry对象A为EMPTY,那么返回一个空几何类型。
如果指定的Polygon类型自身存在相交边,那么可能无法返回结果。
该函数的返回值与输入对象的顺序有关。
示例
SELECT ST_AsText(ST_Difference(ST_GeomFromText('LINESTRING(50 100, 50 200)'),ST_GeomFromText('LINESTRING(50 50, 50 150)'))) AS diff;
返回结果:
+-----------------------------+
| diff |
+-----------------------------+
| LINESTRING (50 150, 50 200) |
+-----------------------------+
ST_Intersection
返回Geometry对象A与Geometry对象B的交集对应的Geometry对象。
语法
ST_Intersection(geometry geomA, geometry geomB)
参数说明
参数 | 描述 |
geomA | 指定的第一个Geometry对象。 |
geomB | 指定的第二个Geometry对象。 |
Geometry对象支持Point、LineString、Polygon、MultiPoint、MultiLineString、MultiPolygon和GeometryCollection类型。
两个Geometry对象中任意一个为EMPTY,那么返回值也是EMPTY。
如果指定的Polygon类型自身存在相交边,那么可能无法返回结果。
示例
SELECT ST_AsText(ST_Intersection(ST_GeomFromText('POINT(0 0)'), ST_GeomFromText('LINESTRING ( 0 0, 0 2 )'))) AS inter;
返回结果:
+-------------+
| inter |
+-------------+
| POINT (0 0) |
+-------------+
ST_MinimumBoundingCircle
返回包含指定Geometry对象的最小Circle Polygon对象。
语法
ST_MinimumBoundingCircle(geometry g)
参数说明
参数 | 描述 |
g | 指定的Geometry对象。 |
ST_MinimumBoundingCircle
函数通常用于处理Multi*(包括MultiPoint、MultiLineString、MultiPolygon)或者GeometryCollection对象。虽然该函数不是一个聚合函数,但是您可以使用ST_Collect
函数获取多个Geometry对象集合的最小包围圈,即ST_MinimumBoundingCircle(ST_Collect(geometry geomA, geometry geomB, geometry geomC, ...))
。
示例
SELECT ST_AsText(ST_MinimumBoundingCircle(ST_GeomFromText('POLYGON((0 0,1 0,1 1,0 1,0 0))'))) AS g;
返回结果:
+--------------------------------+
| g |
+--------------------------------+
| POLYGON ((1.2071067811865475 |
| 0.5, 1.1935199226610738 |
| 0.3620503103585285, |
| 1.1532814824381883 |
| 0.2294019499269015, |
| 1.0879378012096794 |
| 0.1071525208064489, 1 |
| 0, 0.8928474791935512 |
| -0.0879378012096794, |
| 0.7705980500730986 |
| -0.1532814824381883, |
| 0.6379496896414716 |
| -0.1935199226610738, |
| 0.5 -0.2071067811865476, |
| 0.3620503103585285 |
| -0.1935199226610738, |
| 0.2294019499269015 |
| -0.1532814824381883, |
| 0.107152520806449 |
| -0.0879378012096794, |
| 0 -0.0000000000000001, |
| -0.0879378012096794 |
| 0.1071525208064489, |
| -0.1532814824381883 |
| 0.2294019499269014, |
| -0.1935199226610738 |
| 0.3620503103585282, |
| -0.2071067811865476 |
| 0.4999999999999999, |
| -0.1935199226610738 |
| 0.6379496896414716, |
| -0.1532814824381884 |
| 0.7705980500730985, |
| -0.0879378012096795 |
| 0.892847479193551, |
| -0.0000000000000001 |
| 1, 0.1071525208064489 |
| 1.0879378012096794, |
| 0.2294019499269011 |
| 1.1532814824381883, |
| 0.3620503103585282 |
| 1.1935199226610735, |
| 0.4999999999999999 |
| 1.2071067811865475, |
| 0.6379496896414716 |
| 1.1935199226610738, |
| 0.7705980500730987 |
| 1.1532814824381883, |
| 0.8928474791935508 |
| 1.0879378012096796, |
| 0.9999999999999999 |
| 1, 1.0879378012096794 |
| 0.892847479193551, |
| 1.1532814824381883 |
| 0.7705980500730989, |
| 1.1935199226610735 |
| 0.6379496896414718, |
| 1.2071067811865475 0.5)) |
+--------------------------------+
ST_MinimumBoundingRadius
返回完全包含指定Geometry对象的最小圆形的半径。
语法
ST_MinimumBoundingRadius(geometry g)
参数说明
参数 | 描述 |
g | 指定的Geometry对象。 |
返回时默认支持DOUBLE数据类型,最多可输出小数点后16位。
该函数可以与
ST_Collect
函数组合使用,来获取一组Geometry对象的最小包围圈。
示例
SELECT ST_MinimumBoundingRadius(ST_GeomFromText('POLYGON((0 1,-1 0,0 -1,1 0,0 1))')) AS radius;
返回结果:
+----------+
| radius |
+----------+
| 1.0 |
+----------+
ST_MakeValid
将不合法的Geometry对象转换为合法对象并返回。
语法
geometry ST_MakeValid(geometry g)
参数说明
参数 | 描述 |
g | 目标Geometry对象。 |
ST_MakeValid
函数可以将自相交的Polygon对象切分成由多个Polygon对象组成的MultiPolygon对象。对于有Polygon对象重叠的MultiPolygon对象,
ST_MakeValid
函数可以对重叠的Polygon对象计算并集,并将重叠的Polygon对象合并成一个。
示例
示例1:将有自相交情况的Polygon对象转化成无自相交的MultiPolygon对象。
SELECT ST_AsText(geom) as original, ST_AsText(ST_MakeValid(geom)) AS validated FROM mapdata WHERE id=10000001;
返回结果:
+--------------------------------+--------------------------------+ | original | validated | +--------------------------------+--------------------------------+ | POLYGON ((0 0, 10 10, 0 10, 10 | MULTIPOLYGON (((0 0, 5 5, 10 | | 0, 0 0)) | 0, 0 0)), ((5 5, 0 10, 10 10, | | | 5 5))) | +--------------------------------+--------------------------------+
示例2:将有重叠的MultiPolygon对象转化成计算并集后的Polygon对象。
SELECT ST_AsText(geom) as original, ST_AsText(ST_MakeValid(geom)) AS validated FROM mapdata WHERE adcode=10000002;
返回结果:
+--------------------------------+--------------------------------+ | original | validated | +--------------------------------+--------------------------------+ | MULTIPOLYGON (((0 0, 5 6, 10 | POLYGON ((4.166666666666667 | | 0, 0 0)), ((5 4, 0 10, 10 10, | 5, 0 10, 10 10, | | 5 4))) | 5.833333333333333 5, 10 0, 0 | | | 0, 4.166666666666667 5)) | +--------------------------------+--------------------------------+
ST_Union
返回两个或者两个以上Geometry对象并集后的Geometry对象。
语法
ST_Union(geometry g1, geometry g2, ..., geometry gn)
函数输出类型可以是Multi*(包括MultiPoint、MultiLineString、MultiPolygon)、非Multi*或者GeometryCollection。
参数说明
参数 | 描述 |
g1 | 指定的第一个Geometry对象。 |
g2 | 指定的第二个Geometry对象。 |
gn | 指定的第n个Geometry对象。 |
Geometry对象支持Point、LineString、Polygon类型。
该函数的输入方式分为以下两种形式:
输入参数为两个Geometry对象时,输出类型可能是Multi*、非Multi*或者GeometryCollection。如果任意一个Geometry对象为NULL,则返回值也是NULL。如果其中一个Geometry对象为EMPTY,则返回值为另一个Geometry对象。
输入参数为两个以上的Geometry对象时,输出类型可能是Multi*或者非Multi*。
函数
ST_Collect
和函数ST_Union
可以相互替换来使用。一般情况下,ST_Collect
比ST_Union
函数计算速度快。因为ST_Collect
不会分解输入的Geometry对象的边界或者检查MultiPolygon对象是否有重叠部分。如果指定的Polygon类型自身存在相交边,那么可能无法返回结果。
示例
SELECT ST_AsText(ST_Union(ST_MakePoint(1.0, 1.0), ST_MakePoint(2.0, 2.0))) AS u;
返回结果:
+---------------------------+
| u |
+---------------------------+
| MULTIPOINT ((1 1), (2 2)) |
+---------------------------+