Error message here!

Hide Error message here!

忘记密码?

Error message here!

请输入正确邮箱

Hide Error message here!

密码丢失?请输入您的电子邮件地址。您将收到一个重设密码链接。

Error message here!

返回登录

Close

Data Lake Analytics的Geospatial分析函数

阿里云云栖社区 2019-02-21 15:19:00 阅读数:182 评论数:0 点赞数:0 收藏数:0

0. 简介

为满足部分客户在云上做Geometry数据的分析需求,阿里云Data Lake Analytics(以下简称:DLA)支持多种格式的地理空间数据处理函数,符合Open Geospatial Consortium’s (OGC) OpenGIS规范,支持的常用数据格式包括:

  • WKT
  • WKB
  • GeoJson
  • ESRI Geometry Object Json
  • ESRI Shape

DLA采用4326坐标系标准,EPSG 4326使用经纬度坐标,属于地理坐标系。GPS采用的就是这个坐标系。

1. WKT数据

详细描述:https://en.wikipedia.org/wiki/Well-known_texthttp://www.opengeospatial.org/standards/wkt-crs

支持类似如下的WKT相关字符串。

  • POINT (0 0)
  • LINESTRING (0 0, 1 1, 1 2)
  • POLYGON ((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1))
  • MULTIPOINT (0 0, 1 2)
  • MULTILINESTRING ((0 0, 1 1, 1 2), (2 3, 3 2, 5 4))
  • MULTIPOLYGON (((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1)), ((-1 -1, -1 -2, -2 -2, -2 -1, -1 -1)))
  • GEOMETRYCOLLECTION (POINT (2 3), LINESTRING (2 3, 3 4))

2. WKB数据

详细描述:https://en.wikipedia.org/wiki/Well-knowntext/#Well-knownbinary

上述WKT数据和WKB的对应示例:WKT WKB POINT (0 0) 010100000000000000000000000000000000000000 LINESTRING (0 0, 1 1, 1 2) 01020000000300000000000000000000000000000000000000000000000000F03F000000000000F03F000000000000F03F0000000000000040 POLYGON ((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1)) 01030000000200000005000000000000000000000000000000000000000000000000001040000000000000000000000000000010400000000000001040000000000000000000000000000010400000000000000000000000000000000005000000000000000000F03F000000000000F03F000000000000F03F0000000000000040000000000000004000000000000000400000000000000040000000000000F03F000000000000F03F000000000000F03F MULTIPOINT (0 0, 1 2) 0104000000020000000101000000000000000000000000000000000000000101000000000000000000F03F0000000000000040 MULTILINESTRING ((0 0, 1 1, 1 2), (2 3, 3 2, 5 4)) 01050000000200000001020000000300000000000000000000000000000000000000000000000000F03F000000000000F03F000000000000F03F0000000000000040010200000003000000000000000000004000000000000008400000000000000840000000000000004000000000000014400000000000001040 MULTIPOLYGON (((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1)), ((-1 -1, -1 -2, -2 -2, -2 -1, -1 -1))) 01060000000200000001030000000200000005000000000000000000000000000000000000000000000000001040000000000000000000000000000010400000000000001040000000000000000000000000000010400000000000000000000000000000000005000000000000000000F03F000000000000F03F000000000000F03F0000000000000040000000000000004000000000000000400000000000000040000000000000F03F000000000000F03F000000000000F03F01030000000100000005000000000000000000F0BF000000000000F0BF00000000000000C0000000000000F0BF00000000000000C000000000000000C0000000000000F0BF00000000000000C0000000000000F0BF000000000000F0BF GEOMETRYCOLLECTION (POINT (2 3), LINESTRING (2 3, 3 4)) 0107000000020000000101000000000000000000004000000000000008400102000000020000000000000000000040000000000000084000000000000008400000000000001040

3. GeoJson数据

GeoJson的详细描述:http://geojson.org/

4. ESRI Geometry Object Json数据

规范说明:http://resources.esri.com/help/9.3/arcgisserver/apis/REST/geometry.html

5. ESRI Shape二进制数据

规范说明:http://www.esri.com/LIBRARY/WHITEPAPERS/PDFS/SHAPEFILE.PDF

6. 函数列表

Name Description STasText 将Geometry数据转成WKT格式的字符串数据。 STLineFromText 输入WKT格式的Line字符串数据,生成Line的Geometry数据。 STPoint 从坐标系的坐标值(X, Y),生成对应的Point的Geometry数据。 STPolygon 输入WKT格式的Polygon字符串数据,生成Polygon的Geometry数据。 STArea 返回面或多面的面积。对于点、线,返回0.0。对于GeometryCollection,返回所有单个面积的和。 STGeometryFromText 输入WKT格式的字符串数据,生成Geometry数据。 STBuffer 获取几何对象和距离,然后返回表示围绕源对象的缓冲区的几何对象。 STCentroid 获取几何对象的中心点。 STCoordDim 返回几何对象的坐标值维度。 STDimension 用于返回几何对象的维度。在这种情况下,维度是指长度和宽度。例如,点既没有长度也没有宽度,所以其维度为 0;而线只有长度却没有宽度,因此其维度为 1。 STIsClosed 判断Line或者MultiLine是否闭合。 STIsEmpty 判断几何对象是否为空。 STLength 计算Line或者MultiLine的长度。 STXMax 返回几何对象在坐标系中的最大X坐标值。 STXMin 返回几何对象在坐标系中的最小X坐标值。 STYMax 返回几何对象在坐标系中的最大Y坐标值。 STYMin 返回几何对象在坐标系中的最小Y坐标值。 STNumInteriorRing 以Polygon作为输入参数,并返回其内部环数。 STNumPoints 用于返回几何对象中的点(折点)数。 STIsRing 以Line作为输入参数,判断是否是环(如Line是闭合的)。 STStartPoint 用于返回Line的第一个点。 STEndPoint 用于返回Line的最后一个点。 STX 返回Point的X坐标。 STY 返回Point的Y坐标。 STBoundary 输入一个几何对象,然后以几何对象形式返回其组合边界。 STEnvelope 以多边形的形式返回几何对象的最小边界框。 STDifference 输入两个几何对象,然后返回表示两个源对象之差的几何对象。 STDistance 用于返回两个几何对象之间的距离。这一距离是两个几何对象的最近折点之间的距离。 STExteriorRing 以Line形式返回面的外部环。 STIntersection 以两个几何对象作为输入参数,然后以二维几何对象的形式返回交集。 STSymDifference 返回表示两个几何对象间的点集对称差异的几何值对象。 STContains 输入两个几何对象,判断第一个对象是否完全包含第二个对象。 STCrosses 以两个几何对象作为输入,如果这两个对象的交集生成的几何对象的维度小于两个源对象中的最大维度,则返回 1。交集对象所包含的点必须在两个源几何的内部,并且不等于其中任何一个源对象。否则,返回 0。 STDisjoint 输入两个几何对象,判断两个几何对象的交集是否为空集。 STEquals 判断两个几何对象是否完全相同。 STIntersects 判断两个几何对象的交集是否不生成空集。 STOverlaps 判断两个几何对象的交集生成的几何对象是否维度相同但不等于任一源对象。 STRelate 比较两个几何对象,判断是否满足“DE-9IM”模式(https://en.wikipedia.org/wiki/DE-9IM)矩阵字符串指定的条件。 STTouches 判断两个几何对象的公共点是否都不与两个几何对象的内部相交。 STWithin 判断第一个几何对象是否完全位于第二个几何对象的范围内。 STasBinary 输入一个几何对象,然后返回其可识别的二进制WKB数据。 STGeometryFromWKBHexString 输入WKB的HEX字符串数据,返回对应的几何对象。 STpointFromWKBHexString 输入Point的WKB的HEX字符串数据,返回对应的Point几何对象。 STlineFromWKBHexString 输入Line的WKB的HEX字符串数据,返回对应的Line几何对象。 STpolyFromWKBHexString 输入Polygon的WKB的HEX字符串数据,返回对应的Polygon几何对象。 STMPointFromWKBHexString 输入MultiPoint的WKB的HEX字符串数据,返回对应的MultiPoint几何对象。 STMLineFromWKBHexString 输入MultiLine的WKB的HEX字符串数据,返回对应的MultiLine几何对象。 STMPolyFromWKBHexString 输入MultiPolygon的WKB的HEX字符串数据,返回对应的MultiPolygon几何对象。 STGeometryFromWKB 输入WKB数据,返回对应的几何对象。 STpointFromWKB 输入Point的WKB数据,返回对应的Point几何对象。 STlineFromWKB 输入Line的WKB数据,返回对应的Line几何对象。 STpolyFromWKB 输入Polygon的WKB数据,返回对应的Polygon几何对象。 STMPointFromWKB 输入MultiPoint的WKB数据,返回对应的MultiPoint几何对象。 STMLineFromWKB 输入MultiLine的WKB数据,返回对应的MultiLine几何对象。 STMPolyFromWKB 输入MultiPolygon的WKB数据,返回对应的MultiPolygon几何对象。 STGeometryFromGeoJson 输入GeoJson的字符串数据,返回对应的几何对象。 STGeometryFromJson 输入ESRI Geometry Object Json的字符串数据,返回对应的几何对象。 STasGeoJson 把几何对象转成GeoJson格式输出。 STasJson 把几何对象转成ESRI Geometry Object Json格式输出。 STGeometryFromEsriShape 输入ESRI Shape的二进制数据,返回对应的几何对象。 UDFSYSGEOINCYCLE 仅适用于北半球:做基于地理位置的经纬度画圈 UDFSYSGEOINRECTANGLE 仅适用于北半球:用于做基于地理位置的经纬度画矩形 UDFSYSGEO_DISTANCE 仅适用于北半球:用作一个经纬度列和一个固定的坐标点的距离计算

7. 函数定义与示例

  • ST_asText
    ST_asText(GEOMETRY) -> VARCHAR

将Geometry数据转成WKT格式的字符串数据。

示例:select STasText(STLineFromText('LINESTRING (0 0, 1 1, 1 2)')); +----------------------------+ | _col0 | +----------------------------+ | LINESTRING (0 0, 1 1, 1 2) | +----------------------------+

  • ST_LineFromText
    ST_LineFromText(VARCHAR) -> GEOMETRY

输入WKT格式的Line字符串数据,生成Line的Geometry数据。

示例:select STasText(STLineFromText('LINESTRING (0 0, 1 1, 1 2)')); +----------------------------+ | _col0 | +----------------------------+ | LINESTRING (0 0, 1 1, 1 2) | +----------------------------+

  • ST_Point
    ST_Point(DOUBLE, DOUBLE) -> GEOMETRY

从坐标系的坐标值(X, Y),生成对应的Point的Geometry数据。

示例:select STasText(STPoint(30.2741500000,120.1551500000)); +----------------------------+ | _col0 | +----------------------------+ | POINT (30.27415 120.15515) | +----------------------------+

  • ST_Polygon
    ST_Polygon(VARCHAR) -> GEOMETRY

输入WKT格式的Polygon字符串数据,生成Polygon的Geometry数据。

示例:select STasText(STPolygon('POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1))')); +----------------------------------------------------------------+ | _col0 | +----------------------------------------------------------------+ | POLYGON ((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 1 2, 2 2, 2 1, 1 1)) | +----------------------------------------------------------------+

  • ST_Area
    ST_Area(Geometry) -> DOUBLE

返回面或多面的面积。对于点、线,返回0.0。对于GeometryCollection,返回所有单个面积的和。

示例:select STArea(STPolygon('POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1))')); +-------+ | col0 | +-------+ | 15.0 | +-------+ select STArea(STGeometryFromText('MULTIPOLYGON (((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1)), ((-1 -1, -1 -2, -2 -2, -2 -1, -1 -1)))')); +-------+ | col0 | +-------+ | 16.0 | +-------+

  • ST_GeometryFromText
    ST_GeometryFromText(VARCHAR) -> GEOMETRY

输入WKT格式的字符串数据,生成Geometry数据。

  • ST_Buffer
    ST_Buffer(GEOMETRY, DOUBLE) -> GEOMETRY

获取几何对象和距离,然后返回表示围绕源对象的缓冲区的几何对象。

  • ST_Centroid
    ST_Centroid(GEOMETRY) -> GEOMETRY

获取几何对象的中心点。

示例:select STasText(STCentroid(STGeometryFromText('MULTIPOLYGON (((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1)), ((-1 -1, -1 -2, -2 -2, -2 -1, -1 -1)))'))); +-----------------------+ | col0 | +-----------------------+ | POINT (1.8125 1.8125) | +-----------------------+ select STasText(STCentroid(STGeometryFromText('LINESTRING (0 0, 1 1, 1 2)'))); +---------------+ | col0 | +---------------+ | POINT (0.5 1) | +---------------+ select STasText(STCentroid(STGeometryFromText('POINT (0.5 1)'))); +---------------+ | col0 | +---------------+ | POINT (0.5 1) | +---------------+ select STasText(STCentroid(STGeometryFromText('POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1))'))); +---------------------------------------------+ | col0 | +---------------------------------------------+ | POINT (2.033333333333333 2.033333333333333) | +---------------------------------------------+

  • ST_CoordDim
    ST_CoordDim(GEOMETRY) -> BIGINT

返回几何对象的坐标值维度。

示例:select STCoordDim(STGeometryFromText('POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1))')); +-------+ | col0 | +-------+ | 2 | +-------+ select STCoordDim(STGeometryFromText('MULTIPOLYGON (((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1)), ((-1 -1, -1 -2, -2 -2, -2 -1, -1 -1)))')); +-------+ | col0 | +-------+ | 2 | +-------+ select stcoorddim(stgeometryfromtext('point Z (60.567222 -140.404 5959)')); +-------+ | col0 | +-------+ | 3 | +-------+ select stcoorddim(stgeometryfromtext('point M (60.567222 -140.404 5250)')); +-------+ | col0 | +-------+ | 3 | +-------+ select stcoorddim(stgeometryfromtext('point ZM (60.567222 -140.404 5959 5250)')); +-------+ | _col0 | +-------+ | 4 | +-------+

  • ST_Dimension
    ST_Dimension(GEOMETRY) -> BIGINT

用于返回几何对象的维度。在这种情况下,维度是指长度和宽度。例如,点既没有长度也没有宽度,所以其维度为 0;而线只有长度却没有宽度,因此其维度为 1。

示例:select STDimension(STGeometryFromText('MULTIPOLYGON (((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1)), ((-1 -1, -1 -2, -2 -2, -2 -1, -1 -1)))')); +-------+ | _col0 | +-------+ | 2 | +-------+

  • ST_IsClosed
    ST_IsClosed(GEOMETRY) -> BOOLEAN

判断Line或者MultiLine是否闭合。

示例:select STIsClosed(STGeometryFromText('LINESTRING (0 0, 1 1, 1 2)')); +-------+ | col0 | +-------+ | 0 | +-------+ select STIsClosed(STGeometryFromText('LINESTRING (0 0, 1 1, 1 2, 0 0)')); +-------+ | col0 | +-------+ | 1 | +-------+ select STIsClosed(STGeometryFromText('MULTILINESTRING ((0 0, 1 1, 1 2), (2 3, 3 2, 5 4))')); +-------+ | _col0 | +-------+ | 0 | +-------+

  • ST_IsEmpty
    ST_IsEmpty(GEOMETRY) -> BOOLEAN

判断几何对象是否为空。

示例:select STIsEmpty(STGeometryFromText('LINESTRING (0 0, 1 1, 1 2, 0 0)')); +-------+ | col0 | +-------+ | 0 | +-------+ select STIsEmpty(null); +-------+ | col0 | +-------+ | NULL | +-------+ SELECT STIsEmpty(STGeometryFromText('GEOMETRYCOLLECTION EMPTY')); +-------+ | col0 | +-------+ | 1 | +-------+ SELECT STIsEmpty(STGeometryFromText('POLYGON EMPTY')); +-------+ | _col0 | +-------+ | 1 | +-------+

  • ST_Length
    ST_Length(GEOMETRY) -> DOUBLE

计算Line或者MultiLine的长度。

示例:SELECT STLength(STGeometryFromText('LINESTRING (0 0, 1 1, 1 2, 0 0)')); +-------------------+ | col0 | +-------------------+ | 4.650281539872885 | +-------------------+ SELECT STLength(STGeometryFromText('MULTILINESTRING ((0 0, 1 1, 1 2), (2 3, 3 2, 5 4))')); +-------------------+ | col0 | +-------------------+ | 6.656854249492381 | +-------------------+

  • ST_XMax
    ST_XMax(GEOMETRY) -> DOUBLE

返回几何对象在坐标系中的最大X坐标值。

示例:SELECT STXMax(STGeometryFromText('MULTILINESTRING ((0 0, 1 1, 1 2), (2 3, 3 2, 5 4))')); +-------+ | col0 | +-------+ | 5.0 | +-------+ SELECT STXMax(STGeometryFromText('POINT (0.5 1)')); +-------+ | col0 | +-------+ | 0.5 | +-------+

  • ST_XMin
    ST_XMin(GEOMETRY) -> DOUBLE

返回几何对象在坐标系中的最小X坐标值。

示例:SELECT STXMin(STGeometryFromText('MULTILINESTRING ((0 0, 1 1, 1 2), (2 3, 3 2, 5 4))')); +-------+ | col0 | +-------+ | 0.0 | +-------+ SELECT STXMin(STGeometryFromText('POINT (0.5 1)')); +-------+ | col0 | +-------+ | 0.5 | +-------+

  • ST_YMax
    ST_YMax(GEOMETRY) -> DOUBLE

返回几何对象在坐标系中的最大Y坐标值。

示例:SELECT STYMax(STGeometryFromText('MULTILINESTRING ((0 0, 1 1, 1 2), (2 3, 3 2, 5 4))')); +-------+ | col0 | +-------+ | 4.0 | +-------+ SELECT STYMax(STGeometryFromText('POINT (0.5 1)')); +-------+ | col0 | +-------+ | 1.0 | +-------+

  • ST_YMin
    ST_YMin(GEOMETRY) -> DOUBLE

返回几何对象在坐标系中的最小Y坐标值。

示例:SELECT STYMin(STGeometryFromText('MULTILINESTRING ((0 0, 1 1, 1 2), (2 3, 3 2, 5 4))')); +-------+ | col0 | +-------+ | 0.0 | +-------+ SELECT STYMin(STGeometryFromText('POINT (0.5 1)')); +-------+ | col0 | +-------+ | 1.0 | +-------+

  • ST_NumInteriorRing
    ST_NumInteriorRing(GEOMETRY) -> BIGINT

以Polygon作为输入参数,并返回其内部环数。

示例:SELECT STNumInteriorRing(STGeometryFromText('POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1))')); +-------+ | _col0 | +-------+ | 1 | +-------+

  • ST_NumPoints
    ST_NumPoints(GEOMETRY) -> BIGINT

用于返回几何对象中的点(折点)数。

示例:SELECT STNumPoints(STGeometryFromText('POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1))')); +-------+ | col0 | +-------+ | 8 | +-------+ SELECT STNumPoints(STGeometryFromText('POLYGON EMPTY')); +-------+ | col0 | +-------+ | 0 | +-------+ SELECT STNumPoints(STGeometryFromText('POINT (0.5 1)')); +-------+ | _col0 | +-------+ | 1 | +-------+

  • ST_IsRing
    ST_IsRing(GEOMETRY) -> BOOLEAN

以Line作为输入参数,判断是否是环(如Line是闭合的)。

示例:select STIsRing(STGeometryFromText('LINESTRING (0 0, 1 1, 1 2)')); +-------+ | col0 | +-------+ | 0 | +-------+ select STIsRing(STGeometryFromText('LINESTRING (0 0, 1 1, 1 2, 0 0)')); +-------+ | col0 | +-------+ | 1 | +-------+

  • ST_StartPoint
    ST_StartPoint(GEOMETRY) -> GEOMETRY

用于返回Line的第一个点。

示例:select STasText(STStartPoint(STGeometryFromText('LINESTRING (0 0, 1 1, 1 2, 0 0)'))); +-------------+ | col0 | +-------------+ | POINT (0 0) | +-------------+

  • ST_EndPoint
    ST_EndPoint(GEOMETRY) -> GEOMETRY

用于返回Line的最后一个点。

示例:select STasText(STEndPoint(STGeometryFromText('LINESTRING (0 0, 1 1, 1 2)'))); +-------------+ | col0 | +-------------+ | POINT (1 2) | +-------------+

  • ST_X
    ST_X(GEOMETRY) -> DOUBLE

返回Point的X坐标。

示例:select STX(STGeometryFromText('POINT (0.5 1)')); +-------+ | _col0 | +-------+ | 0.5 | +-------+

  • ST_Y
    ST_Y(GEOMETRY) -> DOUBLE

返回Point的Y坐标。

示例:select STY(STGeometryFromText('POINT (0.5 1)')); +-------+ | _col0 | +-------+ | 1.0 | +-------+

  • ST_Boundary
    ST_Boundary(GEOMETRY) -> GEOMETRY

输入一个几何对象,然后以几何对象形式返回其组合边界。

示例:select STasText(STBoundary(STGeometryFromText('POINT (0.5 1)'))); +-------------+ | col0 | +-------------+ | POINT EMPTY | +-------------+ select STasText(STBoundary(STGeometryFromText('LINESTRING (0 0, 1 1, 1 2)'))); +---------------------------+ | col0 | +---------------------------+ | MULTIPOINT ((0 0), (1 2)) | +---------------------------+ select STasText(STBoundary(STGeometryFromText('MULTIPOLYGON (((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1)), ((-1 -1, -1 -2, -2 -2, -2 -1, -1 -1)))'))); +-------------------------------------------------------------------------------------------------------------+ | col0 | +-------------------------------------------------------------------------------------------------------------+ | MULTILINESTRING ((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 1 2, 2 2, 2 1, 1 1), (-1 -1, -2 -1, -2 -2, -1 -2, -1 -1)) | +-------------------------------------------------------------------------------------------------------------+

  • ST_Envelope
    ST_Envelope(GEOMETRY) -> GEOMETRY

以多边形的形式返回几何对象的最小边界框。

示例:select STasText(STEnvelope(STGeometryFromText('MULTIPOLYGON (((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1)), ((-1 -1, -1 -2, -2 -2, -2 -1, -1 -1)))'))); +-------------------------------------------+ | col0 | +-------------------------------------------+ | POLYGON ((-2 -2, 4 -2, 4 4, -2 4, -2 -2)) | +-------------------------------------------+

  • ST_Difference
    ST_Difference(GEOMETRY, GEOMETRY) -> GEOMETRY

输入两个几何对象,然后返回表示两个源对象之差的几何对象。

示例:select STasText(STDifference( STGeometryFromText('MULTIPOLYGON (((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1)), ((-1 -1, -1 -2, -2 -2, -2 -1, -1 -1)))'), STGeometryFromText('MULTILINESTRING ((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 1 2, 2 2, 2 1, 1 1), (-1 -1, -2 -1, -2 -2, -1 -2, -1 -1))'))); +--------------------------------------------------------------------------------------------------------------+ | col0 | +--------------------------------------------------------------------------------------------------------------+ | MULTIPOLYGON (((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 1 2, 2 2, 2 1, 1 1)), ((-1 -1, -2 -1, -2 -2, -1 -2, -1 -1))) | +--------------------------------------------------------------------------------------------------------------+ select STasText(STDifference( STGeometryFromText('MULTIPOLYGON (((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1)), ((-1 -1, -1 -2, -2 -2, -2 -1, -1 -1)))'), STGeometryFromText('MULTIPOLYGON (((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1)), ((-1 -1, -1 -2, -2 -2, -2 -1, -1 -1)))'))); +--------------------+ | col0 | +--------------------+ | MULTIPOLYGON EMPTY | +--------------------+

  • ST_Distance
    ST_Distance(GEOMETRY, GEOMETRY) -> DOUBLE

用于返回两个几何对象之间的距离。这一距离是两个几何对象的最近折点之间的距离。

示例:select STDistance( STGeometryFromText('MULTIPOLYGON (((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1)), ((-1 -1, -1 -2, -2 -2, -2 -1, -1 -1)))'), STGeometryFromText('MULTIPOLYGON (((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1)), ((-1 -1, -1 -2, -2 -2, -2 -1, -1 -1)))')); +-------+ | col0 | +-------+ | 0.0 | +-------+ select STDistance( STGeometryFromText('POINT(0 0)'), STGeometryFromText('POINT(1 1)')); +--------------------+ | col0 | +--------------------+ | 1.4142135623730951 | +--------------------+

  • ST_ExteriorRing
    ST_ExteriorRing(GEOMETRY) -> GEOMETRY

以Line形式返回面的外部环。

示例:select STasText(STExteriorRing(STGeometryFromText('POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1))'))); +--------------------------------------+ | col0 | +--------------------------------------+ | LINESTRING (0 0, 4 0, 4 4, 0 4, 0 0) | +--------------------------------------+

  • ST_Intersection
    ST_Intersection(GEOMETRY, GEOMETRY) -> GEOMETRY

以两个几何对象作为输入参数,然后以二维几何对象的形式返回交集。

示例:select STasText(STIntersection( STGeometryFromText('MULTIPOLYGON (((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1)), ((-1 -1, -1 -2, -2 -2, -2 -1, -1 -1)))'), STGeometryFromText('MULTIPOLYGON (((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1)), ((-1 -1, -1 -2, -2 -2, -2 -1, -1 -1)))'))); +--------------------------------------------------------------------------------------------------------------+ | col0 | +--------------------------------------------------------------------------------------------------------------+ | MULTIPOLYGON (((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 1 2, 2 2, 2 1, 1 1)), ((-1 -1, -2 -1, -2 -2, -1 -2, -1 -1))) | +--------------------------------------------------------------------------------------------------------------+ select STasText(STIntersection( STGeometryFromText('POINT(0 0)'), STGeometryFromText('POINT(1 1)'))); +--------------------+ | col0 | +--------------------+ | MULTIPOLYGON EMPTY | +--------------------+

  • ST_SymDifference
    ST_SymDifference(GEOMETRY, GEOMETRY) -> GEOMETRY

返回表示两个几何对象间的点集对称差异的几何值对象。

示例:select STasText(STSymDifference( STGeometryFromText('MULTIPOLYGON (((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1)), ((-1 -1, -1 -2, -2 -2, -2 -1, -1 -1)))'), STGeometryFromText('MULTIPOLYGON (((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1)), ((-1 -1, -1 -2, -2 -2, -2 -1, -1 -1)))'))); +--------------------+ | col0 | +--------------------+ | MULTIPOLYGON EMPTY | +--------------------+ select STasText(STSymDifference( STGeometryFromText('POINT(0 0)'), STGeometryFromText('POINT(1 1)'))); +---------------------------+ | col0 | +---------------------------+ | MULTIPOINT ((0 0), (1 1)) | +---------------------------+

下图的阴影部分显示了对称差异的结果。对称差异为包括两个表面的多表面图形:其中一个表面包含位于正方形之内、圆形之外的所有点,另外一个表面包含位于圆形之内、正方形之外的所有点。

image.png | left | 223x166

  • ST_Contains
    ST_Contains(GEOMETRY, GEOMETRY) -> BOOLEAN

输入两个几何对象,判断第一个对象是否完全包含第二个对象。

示例:select STContains( STGeometryFromText('MULTIPOLYGON (((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1)), ((-1 -1, -1 -2, -2 -2, -2 -1, -1 -1)))'), STGeometryFromText('MULTIPOLYGON (((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1)), ((-1 -1, -1 -2, -2 -2, -2 -1, -1 -1)))')); +-------+ | col0 | +-------+ | 1 | +-------+ select STContains( STGeometryFromText('POINT(0 0)'), STGeometryFromText('POINT(1 1)')); +-------+ | col0 | +-------+ | 0 | +-------+

  • ST_Crosses
    ST_Crosses(GEOMETRY, GEOMETRY) -> BOOLEAN

以两个几何对象作为输入,如果这两个对象的交集生成的几何对象的维度小于两个源对象中的最大维度,则返回 1。交集对象所包含的点必须在两个源几何的内部,并且不等于其中任何一个源对象。否则,返回 0。

示例:select STCrosses( STGeometryFromText('MULTIPOLYGON (((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1)), ((-1 -1, -1 -2, -2 -2, -2 -1, -1 -1)))'), STGeometryFromText('MULTIPOLYGON (((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1)), ((-1 -1, -1 -2, -2 -2, -2 -1, -1 -1)))')); +-------+ | col0 | +-------+ | 0 | +-------+ select STCrosses( STGeometryFromText('LINESTRING(0 0, 2 2)'), STGeometryFromText('LINESTRING(0 2, 2 0)')); +-------+ | col0 | +-------+ | 1 | +-------+

  • ST_Disjoint
    ST_Disjoint(GEOMETRY, GEOMETRY) -> BOOLEAN

输入两个几何对象,判断两个几何对象的交集是否为空集。

示例:select STDisjoint( STGeometryFromText('MULTIPOLYGON (((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1)), ((-1 -1, -1 -2, -2 -2, -2 -1, -1 -1)))'), STGeometryFromText('MULTIPOLYGON (((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1)), ((-1 -1, -1 -2, -2 -2, -2 -1, -1 -1)))')); +-------+ | col0 | +-------+ | 0 | +-------+ select STDisjoint( STGeometryFromText('LINESTRING(0 0, 2 2)'), STGeometryFromText('LINESTRING(0 2, 2 4)')); +-------+ | col0 | +-------+ | 1 | +-------+

  • ST_Equals
    ST_Equals(GEOMETRY, GEOMETRY) -> BOOLEAN

判断两个几何对象是否完全相同。

示例:select STEquals( STGeometryFromText('MULTIPOLYGON (((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1)), ((-1 -1, -1 -2, -2 -2, -2 -1, -1 -1)))'), STGeometryFromText('MULTIPOLYGON (((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1)), ((-1 -1, -1 -2, -2 -2, -2 -1, -1 -1)))')); +-------+ | col0 | +-------+ | 1 | +-------+ select STEquals( STGeometryFromText('LINESTRING(0 0, 2 2)'), STGeometryFromText('LINESTRING(0 2, 2 4)')); +-------+ | col0 | +-------+ | 0 | +-------+

  • ST_Intersects
    ST_Intersects(GEOMETRY, GEOMETRY) -> BOOLEAN

判断两个几何对象的交集是否不生成空集。

示例:select STIntersects( STGeometryFromText('MULTIPOLYGON (((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1)), ((-1 -1, -1 -2, -2 -2, -2 -1, -1 -1)))'), STGeometryFromText('MULTIPOLYGON (((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1)), ((-1 -1, -1 -2, -2 -2, -2 -1, -1 -1)))')); +-------+ | col0 | +-------+ | 1 | +-------+ select STIntersects( STGeometryFromText('LINESTRING(0 0, 2 2)'), STGeometryFromText('LINESTRING(0 2, 2 4)')); +-------+ | col0 | +-------+ | 0 | +-------+

  • ST_Overlaps
    ST_Overlaps(GEOMETRY, GEOMETRY) -> BOOLEAN

判断两个几何对象的交集生成的几何对象是否维度相同但不等于任一源对象。

示例:select STOverlaps( STGeometryFromText('MULTIPOLYGON (((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1)), ((-1 -1, -1 -2, -2 -2, -2 -1, -1 -1)))'), STGeometryFromText('MULTIPOLYGON (((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1)), ((-1 -1, -1 -2, -2 -2, -2 -1, -1 -1)))')); +-------+ | col0 | +-------+ | 0 | +-------+ select STOverlaps( STGeometryFromText('LINESTRING(1 1, 2 2)'), STGeometryFromText('LINESTRING(0 0, 1.5 1.5)')); +-------+ | col0 | +-------+ | 1 | +-------+

  • ST_Relate
    ST_Relate(GEOMETRY, GEOMETRY, VARCHAR) -> BOOLEAN

比较两个几何对象,判断是否满足“DE-9IM”模式(https://en.wikipedia.org/wiki/DE-9IM)矩阵字符串指定的条件。

示例:select STRelate( STGeometryFromText('MULTIPOLYGON (((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1)), ((-1 -1, -1 -2, -2 -2, -2 -1, -1 -1)))'), STGeometryFromText('MULTIPOLYGON (((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1)), ((-1 -1, -1 -2, -2 -2, -2 -1, -1 -1)))'), '102101FF2'); +-------+ | col0 | +-------+ | 0 | +-------+ select STRelate( STGeometryFromText('LINESTRING(1 1, 2 2)'), STGeometryFromText('LINESTRING(0 0, 1.5 1.5)'), '1/1///1//'); +-------+ | col0 | +-------+ | 1 | +-------+

  • ST_Touches
    ST_Touches(GEOMETRY, GEOMETRY) -> BOOLEAN

判断两个几何对象的公共点是否都不与两个几何对象的内部相交。

示例:select STTouches( STGeometryFromText('MULTIPOLYGON (((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1)), ((-1 -1, -1 -2, -2 -2, -2 -1, -1 -1)))'), STGeometryFromText('MULTIPOLYGON (((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1)), ((-1 -1, -1 -2, -2 -2, -2 -1, -1 -1)))')); +-------+ | col0 | +-------+ | 0 | +-------+ select STTouches( STGeometryFromText('LINESTRING(1 1, 2 2)'), STGeometryFromText('LINESTRING(0 0, 1 1)')); +-------+ | col0 | +-------+ | 1 | +-------+

  • ST_Within
    ST_Within(GEOMETRY, GEOMETRY) -> BOOLEAN

判断第一个几何对象是否完全位于第二个几何对象的范围内。

示例:select STWithin( STGeometryFromText('MULTIPOLYGON (((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1)), ((-1 -1, -1 -2, -2 -2, -2 -1, -1 -1)))'), STGeometryFromText('MULTIPOLYGON (((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1)), ((-1 -1, -1 -2, -2 -2, -2 -1, -1 -1)))')); +-------+ | col0 | +-------+ | 1 | +-------+ select STWithin( STGeometryFromText('LINESTRING(1 1, 2 2)'), STGeometryFromText('LINESTRING(0 0, 1 1)')); +-------+ | col0 | +-------+ | 0 | +-------+

  • ST_asBinary
    ST_asBinary(GEOMETRY) -> VARBINARY

输入一个几何对象,然后返回其可识别的二进制WKB数据。

  • ST_GeometryFromWKBHexString
    ST_GeometryFromWKBHexString(VARCHAR) -> GEOMETRY

输入WKB的HEX字符串数据,返回对应的几何对象。

示例:select STASTEXT(STGeometryFromWKBHexString('000000000140000000000000004010000000000000')); +-------------+ | _col0 | +-------------+ | POINT (2 4) | +-------------+

  • ST_pointFromWKBHexString
    ST_pointFromWKBHexString(VARCHAR) -> GEOMETRY

输入Point的WKB的HEX字符串数据,返回对应的Point几何对象。

示例:select STASTEXT(STpointFromWKBHexString('000000000140000000000000004010000000000000')); +-------------+ | _col0 | +-------------+ | POINT (2 4) | +-------------+

  • ST_lineFromWKBHexString
    ST_lineFromWKBHexString(VARCHAR) -> GEOMETRY

输入Line的WKB的HEX字符串数据,返回对应的Line几何对象。

  • ST_polyFromWKBHexString
    ST_polyFromWKBHexString(VARCHAR) -> GEOMETRY

输入Polygon的WKB的HEX字符串数据,返回对应的Polygon几何对象。

  • ST_MPointFromWKBHexString
    ST_MPointFromWKBHexString(VARCHAR) -> GEOMETRY

输入MultiPoint的WKB的HEX字符串数据,返回对应的MultiPoint几何对象。

示例:SELECT STasText(STMPointFromWKBHexString('0104000000020000000101000000000000000000000000000000000000000101000000000000000000F03F0000000000000040')); +---------------------------+ | _col0 | +---------------------------+ | MULTIPOINT ((0 0), (1 2)) | +---------------------------+

  • ST_MLineFromWKBHexString
    ST_MLineFromWKBHexString(VARCHAR) -> GEOMETRY

输入MultiLine的WKB的HEX字符串数据,返回对应的MultiLine几何对象。

  • ST_MPolyFromWKBHexString
    ST_MPolyFromWKBHexString(VARCHAR) -> GEOMETRY

输入MultiPolygon的WKB的HEX字符串数据,返回对应的MultiPolygon几何对象。

  • ST_GeometryFromWKB
    ST_GeometryFromWKB(VARBINARY) -> GEOMETRY

输入WKB数据,返回对应的几何对象。

示例:select STASTEXT(STGeometryFromWKB(fromhex('000000000140000000000000004010000000000000'))); +-------------+ | col0 | +-------------+ | POINT (2 4) | +-------------+

  • ST_pointFromWKB
    ST_pointFromWKB(VARBINARY) -> GEOMETRY

输入Point的WKB数据,返回对应的Point几何对象。

示例:select STASTEXT(STpointFromWKB(fromhex('000000000140000000000000004010000000000000'))); +-------------+ | col0 | +-------------+ | POINT (2 4) | +-------------+

  • ST_lineFromWKB
    ST_lineFromWKB(VARBINARY) -> GEOMETRY

输入Line的WKB数据,返回对应的Line几何对象。

  • ST_polyFromWKB
    ST_polyFromWKB(VARBINARY) -> GEOMETRY

输入Polygon的WKB数据,返回对应的Polygon几何对象。

  • ST_MPointFromWKB
    ST_MPointFromWKB(VARBINARY) -> GEOMETRY

输入MultiPoint的WKB数据,返回对应的MultiPoint几何对象。

示例:SELECT STasText(STMPointFromWKB(fromhex('0104000000020000000101000000000000000000000000000000000000000101000000000000000000F03F0000000000000040'))); +---------------------------+ | col0 | +---------------------------+ | MULTIPOINT ((0 0), (1 2)) | +---------------------------+

  • ST_MLineFromWKB
    ST_MLineFromWKB(VARBINARY) -> GEOMETRY

输入MultiLine的WKB数据,返回对应的MultiLine几何对象。

  • ST_MPolyFromWKB
    ST_MPolyFromWKB(VARBINARY) -> GEOMETRY

输入MultiPolygon的WKB数据,返回对应的MultiPolygon几何对象。

  • ST_GeometryFromGeoJson
    ST_GeometryFromGeoJson(VARCHAR) -> GEOMETRY

输入GeoJson的字符串数据,返回对应的几何对象。

  • ST_GeometryFromJson
    ST_GeometryFromJson(VARCHAR) -> GEOMETRY

输入ESRI Geometry Object Json的字符串数据,返回对应的几何对象。

  • ST_asGeoJson
    ST_asGeoJson(GEOMETRY) -> VARCHAR

把几何对象转成GeoJson格式输出。

示例:SELECT STasGeoJson(STGeometryFromText('MULTILINESTRING ((0 0, 1 1, 1 2), (2 3, 3 2, 5 4))')); +-----------------------------------------------------------------------------------------------+ | _col0 | +-----------------------------------------------------------------------------------------------+ | {"type":"MultiLineString","coordinates":[[[0,0],[1,1],[1,2]],[[2,3],[3,2],[5,4]]],"crs":null} | +-----------------------------------------------------------------------------------------------+

  • ST_asJson
    ST_asJson(GEOMETRY) -> VARCHAR

把几何对象转成ESRI Geometry Object Json格式输出。

示例:SELECT STasJson(STGeometryFromText('MULTILINESTRING ((0 0, 1 1, 1 2), (2 3, 3 2, 5 4))')); +-----------------------------------------------------+ | _col0 | +-----------------------------------------------------+ | {"paths":[[[0,0],[1,1],[1,2]],[[2,3],[3,2],[5,4]]]} | +-----------------------------------------------------+

  • ST_GeometryFromEsriShape
    ST_GeometryFromEsriShape(VARBINARY) -> GEOMETRY

输入ESRI Shape的二进制数据,返回对应的几何对象。

示例:SELECT californiacounties.name, COUNT(/*) cnt FROM californiacounties CROSS JOIN earthquakes WHERE STCONTAINS (STGeometryFromesrishape(californiacounties.boundaryshape), STPOINT(earthquakes.longitude, earthquakes.latitude)) GROUP BY californiacounties.name ORDER BY cnt DESC, californiacounties.name; +-----------------+------+ | name | cnt | +-----------------+------+ | San Benito | 8 | | San Bernardino | 7 | | Riverside | 6 | | Inyo | 5 | | Imperial | 3 | | San Diego | 2 | | Kern | 1 | | Kings | 1 | | Monterey | 1 | | San Luis Obispo | 1 | | Santa Clara | 1 | | Ventura | 1 | +-----------------+------+

  • UDFSYSGEOINCYCLE
    UDFSYSGEOINCYCLE(longitude, latitude, point, radius) -> BOOLEAN 第一个参数为经度列名称, 类型FLOAT/DOUBLE 第二个参数为纬度列名称, 类型FLOAT/DOUBLE 第三个参数为圆圈中心点的位置,格式=>'经度,维度', =>'120.85979,30.011984' 第四个参数为圆圈的半径,单位米

判断longitude、latitude的点是否在以中心点point为圆心,半径为radius的圆内。

示例:SELECT count(/*) as cnt FROM earthquakes WHERE UDF_SYS_GEO_IN_CYCLE(longitude,latitude, '120.85979,30.011984', 5000000000000) = true; +------+ | cnt | +------+ | 2858 | +------+

  • UDFSYSGEOINRECTANGLE
    UDFSYSGEOINRECTANGLE(longitude, latitude, pointA, pointB) -> BOOLEAN 第一个参数为经度列名称, 类型FLOAT/DOUBLE 第二个参数为纬度列名称, 类型FLOAT/DOUBLE 第三个参数为矩形的左下角坐标,格式=>'经度,维度', =>'120.85979,30.011984' 第四个参数为矩形的右上角坐标,格式=>'经度,维度', =>'120.88450,31.21011'

判断longitude、latitude的点是否在以2个斜角点构成的矩形内。

示例:SELECT count(/*) as cnt FROM earthquakes WHERE UDF_SYS_GEO_IN_RECTANGLE(longitude, latitude, '69.037,36.5759', '142.018,67.8713')=true; +------+ | cnt | +------+ | 55 | +------+

  • UDFSYSGEO_DISTANCE
    UDFSYSGEO_DISTANCE(longitude, latitude, pointA) -> INTEGER 第一个参数为经度列名称, 类型FLOAT/DOUBLE 第二个参数为纬度列名称, 类型FLOAT/DOUBLE 第三个参数为固定坐标点的经纬度,格式=>'经度,维度', =>'120.85979,30.011984'

求longitude、latitude的点和pointA点的距离,单位:米。

示例:SELECT count(/*) as cnt FROM earthquakes WHERE UDF_SYS_GEO_DISTANCE(longitude, latitude, '69.037,36.5759') > 10000; +------+ | cnt | +------+ | 2857 | +------+

原文链接本文为云栖社区原创内容,未经允许不得转载。

版权声明
本文为[阿里云云栖社区]所创,转载请带上原文链接,感谢
https://www.cnblogs.com/yunqishequ/p/10412761.html

编程之旅,人生之路,不止于编程,还有诗和远方。
阅代码原理,看框架知识,学企业实践;
赏诗词,读日记,踏人生之路,观世界之行;

支付宝红包,每日可领