ジオグリッドプロセッサ

グリッドタイルまたはセルのジオグリッド定義を、形状を説明する通常のバウンディングボックスまたはポリゴンに変換します。これは、タイルの形状を空間的にインデックス可能なフィールドとして操作する必要がある場合に便利です。たとえば、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 はい - 理解されるタイル形式は3つあります: geohashgeotilegeohex
target_field いいえ field ポリゴン形状を割り当てるフィールド。デフォルトではfieldがインプレースで更新されます。
parent_field いいえ - 指定された場合、親タイルが存在する場合は、そのタイルアドレスをこのフィールドに保存します。
children_field いいえ - 指定された場合、子タイルが存在する場合は、それらのタイルアドレスをこのフィールドに文字列の配列として保存します。
non_children_field いいえ - 指定された場合、交差する非子タイルが存在する場合は、それらのアドレスをこのフィールドに文字列の配列として保存します。
precision_field いいえ - 指定された場合、タイルの精度(ズーム)を整数としてこのフィールドに保存します。
ignore_missing いいえ - trueおよびfieldが存在しない場合、プロセッサは静かに終了し、ドキュメントを変更しません。
target_format いいえ “GeoJSON” 生成されたポリゴンを保存する形式。WKTまたはGeoJSONのいずれか。
description いいえ - プロセッサの説明。プロセッサの目的や構成を説明するのに便利です。
if いいえ - 条件付きでプロセッサを実行します。条件付きでプロセッサを実行するを参照してください。
ignore_failure いいえ false プロセッサの失敗を無視します。パイプラインの失敗を処理するを参照してください。
on_failure いいえ - プロセッサの失敗を処理します。パイプラインの失敗を処理するを参照してください。
tag いいえ - プロセッサの識別子。デバッグやメトリクスに便利です。

このインジェストプロセッサの使用法を示すために、geocellsというインデックスを考え、そのフィールドgeocellのマッピングがgeo_shape型であるとします。geotileおよびgeohexフィールドを使用してそのインデックスをポピュレートするために、2つのインジェストプロセッサを定義します:

Python

  1. resp = client.indices.create(
  2. index="geocells",
  3. mappings={
  4. "properties": {
  5. "geocell": {
  6. "type": "geo_shape"
  7. }
  8. }
  9. },
  10. )
  11. print(resp)
  12. resp1 = client.ingest.put_pipeline(
  13. id="geotile2shape",
  14. description="translate rectangular z/x/y geotile to bounding box",
  15. processors=[
  16. {
  17. "geo_grid": {
  18. "field": "geocell",
  19. "tile_type": "geotile"
  20. }
  21. }
  22. ],
  23. )
  24. print(resp1)
  25. resp2 = client.ingest.put_pipeline(
  26. id="geohex2shape",
  27. description="translate H3 cell to polygon",
  28. processors=[
  29. {
  30. "geo_grid": {
  31. "field": "geocell",
  32. "tile_type": "geohex",
  33. "target_format": "wkt"
  34. }
  35. }
  36. ],
  37. )
  38. print(resp2)

Ruby

  1. response = client.indices.create(
  2. index: 'geocells',
  3. body: {
  4. mappings: {
  5. properties: {
  6. geocell: {
  7. type: 'geo_shape'
  8. }
  9. }
  10. }
  11. }
  12. )
  13. puts response
  14. response = client.ingest.put_pipeline(
  15. id: 'geotile2shape',
  16. body: {
  17. description: 'translate rectangular z/x/y geotile to bounding box',
  18. processors: [
  19. {
  20. geo_grid: {
  21. field: 'geocell',
  22. tile_type: 'geotile'
  23. }
  24. }
  25. ]
  26. }
  27. )
  28. puts response
  29. response = client.ingest.put_pipeline(
  30. id: 'geohex2shape',
  31. body: {
  32. description: 'translate H3 cell to polygon',
  33. processors: [
  34. {
  35. geo_grid: {
  36. field: 'geocell',
  37. tile_type: 'geohex',
  38. target_format: 'wkt'
  39. }
  40. }
  41. ]
  42. }
  43. )
  44. puts response

Js

  1. const response = await client.indices.create({
  2. index: "geocells",
  3. mappings: {
  4. properties: {
  5. geocell: {
  6. type: "geo_shape",
  7. },
  8. },
  9. },
  10. });
  11. console.log(response);
  12. const response1 = await client.ingest.putPipeline({
  13. id: "geotile2shape",
  14. description: "translate rectangular z/x/y geotile to bounding box",
  15. processors: [
  16. {
  17. geo_grid: {
  18. field: "geocell",
  19. tile_type: "geotile",
  20. },
  21. },
  22. ],
  23. });
  24. console.log(response1);
  25. const response2 = await client.ingest.putPipeline({
  26. id: "geohex2shape",
  27. description: "translate H3 cell to polygon",
  28. processors: [
  29. {
  30. geo_grid: {
  31. field: "geocell",
  32. tile_type: "geohex",
  33. target_format: "wkt",
  34. },
  35. },
  36. ],
  37. });
  38. console.log(response2);

コンソール

  1. PUT geocells
  2. {
  3. "mappings": {
  4. "properties": {
  5. "geocell": {
  6. "type": "geo_shape"
  7. }
  8. }
  9. }
  10. }
  11. PUT _ingest/pipeline/geotile2shape
  12. {
  13. "description": "translate rectangular z/x/y geotile to bounding box",
  14. "processors": [
  15. {
  16. "geo_grid": {
  17. "field": "geocell",
  18. "tile_type": "geotile"
  19. }
  20. }
  21. ]
  22. }
  23. PUT _ingest/pipeline/geohex2shape
  24. {
  25. "description": "translate H3 cell to polygon",
  26. "processors": [
  27. {
  28. "geo_grid": {
  29. "field": "geocell",
  30. "tile_type": "geohex",
  31. "target_format": "wkt"
  32. }
  33. }
  34. ]
  35. }

これらの2つのパイプラインは、geocellsインデックスにドキュメントをインデックス化するために使用できます。geocellフィールドは、z/x/y形式の長方形タイルまたはH3セルアドレスのいずれかの文字列バージョンになります。結果のジオメトリは、geo_shapeフィールドとして、GeoJSONまたはWell-Known Text形式で表現され、インデックス化されます。

例: GeoJSONのエンベロープを持つ長方形ジオタイル

この例では、geocellフィールドがz/x/y形式で定義されている値を持ち、GeoJSONエンベロープとしてインデックス化されます。これは、上記のインジェストプロセッサがデフォルトのtarget_formatで定義されているためです。

Python

  1. resp = client.index(
  2. index="geocells",
  3. id="1",
  4. pipeline="geotile2shape",
  5. document={
  6. "geocell": "4/8/5"
  7. },
  8. )
  9. print(resp)
  10. resp1 = client.get(
  11. index="geocells",
  12. id="1",
  13. )
  14. print(resp1)

Ruby

  1. response = client.index(
  2. index: 'geocells',
  3. id: 1,
  4. pipeline: 'geotile2shape',
  5. body: {
  6. geocell: '4/8/5'
  7. }
  8. )
  9. puts response
  10. response = client.get(
  11. index: 'geocells',
  12. id: 1
  13. )
  14. puts response

Js

  1. const response = await client.index({
  2. index: "geocells",
  3. id: 1,
  4. pipeline: "geotile2shape",
  5. document: {
  6. geocell: "4/8/5",
  7. },
  8. });
  9. console.log(response);
  10. const response1 = await client.get({
  11. index: "geocells",
  12. id: 1,
  13. });
  14. console.log(response1);

コンソール

  1. PUT geocells/_doc/1?pipeline=geotile2shape
  2. {
  3. "geocell": "4/8/5"
  4. }
  5. GET geocells/_doc/1

レスポンスは、インジェストプロセッサがgeocellフィールドをインデックス可能なgeo_shapeに置き換えた方法を示しています:

コンソール-結果

  1. {
  2. "_index": "geocells",
  3. "_id": "1",
  4. "_version": 1,
  5. "_seq_no": 0,
  6. "_primary_term": 1,
  7. "found": true,
  8. "_source": {
  9. "geocell": {
  10. "type": "Envelope",
  11. "coordinates": [
  12. [ 0.0, 55.77657301866769 ],
  13. [ 22.5, 40.979898069620134 ]
  14. ]
  15. }
  16. }
  17. }

Kibanaマップに表示されるジオタイル4/8/5とその4つの子セル

例: WKT形式のポリゴンを持つ六角形ジオヘックス

この例では、geocellフィールドがH3文字列アドレスを持ち、WKTポリゴンとしてインデックス化されます。これは、このインジェストプロセッサがtarget_formatを明示的に定義しているためです。

Python

  1. resp = client.index(
  2. index="geocells",
  3. id="1",
  4. pipeline="geohex2shape",
  5. document={
  6. "geocell": "811fbffffffffff"
  7. },
  8. )
  9. print(resp)
  10. resp1 = client.get(
  11. index="geocells",
  12. id="1",
  13. )
  14. print(resp1)

Ruby

  1. response = client.index(
  2. index: 'geocells',
  3. id: 1,
  4. pipeline: 'geohex2shape',
  5. body: {
  6. geocell: '811fbffffffffff'
  7. }
  8. )
  9. puts response
  10. response = client.get(
  11. index: 'geocells',
  12. id: 1
  13. )
  14. puts response

Js

  1. const response = await client.index({
  2. index: "geocells",
  3. id: 1,
  4. pipeline: "geohex2shape",
  5. document: {
  6. geocell: "811fbffffffffff",
  7. },
  8. });
  9. console.log(response);
  10. const response1 = await client.get({
  11. index: "geocells",
  12. id: 1,
  13. });
  14. console.log(response1);

コンソール

  1. PUT geocells/_doc/1?pipeline=geohex2shape
  2. {
  3. "geocell": "811fbffffffffff"
  4. }
  5. GET geocells/_doc/1

レスポンスは、インジェストプロセッサがgeocellフィールドをインデックス可能なgeo_shapeに置き換えた方法を示しています:

コンソール-結果

  1. {
  2. "_index": "geocells",
  3. "_id": "1",
  4. "_version": 1,
  5. "_seq_no": 0,
  6. "_primary_term": 1,
  7. "found": true,
  8. "_source": {
  9. "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))"
  10. }
  11. }

Kibanaマップに表示されるH3セル

例: 豊富なタイルの詳細

geo_gridプロセッサオプションで説明されているように、設定できる他の多くのフィールドがあり、利用可能な情報を豊かにします。たとえば、H3タイルには7つの子タイルがありますが、最初のタイルだけが親タイルに完全に含まれています。残りの6つは親と部分的に重なっており、親と重なるさらに6つの非子タイルが存在します。これは、インジェストプロセッサに親と子の追加フィールドを追加することで調査できます:

Python

  1. resp = client.ingest.put_pipeline(
  2. id="geohex2shape",
  3. description="translate H3 cell to polygon with enriched fields",
  4. processors=[
  5. {
  6. "geo_grid": {
  7. "description": "Ingest H3 cells like '811fbffffffffff' and create polygons",
  8. "field": "geocell",
  9. "tile_type": "geohex",
  10. "target_format": "wkt",
  11. "target_field": "shape",
  12. "parent_field": "parent",
  13. "children_field": "children",
  14. "non_children_field": "nonChildren",
  15. "precision_field": "precision"
  16. }
  17. }
  18. ],
  19. )
  20. print(resp)

Ruby

  1. response = client.ingest.put_pipeline(
  2. id: 'geohex2shape',
  3. body: {
  4. description: 'translate H3 cell to polygon with enriched fields',
  5. processors: [
  6. {
  7. geo_grid: {
  8. description: "Ingest H3 cells like '811fbffffffffff' and create polygons",
  9. field: 'geocell',
  10. tile_type: 'geohex',
  11. target_format: 'wkt',
  12. target_field: 'shape',
  13. parent_field: 'parent',
  14. children_field: 'children',
  15. non_children_field: 'nonChildren',
  16. precision_field: 'precision'
  17. }
  18. }
  19. ]
  20. }
  21. )
  22. puts response

Js

  1. const response = await client.ingest.putPipeline({
  2. id: "geohex2shape",
  3. description: "translate H3 cell to polygon with enriched fields",
  4. processors: [
  5. {
  6. geo_grid: {
  7. description:
  8. "Ingest H3 cells like '811fbffffffffff' and create polygons",
  9. field: "geocell",
  10. tile_type: "geohex",
  11. target_format: "wkt",
  12. target_field: "shape",
  13. parent_field: "parent",
  14. children_field: "children",
  15. non_children_field: "nonChildren",
  16. precision_field: "precision",
  17. },
  18. },
  19. ],
  20. });
  21. console.log(response);

コンソール

  1. PUT _ingest/pipeline/geohex2shape
  2. {
  3. "description": "translate H3 cell to polygon with enriched fields",
  4. "processors": [
  5. {
  6. "geo_grid": {
  7. "description": "Ingest H3 cells like '811fbffffffffff' and create polygons",
  8. "field": "geocell",
  9. "tile_type": "geohex",
  10. "target_format": "wkt",
  11. "target_field": "shape",
  12. "parent_field": "parent",
  13. "children_field": "children",
  14. "non_children_field": "nonChildren",
  15. "precision_field": "precision"
  16. }
  17. }
  18. ]
  19. }

ドキュメントをインデックス化して異なる結果を確認します:

Python

  1. resp = client.index(
  2. index="geocells",
  3. id="1",
  4. pipeline="geohex2shape",
  5. document={
  6. "geocell": "811fbffffffffff"
  7. },
  8. )
  9. print(resp)
  10. resp1 = client.get(
  11. index="geocells",
  12. id="1",
  13. )
  14. print(resp1)

Ruby

  1. response = client.index(
  2. index: 'geocells',
  3. id: 1,
  4. pipeline: 'geohex2shape',
  5. body: {
  6. geocell: '811fbffffffffff'
  7. }
  8. )
  9. puts response
  10. response = client.get(
  11. index: 'geocells',
  12. id: 1
  13. )
  14. puts response

Js

  1. const response = await client.index({
  2. index: "geocells",
  3. id: 1,
  4. pipeline: "geohex2shape",
  5. document: {
  6. geocell: "811fbffffffffff",
  7. },
  8. });
  9. console.log(response);
  10. const response1 = await client.get({
  11. index: "geocells",
  12. id: 1,
  13. });
  14. console.log(response1);

コンソール

  1. PUT geocells/_doc/1?pipeline=geohex2shape
  2. {
  3. "geocell": "811fbffffffffff"
  4. }
  5. GET geocells/_doc/1

このインデックスリクエストからのレスポンス:

コンソール-結果

  1. {
  2. "_index": "geocells",
  3. "_id": "1",
  4. "_version": 1,
  5. "_seq_no": 0,
  6. "_primary_term": 1,
  7. "found": true,
  8. "_source": {
  9. "parent": "801ffffffffffff",
  10. "geocell": "811fbffffffffff",
  11. "precision": 1,
  12. "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))",
  13. "children": [
  14. "821f87fffffffff",
  15. "821f8ffffffffff",
  16. "821f97fffffffff",
  17. "821f9ffffffffff",
  18. "821fa7fffffffff",
  19. "821faffffffffff",
  20. "821fb7fffffffff"
  21. ],
  22. "nonChildren": [
  23. "821ea7fffffffff",
  24. "82186ffffffffff",
  25. "82396ffffffffff",
  26. "821f17fffffffff",
  27. "821e37fffffffff",
  28. "82194ffffffffff"
  29. ]
  30. }
  31. }

この追加情報により、たとえば、H3セル、その子、および交差する非子セルの視覚化を作成できるようになります。

3つのH3レイヤー: セルのKibanaマップ