Geoshape字段类型

地理形状字段类型包含地理形状,例如多边形或地理点的集合。要索引地理形状,UDB-SX将该形状划分为三角形网格,并将每个三角形存储在BKD树中。这提供了10-7十进制度数的精度,表示几乎完美的空间分辨率。此过程的表现主要受您正在索引的多边形顶点数的影响。

示例

创建一个带有地理形状字段类型的映射:

PUT testindex
{
  "mappings": {
    "properties": {
      "location": {
        "type": "geo_shape"
      }
    }
  }
}

格式

Geoshapes可以以下格式索引:

在GeoJSON和WKT中,坐标必须在坐标数组中以longitude, latitude的顺序指定。请注意,在这种格式中,经度在前。

地理形状类型

以下表格描述了可能的地理形状类型及其与GeoJSON和WKT类型的关系。

UDB-SX类型 GeoJSON 类型 WKT 类型 描述
point Point POINT 地理坐标点,由纬度和经度指定。UDB-SX使用世界大地测量系统(WGS84)坐标。
linestring LineString LINESTRING 由两个或多个点指定的一条线。可能是一条直线或由连接的线段组成的路径。
polygon Polygon POLYGON 多边形由坐标形式的顶点列表指定。多边形必须是封闭的,这意味着最后一个点必须与第一个点相同。因此,要创建一个n边形,需要n+1个顶点。顶点的最小数量是四个,这会形成一个三角形。
multipoint MultiPoint MULTIPOINT 一组离散的相关点,这些点之间没有连接。
multilinestring MultiLineString MULTILINESTRING 一组线字符串。
multipolygon MultiPolygon MULTIPOLYGON 一个多边形的数组。
geometrycollection GeometryCollection GEOMETRYCOLLECTION 一组可能为不同类型的地理形状。
envelope N/A BBOX 由上左和下右顶点指定的边界矩形。

Point

一个点是由纬度和经度指定的单一坐标对。

索引GeoJSON格式的点:

PUT testindex/_doc/1
{
  "location" : {
    "type" : "point",
    "coordinates" : [74.0060, 40.7128]
  }
}

WKT格式中索引一个点:

PUT testindex/_doc/1
{
  "location" : "POINT (74.0060 40.7128)"
}

Linestring

线段是由两个或多个点指定的线。如果点共线,则线段为直线。否则,线段表示由线段组成的路径。

GeoJSON格式中索引一个线字符串:

PUT testindex/_doc/2
{
  "location" : {
    "type" : "linestring",
    "coordinates" : [[74.0060, 40.7128], [71.0589, 42.3601]]
  }
}

在WKT格式中索引线字符串:

PUT testindex/_doc/2
{
  "location" : "LINESTRING (74.0060 40.7128, 71.0589 42.3601)"
}

Polygon

多边形由坐标形式的顶点列表指定。多边形必须是封闭的,这意味着最后一个点必须与第一个点相同。在以下示例中,使用四个点创建了一个三角形。

GeoJSON要求您按逆时针方向列出多边形的顶点。WKT不对顶点顺序做具体要求。

在GeoJSON格式中索引多边形(三角形):

PUT testindex/_doc/3
{
  "location" : {
    "type" : "polygon",
    "coordinates" : [
      [
        [74.0060, 40.7128], 
        [73.7562, 42.6526], 
        [71.0589, 42.3601], 
        [74.0060, 40.7128]
      ]
    ]
  }
}

在WKT格式中索引多边形(三角形):

PUT testindex/_doc/3
{
  "location" : "POLYGON ((74.0060 40.7128, 71.0589 42.3601, 73.7562 42.6526, 74.0060 40.7128))"
}

多边形内部可能有空洞。在这种情况下,coordinates字段将包含多个数组。第一个数组表示外部多边形,每个后续数组表示一个空洞。空洞用多边形表示,并以坐标数组的形式指定。

GeoJSON要求您按逆时针方向列出多边形的顶点,并按顺时针方向列出孔洞的顶点。WKT不对顶点顺序施加特定要求。

在GeoJSON格式中索引带三角形孔的(三角形)多边形:

PUT testindex/_doc/4
{
  "location" : {
    "type" : "polygon",
    "coordinates" : [
      [
        [74.0060, 40.7128], 
        [73.7562, 42.6526], 
        [71.0589, 42.3601], 
        [74.0060, 40.7128]
      ],
      [
        [72.6734,41.7658], 
        [73.0515, 41.5582], 
        [72.6506, 41.5623],
        [72.6734, 41.7658]
      ]
    ]
  }
}

使用WKT格式索引具有三角形空洞的多边形(三角形):

PUT testindex/_doc/4
{
  "location" : "POLYGON ((74.0060 40.7128, 71.0589 42.3601, 73.7562 42.6526, 74.0060 40.7128), (72.6734 41.7658, 72.6506 41.5623, 73.0515 41.5582, 72.6734 41.7658))"
}

您可以通过列出其顶点按顺时针或逆时针顺序来在UDB-SX中指定多边形。这对于不跨越日期线(小于180°)的多边形效果良好。然而,跨越日期线(大于180°)的多边形可能存在歧义,因为WKT没有对顶点顺序施加特定要求。因此,您必须通过按逆时针顺序列出顶点来指定跨越日期线的多边形。

您可以在映射时定义一个 orientation 参数来指定顶点遍历顺序:

PUT testindex
{
  "mappings": {
    "properties": {
      "location": {
        "type": "geo_shape",
        "orientation" : "left"
      }
    }
  }
}

随后索引的文档可以覆盖 orientation 设置:

PUT testindex/_doc/3
{
  "location" : {
    "type" : "polygon",
    "orientation" : "cw",
    "coordinates" : [
      [[74.0060, 40.7128], 
      [71.0589, 42.3601], 
      [73.7562, 42.6526], 
      [74.0060, 40.7128]]
    ]
  }
}

Multipoint

多点是一系列离散的、相互关联但不相连的点。

以GeoJSON格式索引多点:

PUT testindex/_doc/6
{
  "location" : {
    "type" : "multipoint",
    "coordinates" : [
      [74.0060, 40.7128], 
      [71.0589, 42.3601]
    ]
  }
}

在WKT格式中索引多点:

PUT testindex/_doc/6
{
  "location" : "MULTIPOINT (74.0060 40.7128, 71.0589 42.3601)"
}

Multilinestring

多线字符串是线字符串的数组。

GeoJSON格式中索引一个线字符串:

PUT testindex/_doc/2
{
  "location" : {
    "type" : "multilinestring",
    "coordinates" : [
      [[74.0060, 40.7128], [71.0589, 42.3601]],
      [[73.7562, 42.6526], [72.6734, 41.7658]]
      ]
  }
}

在WKT格式中索引线字符串:

PUT testindex/_doc/2
{
  "location" : "MULTILINESTRING ((74.0060 40.7128, 71.0589 42.3601), (73.7562 42.6526, 72.6734 41.7658))"
}

Multipolygon

多边形是多边形的集合。在这个例子中,第一个多边形包含一个洞,而第二个没有。

GeoJSON格式中索引多边形

PUT testindex/_doc/4
{
  "location" : {
    "type" : "multipolygon",
    "coordinates" : [
    [
      [
        [74.0060, 40.7128], 
        [73.7562, 42.6526], 
        [71.0589, 42.3601], 
        [74.0060, 40.7128]
      ],
      [
        [73.0515, 41.5582], 
        [72.6506, 41.5623], 
        [72.6734, 41.7658], 
        [73.0515, 41.5582]
      ]
    ],
    [
      [
        [73.9146, 40.8252], 
        [73.8871, 41.0389], 
        [73.6853, 40.9747], 
        [73.9146, 40.8252]
      ]
    ]
  ]
  }
}

WKT格式的多边形索引

PUT testindex/_doc/4
{
  "location" : "MULTIPOLYGON (((74.0060 40.7128, 71.0589 42.3601, 73.7562 42.6526, 74.0060 40.7128), (72.6734 41.7658, 72.6506 41.5623, 73.0515 41.5582, 72.6734 41.7658)), ((73.9146 40.8252, 73.6853 40.9747, 73.8871 41.0389, 73.9146 40.8252)))"
}

Geometry collection

几何集合是不同类型的地理形状的集合。

以GeoJSON格式索引几何集合

PUT testindex/_doc/7
{
  "location" : {
    "type": "geometrycollection",
    "geometries": [
      {
        "type": "point",
        "coordinates": [74.0060, 40.7128]
      },
      {
        "type": "linestring",
        "coordinates": [[73.7562, 42.6526], [72.6734, 41.7658]]
      }
    ]
  }
}

将WKT格式的几何集合进行索引:

PUT testindex/_doc/7
{
  "location" : "GEOMETRYCOLLECTION (POINT (74.0060 40.7128), LINESTRING(73.7562 42.6526, 72.6734 41.7658))"
}

Envelope

边界是由上左和下右顶点指定的边界矩形。GeoJSON格式是[[minLon, maxLat], [maxLon, minLat]]。

在GeoJSON格式中索引边界

PUT testindex/_doc/2
{
  "location" : {
    "type" : "envelope",
    "coordinates" : [[71.0589, 42.3601], [74.0060, 40.7128]]
  }
}

在WKT格式中,使用BBOX (minLon, maxLon, maxLat, minLat)。

在WKT BBOX格式中索引边界:

PUT testindex/_doc/8
{
  "location" : "BBOX (71.0589, 74.0060, 42.3601, 40.7128)"
}

参数

以下表格列出了 geoshape 字段类型接受的参数。所有参数都是可选的。

参数 描述
coerce 布尔值,指定是否自动关闭未闭合的线性环。默认为false。
ignore_malformed 布尔值,指定忽略格式不正确的GeoJSON或WKT地理形状,并且不抛出异常。默认值是false(当地理形状格式不正确时抛出异常)。
ignore_z_value 针对具有三个坐标的点。如果ignore_z_value是true,则第三个坐标未索引但仍然存储在_source字段中。如果ignore_z_value是false,则抛出异常。默认是true。
orientation 指定了地理形状坐标列表中顶点的遍历顺序。orientation取以下值:
1.RIGHT:逆时针。通过使用以下字符串之一(大写或小写)指定右侧方向:right, counterclockwise, ccw:
2. LEFT: 顺时针。通过以下字符串(大写或小写)指定左侧方向:left, clockwise, cw
默认是RIGHT