
# Geospatial函数
以ST_前缀开头的HetuEngine Geospatial功能支持SQL、MM规范，并符合Open Geospatial Consortium（OGC）的OpenGIS规范。因此，许多HetuEngine Geospatial功能要求或更准确地说是假设要操作的几何图形既简单又有效。例如，计算在多边形外部定义了孔的多边形的面积，或者从非简单边界线构造多边形是没有意义的。
HetuEngine地理空间功能支持空间对象的已知文本（WKT）和已知二进制（WKB）形式：
- 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))
WKT(Well-known text)是开放地理空间联盟OGC（Open GIS Consortium ）制定的一种文本标记语言，用于表示矢量几何对象、空间参照系统及空间参照系统之间的转换。
WKB(well-known binary) 是WKT的二进制表示形式，解决了WKT表达方式冗余的问题，便于传输和在数据库中存储相同的信息。
GeoJSON一种JSON格式的Feature信息输出格式，它便于被JavaScript等脚本语言处理，OpenLayers等地理库便是采用GeoJSON格式。此外，TopoJSON等更精简的扩展格式。
使用ST_GeometryFromText（）和ST_GeomFromBinary（）函数从WKT或WKB创建几何对象。
SphericalGeography类型为地理坐标（有时称为大地坐标或lat / lon或lon / lat）上表示的空间要素提供本地支持。地理坐标是以角度单位（度）表示的球坐标。几何类型的基础是平面。平面上两点之间的最短路径是一条直线。这意味着可以使用笛卡尔数学和直线矢量来计算几何形状（面积，距离，长度，交点等）。
SphericalGeography类型的基础是一个球体。球面上两点之间的最短路径是大圆弧。这意味着必须使用更复杂的数学方法在球体上计算地形（区域，距离，长度，交点等）。不支持考虑到实际球体形状的更精确的测量。
测量函数ST_Distance（）和ST_Length（）返回的值以米为单位；ST_Area（）返回的值以平方米为单位。
使用to_spherical_geography（）函数将几何对象转换为地理对象。
例如ST_Distance（ST_Point（-71.0882，42.3607），ST_Point（-74.1197，40.6976））以欧几里得平面上传入值的单位返回3.4577，而ST_Distance（to_spherical_geography（ST_Point（-71.0882，42.3607）） ，to_spherical_geography（ST_Point（-74.1197，40.6976）））以米为单位返回312822.179。
#### 构造器
- ST_AsBinary(*Geometry* )→ varbinary
  描述：返回几何图形的二进制表示。
  ```
  select ST_AsBinary(ST_GeometryFromText('POINT(12 13)'));
                        _col0                      
  ---------------------------------------------------------------
  01 01 00 00 00 00 00 00 00 00 00 28 40 00 00 00 00 00 00 2a 40                          
  (1 row)
  ```
  

- ST_AsText(*Geometry* ) → varchar
  描述：返回几何图形的WKT表示。对于空的几何图形ST_AsText(ST_LineFromText('LINESTRING EMPTY')) 将生成 'MULTI LINE STRING EMPTY' ， ST_AsText(ST_Polygon('POLYGON EMPTY')) 生成 'MULTIPOLYGON EMPTY'。
  ```
  SELECT st_astext(ST_GeometryFromText('LINESTRING (0 0, 1 1, 1 2)'));-- LINESTRING (0 0, 1 1, 1 2)
  ```
  
- ST_GeometryFromText(*varchar* )→ Geometry
  描述：返回一个WKT表示的几何对象。
  ```
  select ST_GeometryFromText('POLYGON ((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1))');
  --POLYGON ((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 1 2, 2 2, 2 1, 1 1))
  ```
  
- ST_GeomFromBinary(*varbinary* )→ Geometry
  描述：返回一个WKB表示的几何类型。
  ```
  select ST_geomFromBinary(ST_AsBinary(ST_GeometryFromText('POINT(12 13)')));-- POINT (12 13)
  ```
  
- ST_LineFromText(*varchar* )→ LineString
  描述：返回WKT表示的线条字符串对象。
  ```
  select st_lineFromText('LINESTRING (0 0, 1 1, 1 2)');--  LINESTRING (0 0, 1 1, 1 2)
  ```
  
- ST_Point(*double* , *double* )
  描述：返回具有给定坐标值的几何类型点对象。
  ```
  select st_point(12.1,34.1); 
  POINT (12.1 34.1)
  ```
  
- ST_Polygon(*varchar* )
  描述：返回WKT字符串表示的多边形。
  ```
  select ST_Polygon('POLYGON ((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1))');
  POLYGON ((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 1 2, 2 2, 2 1, 1 1))
  ```
  
Operations
- ST_Boundary(*Geometry* ) → Geometry
  描述：返回一个封闭图形的边界。
  ```
  select ST_boundary(ST_Polygon('POLYGON ((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1))'));
  MULTILINESTRING ((0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 1 2, 2 2, 2 1, 1 1))
  ```
  
- ST_Buffer(*Geometry* , *distance* ) → Geometry
  描述：返回表示与指定几何图形之间的距离小于或等于指定距离的所有点的几何图形。
  ```
  select ST_Buffer(ST_POINT(0,0),4);
  POLYGON (4 0, 3.9914356929544113 0.2616125169205717, 3.965779445495239 0.5221047688802056, 3.923141121612919 0.7803612880645122, 3.8637033051562706 1.035276180410082, 3.7877205179804205 1.2857578612126452, 3.695518130045145 1.5307337294603...)
  ```
  
- ST_Difference(*Geometry* , *Geometry* ) → Geometry
  描述：返回表示给定几何图形的点集差异的几何图形值。
  ```
  select ST_Difference(ST_POINT(0,0),ST_POINT(2,3));-- POINT (0 0)
  ```
  
- ST_EnvelopeAsPts(*Geometry) -\> array(Geometry* )
  描述：返回包含两个点的数组：几何图形的边界矩形多边形的左下角和右上角。 如果输入几何为空，则返回NULL。
  ```
  select ST_EnvelopeAsPts(ST_LineFromText('LINESTRING (0 0, 1 1, 1 2)'));--  [POINT (0 0), POINT (1 2)]
  ```
  
- ST_Intersection(*Geometry* , *Geometry* ) → Geometry
  描述：返回表示两个几何的点集交集的几何值。
  ```
  select ST_Intersection(ST_LineFromText('LINESTRING (0 0, 1 1, 1 2)'), ST_LineFromText('LINESTRING (0 0, 1 1, 1 3)'));
  -- LINESTRING (0 0, 1 1, 1 2)
  ```
  
- ST_SymDifference(*Geometry* , *Geometry* ) → Geometry
  描述：返回表示两个几何的点集对称差异的几何值。
  ```
  select ST_SymDifference(ST_LineFromText('LINESTRING (0 0, 1 1, 1 2)'), ST_LineFromText('LINESTRING (0 0, 1 1, 1 3)'));--  LINESTRING (1 2, 1 3)
  ```
  
- ST_Union(*Geometry* , *Geometry* ) → Geometry
  描述：返回一个表示输入几何图形的点集并集的几何图形。
  ```
  select ST_Union(ST_LineFromText('LINESTRING (0 0, 1 1, 1 2)'), ST_LineFromText('LINESTRING (0 0, 1 1, 1 3)')); --  LINESTRING (0 0, 1 1, 1 2, 1 3)
  ```
  
 
