地理网格处理器

编辑

将网格瓦片或单元的地理网格定义转换为描述其形状的常规边界框或多边形。如果需要与瓦片形状作为可空间索引的字段进行交互,则此功能非常有用。例如,geotile 字段值 "4/8/3" 可以作为字符串字段进行索引,但这不会对其启用任何空间操作。相反,将其转换为值 "POLYGON ((0.0 40.979898069620134, 22.5 40.979898069620134, 22.5 55.77657301866769, 0.0 55.77657301866769, 0.0 40.979898069620134))",该值可以作为 geo_shape 字段进行索引。

表 21. geo_grid 处理器选项

名称 必需 默认值 描述

field

-

要解释为地理瓦片的字段。字段格式由 tile_type 确定。

tile_type

-

理解三种瓦片格式:geohashgeotilegeohex

target_field

field

将多边形形状分配到的字段,默认情况下,field 将就地更新。

parent_field

-

如果指定且存在父瓦片,则将该瓦片地址保存到此字段。

children_field

-

如果指定且存在子瓦片,则将这些瓦片地址作为字符串数组保存到此字段。

non_children_field

-

如果指定且存在相交的非子瓦片,则将其地址作为字符串数组保存到此字段。

precision_field

-

如果指定,则将瓦片精度(缩放)作为整数保存到此字段。

ignore_missing

-

如果 truefield 不存在,则处理器会静默退出,而不修改文档。

target_format

"GeoJSON"

保存生成的多边形的格式。可以是 WKTGeoJSON

description

-

处理器的描述。用于描述处理器的目的或其配置。

if

-

有条件地执行处理器。请参阅 有条件地运行处理器

ignore_failure

false

忽略处理器的故障。请参阅 处理管道故障

on_failure

-

处理处理器的故障。请参阅 处理管道故障

tag

-

处理器的标识符。用于调试和指标。

为了演示此 Ingest 处理器的用法,请考虑一个名为 geocells 的索引,其字段 geocell 的映射类型为 geo_shape。为了使用 geotilegeohex 字段填充该索引,请定义两个 Ingest 处理器

resp = client.indices.create(
    index="geocells",
    mappings={
        "properties": {
            "geocell": {
                "type": "geo_shape"
            }
        }
    },
)
print(resp)

resp1 = client.ingest.put_pipeline(
    id="geotile2shape",
    description="translate rectangular z/x/y geotile to bounding box",
    processors=[
        {
            "geo_grid": {
                "field": "geocell",
                "tile_type": "geotile"
            }
        }
    ],
)
print(resp1)

resp2 = client.ingest.put_pipeline(
    id="geohex2shape",
    description="translate H3 cell to polygon",
    processors=[
        {
            "geo_grid": {
                "field": "geocell",
                "tile_type": "geohex",
                "target_format": "wkt"
            }
        }
    ],
)
print(resp2)
response = client.indices.create(
  index: 'geocells',
  body: {
    mappings: {
      properties: {
        geocell: {
          type: 'geo_shape'
        }
      }
    }
  }
)
puts response

response = client.ingest.put_pipeline(
  id: 'geotile2shape',
  body: {
    description: 'translate rectangular z/x/y geotile to bounding box',
    processors: [
      {
        geo_grid: {
          field: 'geocell',
          tile_type: 'geotile'
        }
      }
    ]
  }
)
puts response

response = client.ingest.put_pipeline(
  id: 'geohex2shape',
  body: {
    description: 'translate H3 cell to polygon',
    processors: [
      {
        geo_grid: {
          field: 'geocell',
          tile_type: 'geohex',
          target_format: 'wkt'
        }
      }
    ]
  }
)
puts response
const response = await client.indices.create({
  index: "geocells",
  mappings: {
    properties: {
      geocell: {
        type: "geo_shape",
      },
    },
  },
});
console.log(response);

const response1 = await client.ingest.putPipeline({
  id: "geotile2shape",
  description: "translate rectangular z/x/y geotile to bounding box",
  processors: [
    {
      geo_grid: {
        field: "geocell",
        tile_type: "geotile",
      },
    },
  ],
});
console.log(response1);

const response2 = await client.ingest.putPipeline({
  id: "geohex2shape",
  description: "translate H3 cell to polygon",
  processors: [
    {
      geo_grid: {
        field: "geocell",
        tile_type: "geohex",
        target_format: "wkt",
      },
    },
  ],
});
console.log(response2);
PUT geocells
{
  "mappings": {
    "properties": {
      "geocell": {
        "type": "geo_shape"
      }
    }
  }
}

PUT _ingest/pipeline/geotile2shape
{
  "description": "translate rectangular z/x/y geotile to bounding box",
  "processors": [
    {
      "geo_grid": {
        "field": "geocell",
        "tile_type": "geotile"
      }
    }
  ]
}

PUT _ingest/pipeline/geohex2shape
{
  "description": "translate H3 cell to polygon",
  "processors": [
    {
      "geo_grid": {
        "field": "geocell",
        "tile_type": "geohex",
        "target_format": "wkt"
      }
    }
  ]
}

这两个管道可用于将文档索引到 geocells 索引中。geocell 字段将是矩形瓦片的字符串版本(格式为 z/x/y)或 H3 单元地址,具体取决于索引文档时使用的 Ingest 处理器。生成的几何图形将以 GeoJSONWell-Known Text 格式表示和索引为 geo_shape 字段。

示例:GeoJSON 中带有信封的矩形地理瓦片

编辑

在此示例中,以 z/x/y 格式定义值的 geocell 字段将索引为 GeoJSON 信封,因为上面的 Ingest 处理器是使用默认的 target_format 定义的。

resp = client.index(
    index="geocells",
    id="1",
    pipeline="geotile2shape",
    document={
        "geocell": "4/8/5"
    },
)
print(resp)

resp1 = client.get(
    index="geocells",
    id="1",
)
print(resp1)
response = client.index(
  index: 'geocells',
  id: 1,
  pipeline: 'geotile2shape',
  body: {
    geocell: '4/8/5'
  }
)
puts response

response = client.get(
  index: 'geocells',
  id: 1
)
puts response
const response = await client.index({
  index: "geocells",
  id: 1,
  pipeline: "geotile2shape",
  document: {
    geocell: "4/8/5",
  },
});
console.log(response);

const response1 = await client.get({
  index: "geocells",
  id: 1,
});
console.log(response1);
PUT geocells/_doc/1?pipeline=geotile2shape
{
  "geocell": "4/8/5"
}

GET geocells/_doc/1

响应显示 Ingest 处理器如何将 geocell 字段替换为可索引的 geo_shape

{
 "_index": "geocells",
  "_id": "1",
  "_version": 1,
  "_seq_no": 0,
  "_primary_term": 1,
  "found": true,
  "_source": {
    "geocell": {
      "type": "Envelope",
      "coordinates": [
        [ 0.0, 55.77657301866769 ],
        [ 22.5, 40.979898069620134 ]
      ]
    }
  }
}

Kibana map with showing the geotile at 4/8/5 and its four child cells

示例:WKT 格式中带有多边形的六边形 geohex

编辑

在此示例中,具有 H3 字符串地址的 geocell 字段将索引为 WKT 多边形,因为此 Ingest 处理器显式定义了 target_format

resp = client.index(
    index="geocells",
    id="1",
    pipeline="geohex2shape",
    document={
        "geocell": "811fbffffffffff"
    },
)
print(resp)

resp1 = client.get(
    index="geocells",
    id="1",
)
print(resp1)
response = client.index(
  index: 'geocells',
  id: 1,
  pipeline: 'geohex2shape',
  body: {
    geocell: '811fbffffffffff'
  }
)
puts response

response = client.get(
  index: 'geocells',
  id: 1
)
puts response
const response = await client.index({
  index: "geocells",
  id: 1,
  pipeline: "geohex2shape",
  document: {
    geocell: "811fbffffffffff",
  },
});
console.log(response);

const response1 = await client.get({
  index: "geocells",
  id: 1,
});
console.log(response1);
PUT geocells/_doc/1?pipeline=geohex2shape
{
  "geocell": "811fbffffffffff"
}

GET geocells/_doc/1

响应显示 Ingest 处理器如何将 geocell 字段替换为可索引的 geo_shape

{
 "_index": "geocells",
  "_id": "1",
  "_version": 1,
  "_seq_no": 0,
  "_primary_term": 1,
  "found": true,
  "_source": {
    "geocell": "POLYGON ((1.1885095294564962 49.470279179513454, 2.0265689212828875 45.18424864858389, 7.509948452934623 43.786609335802495, 12.6773177459836 46.40695743262768, 12.345747342333198 50.55427505169064, 6.259687012061477 51.964770150370896, 3.6300085578113794 50.610463307239115, 1.1885095294564962 49.470279179513454))"
  }
}

Kibana map with showing an H3 cell

示例:丰富的瓦片详细信息

编辑

geo_grid 处理器选项中所述,可以设置许多其他字段,这些字段将丰富可用的信息。例如,对于 H3 瓦片,有 7 个子瓦片,但只有第一个子瓦片完全包含在父瓦片中。其余六个子瓦片仅部分与父瓦片重叠,并且存在另外六个与父瓦片重叠的非子瓦片。可以通过向 Ingest 处理器添加父级和子级附加字段来调查此情况

resp = client.ingest.put_pipeline(
    id="geohex2shape",
    description="translate H3 cell to polygon with enriched fields",
    processors=[
        {
            "geo_grid": {
                "description": "Ingest H3 cells like '811fbffffffffff' and create polygons",
                "field": "geocell",
                "tile_type": "geohex",
                "target_format": "wkt",
                "target_field": "shape",
                "parent_field": "parent",
                "children_field": "children",
                "non_children_field": "nonChildren",
                "precision_field": "precision"
            }
        }
    ],
)
print(resp)
response = client.ingest.put_pipeline(
  id: 'geohex2shape',
  body: {
    description: 'translate H3 cell to polygon with enriched fields',
    processors: [
      {
        geo_grid: {
          description: "Ingest H3 cells like '811fbffffffffff' and create polygons",
          field: 'geocell',
          tile_type: 'geohex',
          target_format: 'wkt',
          target_field: 'shape',
          parent_field: 'parent',
          children_field: 'children',
          non_children_field: 'nonChildren',
          precision_field: 'precision'
        }
      }
    ]
  }
)
puts response
const response = await client.ingest.putPipeline({
  id: "geohex2shape",
  description: "translate H3 cell to polygon with enriched fields",
  processors: [
    {
      geo_grid: {
        description:
          "Ingest H3 cells like '811fbffffffffff' and create polygons",
        field: "geocell",
        tile_type: "geohex",
        target_format: "wkt",
        target_field: "shape",
        parent_field: "parent",
        children_field: "children",
        non_children_field: "nonChildren",
        precision_field: "precision",
      },
    },
  ],
});
console.log(response);
PUT _ingest/pipeline/geohex2shape
{
  "description": "translate H3 cell to polygon with enriched fields",
  "processors": [
    {
      "geo_grid": {
        "description": "Ingest H3 cells like '811fbffffffffff' and create polygons",
        "field": "geocell",
        "tile_type": "geohex",
        "target_format": "wkt",
        "target_field": "shape",
        "parent_field": "parent",
        "children_field": "children",
        "non_children_field": "nonChildren",
        "precision_field": "precision"
      }
    }
  ]
}

索引文档以查看不同的结果

resp = client.index(
    index="geocells",
    id="1",
    pipeline="geohex2shape",
    document={
        "geocell": "811fbffffffffff"
    },
)
print(resp)

resp1 = client.get(
    index="geocells",
    id="1",
)
print(resp1)
response = client.index(
  index: 'geocells',
  id: 1,
  pipeline: 'geohex2shape',
  body: {
    geocell: '811fbffffffffff'
  }
)
puts response

response = client.get(
  index: 'geocells',
  id: 1
)
puts response
const response = await client.index({
  index: "geocells",
  id: 1,
  pipeline: "geohex2shape",
  document: {
    geocell: "811fbffffffffff",
  },
});
console.log(response);

const response1 = await client.get({
  index: "geocells",
  id: 1,
});
console.log(response1);
PUT geocells/_doc/1?pipeline=geohex2shape
{
  "geocell": "811fbffffffffff"
}

GET geocells/_doc/1

此索引请求的响应

{
  "_index": "geocells",
  "_id": "1",
  "_version": 1,
  "_seq_no": 0,
  "_primary_term": 1,
  "found": true,
  "_source": {
    "parent": "801ffffffffffff",
    "geocell": "811fbffffffffff",
    "precision": 1,
    "shape": "POLYGON ((1.1885095294564962 49.470279179513454, 2.0265689212828875 45.18424864858389, 7.509948452934623 43.786609335802495, 12.6773177459836 46.40695743262768, 12.345747342333198 50.55427505169064, 6.259687012061477 51.964770150370896, 3.6300085578113794 50.610463307239115, 1.1885095294564962 49.470279179513454))",
    "children": [
      "821f87fffffffff",
      "821f8ffffffffff",
      "821f97fffffffff",
      "821f9ffffffffff",
      "821fa7fffffffff",
      "821faffffffffff",
      "821fb7fffffffff"
    ],
    "nonChildren": [
      "821ea7fffffffff",
      "82186ffffffffff",
      "82396ffffffffff",
      "821f17fffffffff",
      "821e37fffffffff",
      "82194ffffffffff"
    ]
  }
}

然后,此附加信息将允许例如创建 H3 单元、其子单元及其相交的非子单元的可视化。

Kibana map with three H3 layers: cell