Geoshape field type

geo_shape データ型は、長方形、線、ポリゴンなどの任意のジオシェイプのインデックス作成と検索を容易にします。インデックスされるデータにポイント以外の形状が含まれている場合、このマッピングを使用する必要があります。データがポイントのみを含む場合、geo_point または geo_shape としてインデックスできます。

このタイプを使用するドキュメントは次のように使用できます:

Mapping Options

geo_shape マッピングは、GeoJSON または WKT ジオメトリオブジェクトを geo_shape タイプにマッピングします。これを有効にするには、ユーザーはフィールドを geo_shape タイプに明示的にマッピングする必要があります。

GeoJSON および WKT、したがって Elasticsearch では、正しい 座標の順序は経度、緯度 (X, Y) です。これは、一般的に口語的な緯度、経度 (Y, X) を使用する多くの地理空間 API(例:Google マップ)とは異なります。

オプション 説明 デフォルト
orientation オプション。フィールドのデフォルト 方向 は、WKT ポリゴンのためのものです。

このパラメータは RIGHT(反時計回り)または LEFT(時計回り)の値のみを設定および返します。ただし、複数の方法で任意の値を指定できます。
RIGHT を設定するには、次の引数のいずれかまたはその大文字のバリアントを使用します:

  • right
  • counterclockwise
  • ccw
    LEFT を設定するには、次の引数のいずれかまたはその大文字のバリアントを使用します:
  • left
  • clockwise
  • cw | RIGHT |
    | ignore_malformed | true の場合、無効な GeoJSON または WKT 形状は無視されます。false(デフォルト)の場合、無効な GeoJSON および WKT 形状は例外をスローし、ドキュメント全体を拒否します。 | false |
    | ignore_z_value | true(デフォルト)の場合、三次元ポイントが受け入れられます(ソースに保存されます)が、緯度と経度の値のみがインデックスされ、第三の次元は無視されます。false の場合、緯度と経度(2次元)以外の値を含むジオポイントは例外をスローし、ドキュメント全体を拒否します。 | true |
    | coerce | true の場合、ポリゴン内の閉じていない線形リングは自動的に閉じられます。 | false |
    | index | フィールドは迅速に検索可能であるべきですか?true(デフォルト)および false を受け入れます。
    doc_values のみが有効なフィールドは、クエリ可能ですが、遅くなります。 | true |
    | doc_values | フィールドはディスクに列ストライド方式で保存されるべきですか?
    その後、集約やスクリプトに使用できますか? | true |

Indexing approach

ジオシェイプタイプは、形状を三角メッシュに分解し、各三角形を BKD ツリー内の 7 次元ポイントとしてインデックスすることによってインデックスされます。これにより、すべての空間関係が元の形状のエンコードされたベクトル表現を使用して計算されるため、ほぼ完璧な空間解像度(1e-7 小数度精度まで)が提供されます。テッセレータのパフォーマンスは、主にポリゴン/マルチポリゴンを定義する頂点の数に依存します。

Example

Python

  1. resp = client.indices.create(
  2. index="example",
  3. mappings={
  4. "properties": {
  5. "location": {
  6. "type": "geo_shape"
  7. }
  8. }
  9. },
  10. )
  11. print(resp)

Ruby

  1. response = client.indices.create(
  2. index: 'example',
  3. body: {
  4. mappings: {
  5. properties: {
  6. location: {
  7. type: 'geo_shape'
  8. }
  9. }
  10. }
  11. }
  12. )
  13. puts response

Js

  1. const response = await client.indices.create({
  2. index: "example",
  3. mappings: {
  4. properties: {
  5. location: {
  6. type: "geo_shape",
  7. },
  8. },
  9. },
  10. });
  11. console.log(response);

Console

  1. PUT /example
  2. {
  3. "mappings": {
  4. "properties": {
  5. "location": {
  6. "type": "geo_shape"
  7. }
  8. }
  9. }
  10. }

Input Structure

形状は、GeoJSON または Well-Known Text (WKT) 形式を使用して表現できます。次の表は、GeoJSON および WKT を Elasticsearch タイプにマッピングしたものです:

GeoJSON タイプ WKT タイプ Elasticsearch タイプ 説明
Point POINT point 単一の地理座標。注意:Elasticsearch は WGS-84 座標のみを使用します。
LineString LINESTRING linestring 2 つ以上のポイントを指定して与えられた任意の線。
Polygon POLYGON polygon 最初と最後のポイントが一致する 閉じた ポリゴン。したがって、n + 1 頂点を作成するには、n 辺のポリゴンと 4 頂点の最小数が必要です。
MultiPoint MULTIPOINT multipoint 接続されていないが、関連している可能性のあるポイントの配列。
MultiLineString MULTILINESTRING multilinestring 別々のラインストリングの配列。
MultiPolygon MULTIPOLYGON multipolygon 別々のポリゴンの配列。
GeometryCollection GEOMETRYCOLLECTION geometrycollection 複数のタイプが共存できる GeoJSON 形状(例:ポイントとラインストリング)に似ています。
N/A BBOX envelope 左上と右下のポイントのみを指定することで指定されたバウンディング長方形またはエンベロープ。

すべてのタイプについて、内側の type および coordinates フィールドが必要です。

Point

ポイントは、建物の位置やスマートフォンのジオロケーション API によって提供される現在の位置など、単一の地理座標です。以下は、GeoJSON におけるポイントの例です。

Python

  1. resp = client.index(
  2. index="example",
  3. document={
  4. "location": {
  5. "type": "Point",
  6. "coordinates": [
  7. -77.03653,
  8. 38.897676
  9. ]
  10. }
  11. },
  12. )
  13. print(resp)

Ruby

  1. response = client.index(
  2. index: 'example',
  3. body: {
  4. location: {
  5. type: 'Point',
  6. coordinates: [
  7. -77.03653,
  8. 38.897676
  9. ]
  10. }
  11. }
  12. )
  13. puts response

Js

  1. const response = await client.index({
  2. index: "example",
  3. document: {
  4. location: {
  5. type: "Point",
  6. coordinates: [-77.03653, 38.897676],
  7. },
  8. },
  9. });
  10. console.log(response);

Console

  1. POST /example/_doc
  2. {
  3. "location" : {
  4. "type" : "Point",
  5. "coordinates" : [-77.03653, 38.897676]
  6. }
  7. }

以下は、WKT におけるポイントの例です:

Python

  1. resp = client.index(
  2. index="example",
  3. document={
  4. "location": "POINT (-77.03653 38.897676)"
  5. },
  6. )
  7. print(resp)

Ruby

  1. response = client.index(
  2. index: 'example',
  3. body: {
  4. location: 'POINT (-77.03653 38.897676)'
  5. }
  6. )
  7. puts response

Js

  1. const response = await client.index({
  2. index: "example",
  3. document: {
  4. location: "POINT (-77.03653 38.897676)",
  5. },
  6. });
  7. console.log(response);

Console

  1. POST /example/_doc
  2. {
  3. "location" : "POINT (-77.03653 38.897676)"
  4. }

LineString

ラインストリングは、2 つ以上の位置の配列によって定義されます。2 つのポイントのみを指定することで、ラインストリングは直線を表します。2 つ以上のポイントを指定すると、任意のパスが作成されます。以下は、GeoJSON におけるラインストリングの例です。

Python

  1. resp = client.index(
  2. index="example",
  3. document={
  4. "location": {
  5. "type": "LineString",
  6. "coordinates": [
  7. [
  8. -77.03653,
  9. 38.897676
  10. ],
  11. [
  12. -77.009051,
  13. 38.889939
  14. ]
  15. ]
  16. }
  17. },
  18. )
  19. print(resp)

Ruby

  1. response = client.index(
  2. index: 'example',
  3. body: {
  4. location: {
  5. type: 'LineString',
  6. coordinates: [
  7. [
  8. -77.03653,
  9. 38.897676
  10. ],
  11. [
  12. -77.009051,
  13. 38.889939
  14. ]
  15. ]
  16. }
  17. }
  18. )
  19. puts response

Js

  1. const response = await client.index({
  2. index: "example",
  3. document: {
  4. location: {
  5. type: "LineString",
  6. coordinates: [
  7. [-77.03653, 38.897676],
  8. [-77.009051, 38.889939],
  9. ],
  10. },
  11. },
  12. });
  13. console.log(response);

Console

  1. POST /example/_doc
  2. {
  3. "location" : {
  4. "type" : "LineString",
  5. "coordinates" : [[-77.03653, 38.897676], [-77.009051, 38.889939]]
  6. }
  7. }

以下は、WKT におけるラインストリングの例です:

Python

  1. resp = client.index(
  2. index="example",
  3. document={
  4. "location": "LINESTRING (-77.03653 38.897676, -77.009051 38.889939)"
  5. },
  6. )
  7. print(resp)

Ruby

  1. response = client.index(
  2. index: 'example',
  3. body: {
  4. location: 'LINESTRING (-77.03653 38.897676, -77.009051 38.889939)'
  5. }
  6. )
  7. puts response

Js

  1. const response = await client.index({
  2. index: "example",
  3. document: {
  4. location: "LINESTRING (-77.03653 38.897676, -77.009051 38.889939)",
  5. },
  6. });
  7. console.log(response);

Console

  1. POST /example/_doc
  2. {
  3. "location" : "LINESTRING (-77.03653 38.897676, -77.009051 38.889939)"
  4. }

上記のラインストリングは、ホワイトハウスからアメリカ合衆国議会議事堂までの直線を描きます。

Polygon

ポリゴンは、ポイントのリストによって定義されます。各(外側の)リストの最初と最後のポイントは同じでなければなりません(ポリゴンは閉じている必要があります)。以下は、GeoJSON におけるポリゴンの例です。

Python

  1. resp = client.index(
  2. index="example",
  3. document={
  4. "location": {
  5. "type": "Polygon",
  6. "coordinates": [
  7. [
  8. [
  9. 100,
  10. 0
  11. ],
  12. [
  13. 101,
  14. 0
  15. ],
  16. [
  17. 101,
  18. 1
  19. ],
  20. [
  21. 100,
  22. 1
  23. ],
  24. [
  25. 100,
  26. 0
  27. ]
  28. ]
  29. ]
  30. }
  31. },
  32. )
  33. print(resp)

Ruby

  1. response = client.index(
  2. index: 'example',
  3. body: {
  4. location: {
  5. type: 'Polygon',
  6. coordinates: [
  7. [
  8. [
  9. 100,
  10. 0
  11. ],
  12. [
  13. 101,
  14. 0
  15. ],
  16. [
  17. 101,
  18. 1
  19. ],
  20. [
  21. 100,
  22. 1
  23. ],
  24. [
  25. 100,
  26. 0
  27. ]
  28. ]
  29. ]
  30. }
  31. }
  32. )
  33. puts response

Js

  1. const response = await client.index({
  2. index: "example",
  3. document: {
  4. location: {
  5. type: "Polygon",
  6. coordinates: [
  7. [
  8. [100, 0],
  9. [101, 0],
  10. [101, 1],
  11. [100, 1],
  12. [100, 0],
  13. ],
  14. ],
  15. },
  16. },
  17. });
  18. console.log(response);

Console

  1. POST /example/_doc
  2. {
  3. "location" : {
  4. "type" : "Polygon",
  5. "coordinates" : [
  6. [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ]
  7. ]
  8. }
  9. }

以下は、WKT におけるポリゴンの例です:

Python

  1. resp = client.index(
  2. index="example",
  3. document={
  4. "location": "POLYGON ((100.0 0.0, 101.0 0.0, 101.0 1.0, 100.0 1.0, 100.0 0.0))"
  5. },
  6. )
  7. print(resp)

Ruby

  1. response = client.index(
  2. index: 'example',
  3. body: {
  4. location: 'POLYGON ((100.0 0.0, 101.0 0.0, 101.0 1.0, 100.0 1.0, 100.0 0.0))'
  5. }
  6. )
  7. puts response

Js

  1. const response = await client.index({
  2. index: "example",
  3. document: {
  4. location:
  5. "POLYGON ((100.0 0.0, 101.0 0.0, 101.0 1.0, 100.0 1.0, 100.0 0.0))",
  6. },
  7. });
  8. console.log(response);

Console

  1. POST /example/_doc
  2. {
  3. "location" : "POLYGON ((100.0 0.0, 101.0 0.0, 101.0 1.0, 100.0 1.0, 100.0 0.0))"
  4. }

最初の配列はポリゴンの外部境界を表し、他の配列は内部形状(”穴”)を表します。以下は、穴のあるポリゴンの GeoJSON の例です:

Python

  1. resp = client.index(
  2. index="example",
  3. document={
  4. "location": {
  5. "type": "Polygon",
  6. "coordinates": [
  7. [
  8. [
  9. 100,
  10. 0
  11. ],
  12. [
  13. 101,
  14. 0
  15. ],
  16. [
  17. 101,
  18. 1
  19. ],
  20. [
  21. 100,
  22. 1
  23. ],
  24. [
  25. 100,
  26. 0
  27. ]
  28. ],
  29. [
  30. [
  31. 100.2,
  32. 0.2
  33. ],
  34. [
  35. 100.8,
  36. 0.2
  37. ],
  38. [
  39. 100.8,
  40. 0.8
  41. ],
  42. [
  43. 100.2,
  44. 0.8
  45. ],
  46. [
  47. 100.2,
  48. 0.2
  49. ]
  50. ]
  51. ]
  52. }
  53. },
  54. )
  55. print(resp)

Ruby

  1. response = client.index(
  2. index: 'example',
  3. body: {
  4. location: {
  5. type: 'Polygon',
  6. coordinates: [
  7. [
  8. [
  9. 100,
  10. 0
  11. ],
  12. [
  13. 101,
  14. 0
  15. ],
  16. [
  17. 101,
  18. 1
  19. ],
  20. [
  21. 100,
  22. 1
  23. ],
  24. [
  25. 100,
  26. 0
  27. ]
  28. ],
  29. [
  30. [
  31. 100.2,
  32. 0.2
  33. ],
  34. [
  35. 100.8,
  36. 0.2
  37. ],
  38. [
  39. 100.8,
  40. 0.8
  41. ],
  42. [
  43. 100.2,
  44. 0.8
  45. ],
  46. [
  47. 100.2,
  48. 0.2
  49. ]
  50. ]
  51. ]
  52. }
  53. }
  54. )
  55. puts response

Js

  1. const response = await client.index({
  2. index: "example",
  3. document: {
  4. location: {
  5. type: "Polygon",
  6. coordinates: [
  7. [
  8. [100, 0],
  9. [101, 0],
  10. [101, 1],
  11. [100, 1],
  12. [100, 0],
  13. ],
  14. [
  15. [100.2, 0.2],
  16. [100.8, 0.2],
  17. [100.8, 0.8],
  18. [100.2, 0.8],
  19. [100.2, 0.2],
  20. ],
  21. ],
  22. },
  23. },
  24. });
  25. console.log(response);

Console

  1. POST /example/_doc
  2. {
  3. "location" : {
  4. "type" : "Polygon",
  5. "coordinates" : [
  6. [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ],
  7. [ [100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2] ]
  8. ]
  9. }
  10. }

以下は、WKT における穴のあるポリゴンの例です:

Python

  1. resp = client.index(
  2. index="example",
  3. document={
  4. "location": "POLYGON ((100.0 0.0, 101.0 0.0, 101.0 1.0, 100.0 1.0, 100.0 0.0), (100.2 0.2, 100.8 0.2, 100.8 0.8, 100.2 0.8, 100.2 0.2))"
  5. },
  6. )
  7. print(resp)

Ruby

  1. response = client.index(
  2. index: 'example',
  3. body: {
  4. location: 'POLYGON ((100.0 0.0, 101.0 0.0, 101.0 1.0, 100.0 1.0, 100.0 0.0), (100.2 0.2, 100.8 0.2, 100.8 0.8, 100.2 0.8, 100.2 0.2))'
  5. }
  6. )
  7. puts response

Js

  1. const response = await client.index({
  2. index: "example",
  3. document: {
  4. location:
  5. "POLYGON ((100.0 0.0, 101.0 0.0, 101.0 1.0, 100.0 1.0, 100.0 0.0), (100.2 0.2, 100.8 0.2, 100.8 0.8, 100.2 0.8, 100.2 0.2))",
  6. },
  7. });
  8. console.log(response);

Console

  1. POST /example/_doc
  2. {
  3. "location" : "POLYGON ((100.0 0.0, 101.0 0.0, 101.0 1.0, 100.0 1.0, 100.0 0.0), (100.2 0.2, 100.8 0.2, 100.8 0.8, 100.2 0.8, 100.2 0.2))"
  4. }

Polygon orientation

ポリゴンの向きは、その頂点の順序を示します:RIGHT(反時計回り)または LEFT(時計回り)。Elasticsearch は、ポリゴンの向きを使用して、それが国際日付変更線(+/-180° 経度)を越えるかどうかを判断します。

WKT ポリゴンのデフォルトの向きを設定するには、orientation マッピングパラメータ を使用します。これは、WKT 仕様がデフォルトの向きを指定または強制しないためです。

GeoJSON ポリゴンは、RIGHT のデフォルトの向きを使用します。これは、orientation マッピングパラメータの値に関係なく です。これは、GeoJSON 仕様 が外部ポリゴンに反時計回りの向きを使用し、内部形状に時計回りの向きを使用することを義務付けているためです。

GeoJSON ポリゴンのデフォルトの向きをオーバーライドするには、ドキュメントレベルの orientation パラメータを使用します。たとえば、次のインデックスリクエストは、ドキュメントレベルの orientationLEFT に指定します。

Python

  1. resp = client.index(
  2. index="example",
  3. document={
  4. "location": {
  5. "type": "Polygon",
  6. "orientation": "LEFT",
  7. "coordinates": [
  8. [
  9. [
  10. -177,
  11. 10
  12. ],
  13. [
  14. 176,
  15. 15
  16. ],
  17. [
  18. 172,
  19. 0
  20. ],
  21. [
  22. 176,
  23. -15
  24. ],
  25. [
  26. -177,
  27. -10
  28. ],
  29. [
  30. -177,
  31. 10
  32. ]
  33. ]
  34. ]
  35. }
  36. },
  37. )
  38. print(resp)

Ruby

  1. response = client.index(
  2. index: 'example',
  3. body: {
  4. location: {
  5. type: 'Polygon',
  6. orientation: 'LEFT',
  7. coordinates: [
  8. [
  9. [
  10. -177,
  11. 10
  12. ],
  13. [
  14. 176,
  15. 15
  16. ],
  17. [
  18. 172,
  19. 0
  20. ],
  21. [
  22. 176,
  23. -15
  24. ],
  25. [
  26. -177,
  27. -10
  28. ],
  29. [
  30. -177,
  31. 10
  32. ]
  33. ]
  34. ]
  35. }
  36. }
  37. )
  38. puts response

Js

  1. const response = await client.index({
  2. index: "example",
  3. document: {
  4. location: {
  5. type: "Polygon",
  6. orientation: "LEFT",
  7. coordinates: [
  8. [
  9. [-177, 10],
  10. [176, 15],
  11. [172, 0],
  12. [176, -15],
  13. [-177, -10],
  14. [-177, 10],
  15. ],
  16. ],
  17. },
  18. },
  19. });
  20. console.log(response);

Console

  1. POST /example/_doc
  2. {
  3. "location" : {
  4. "type" : "Polygon",
  5. "orientation" : "LEFT",
  6. "coordinates" : [
  7. [ [-177.0, 10.0], [176.0, 15.0], [172.0, 0.0], [176.0, -15.0], [-177.0, -10.0], [-177.0, 10.0] ]
  8. ]
  9. }
  10. }

Elasticsearch は、ポリゴンの向きを使用して、それが国際日付変更線を越えるかどうかを判断します。ポリゴンの最小経度と最大経度の差が 180° 未満の場合、ポリゴンは日付変更線を越えず、その向きは影響を与えません。

ポリゴンの最小経度と最大経度の差が 180° 以上の場合、Elasticsearch はポリゴンのドキュメントレベルの orientation がデフォルトの向きと異なるかどうかを確認します。向きが異なる場合、Elasticsearch はポリゴンが国際日付変更線を越えると見なし、ポリゴンを日付変更線で分割します。

MultiPoint

以下は、GeoJSON ポイントのリストの例です:

Python

  1. resp = client.index(
  2. index="example",
  3. document={
  4. "location": {
  5. "type": "MultiPoint",
  6. "coordinates": [
  7. [
  8. 102,
  9. 2
  10. ],
  11. [
  12. 103,
  13. 2
  14. ]
  15. ]
  16. }
  17. },
  18. )
  19. print(resp)

Ruby

  1. response = client.index(
  2. index: 'example',
  3. body: {
  4. location: {
  5. type: 'MultiPoint',
  6. coordinates: [
  7. [
  8. 102,
  9. 2
  10. ],
  11. [
  12. 103,
  13. 2
  14. ]
  15. ]
  16. }
  17. }
  18. )
  19. puts response

Js

  1. const response = await client.index({
  2. index: "example",
  3. document: {
  4. location: {
  5. type: "MultiPoint",
  6. coordinates: [
  7. [102, 2],
  8. [103, 2],
  9. ],
  10. },
  11. },
  12. });
  13. console.log(response);

Console

  1. POST /example/_doc
  2. {
  3. "location" : {
  4. "type" : "MultiPoint",
  5. "coordinates" : [
  6. [102.0, 2.0], [103.0, 2.0]
  7. ]
  8. }
  9. }

以下は、WKT ポイントのリストの例です:

Python

  1. resp = client.index(
  2. index="example",
  3. document={
  4. "location": "MULTIPOINT (102.0 2.0, 103.0 2.0)"
  5. },
  6. )
  7. print(resp)

Ruby

  1. response = client.index(
  2. index: 'example',
  3. body: {
  4. location: 'MULTIPOINT (102.0 2.0, 103.0 2.0)'
  5. }
  6. )
  7. puts response

Js

  1. const response = await client.index({
  2. index: "example",
  3. document: {
  4. location: "MULTIPOINT (102.0 2.0, 103.0 2.0)",
  5. },
  6. });
  7. console.log(response);

Console

  1. POST /example/_doc
  2. {
  3. "location" : "MULTIPOINT (102.0 2.0, 103.0 2.0)"
  4. }

MultiLineString

以下は、GeoJSON ラインストリングのリストの例です:

Python

  1. resp = client.index(
  2. index="example",
  3. document={
  4. "location": {
  5. "type": "MultiLineString",
  6. "coordinates": [
  7. [
  8. [
  9. 102,
  10. 2
  11. ],
  12. [
  13. 103,
  14. 2
  15. ],
  16. [
  17. 103,
  18. 3
  19. ],
  20. [
  21. 102,
  22. 3
  23. ]
  24. ],
  25. [
  26. [
  27. 100,
  28. 0
  29. ],
  30. [
  31. 101,
  32. 0
  33. ],
  34. [
  35. 101,
  36. 1
  37. ],
  38. [
  39. 100,
  40. 1
  41. ]
  42. ],
  43. [
  44. [
  45. 100.2,
  46. 0.2
  47. ],
  48. [
  49. 100.8,
  50. 0.2
  51. ],
  52. [
  53. 100.8,
  54. 0.8
  55. ],
  56. [
  57. 100.2,
  58. 0.8
  59. ]
  60. ]
  61. ]
  62. }
  63. },
  64. )
  65. print(resp)

Ruby

  1. response = client.index(
  2. index: 'example',
  3. body: {
  4. location: {
  5. type: 'MultiLineString',
  6. coordinates: [
  7. [
  8. [
  9. 102,
  10. 2
  11. ],
  12. [
  13. 103,
  14. 2
  15. ],
  16. [
  17. 103,
  18. 3
  19. ],
  20. [
  21. 102,
  22. 3
  23. ]
  24. ],
  25. [
  26. [
  27. 100,
  28. 0
  29. ],
  30. [
  31. 101,
  32. 0
  33. ],
  34. [
  35. 101,
  36. 1
  37. ],
  38. [
  39. 100,
  40. 1
  41. ]
  42. ],
  43. [
  44. [
  45. 100.2,
  46. 0.2
  47. ],
  48. [
  49. 100.8,
  50. 0.2
  51. ],
  52. [
  53. 100.8,
  54. 0.8
  55. ],
  56. [
  57. 100.2,
  58. 0.8
  59. ]
  60. ]
  61. ]
  62. }
  63. }
  64. )
  65. puts response

Js

  1. const response = await client.index({
  2. index: "example",
  3. document: {
  4. location: {
  5. type: "MultiLineString",
  6. coordinates: [
  7. [
  8. [102, 2],
  9. [103, 2],
  10. [103, 3],
  11. [102, 3],
  12. ],
  13. [
  14. [100, 0],
  15. [101, 0],
  16. [101, 1],
  17. [100, 1],
  18. ],
  19. [
  20. [100.2, 0.2],
  21. [100.8, 0.2],
  22. [100.8, 0.8],
  23. [100.2, 0.8],
  24. ],
  25. ],
  26. },
  27. },
  28. });
  29. console.log(response);

Console

  1. POST /example/_doc
  2. {
  3. "location" : {
  4. "type" : "MultiLineString",
  5. "coordinates" : [
  6. [ [102.0, 2.0], [103.0, 2.0], [103.0, 3.0], [102.0, 3.0] ],
  7. [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0] ],
  8. [ [100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8] ]
  9. ]
  10. }
  11. }

以下は、WKT ラインストリングのリストの例です:

Python

  1. resp = client.index(
  2. index="example",
  3. document={
  4. "location": "MULTILINESTRING ((102.0 2.0, 103.0 2.0, 103.0 3.0, 102.0 3.0), (100.0 0.0, 101.0 0.0, 101.0 1.0, 100.0 1.0), (100.2 0.2, 100.8 0.2, 100.8 0.8, 100.2 0.8))"
  5. },
  6. )
  7. print(resp)

Ruby

  1. response = client.index(
  2. index: 'example',
  3. body: {
  4. location: 'MULTILINESTRING ((102.0 2.0, 103.0 2.0, 103.0 3.0, 102.0 3.0), (100.0 0.0, 101.0 0.0, 101.0 1.0, 100.0 1.0), (100.2 0.2, 100.8 0.2, 100.8 0.8, 100.2 0.8))'
  5. }
  6. )
  7. puts response

Js

  1. const response = await client.index({
  2. index: "example",
  3. document: {
  4. location:
  5. "MULTILINESTRING ((102.0 2.0, 103.0 2.0, 103.0 3.0, 102.0 3.0), (100.0 0.0, 101.0 0.0, 101.0 1.0, 100.0 1.0), (100.2 0.2, 100.8 0.2, 100.8 0.8, 100.2 0.8))",
  6. },
  7. });
  8. console.log(response);

Console

  1. POST /example/_doc
  2. {
  3. "location" : "MULTILINESTRING ((102.0 2.0, 103.0 2.0, 103.0 3.0, 102.0 3.0), (100.0 0.0, 101.0 0.0, 101.0 1.0, 100.0 1.0), (100.2 0.2, 100.8 0.2, 100.8 0.8, 100.2 0.8))"
  4. }

MultiPolygon

以下は、GeoJSON ポリゴンのリストの例です(2 番目のポリゴンには穴があります):

Python

  1. resp = client.index(
  2. index="example",
  3. document={
  4. "location": {
  5. "type": "MultiPolygon",
  6. "coordinates": [
  7. [
  8. [
  9. [
  10. 102,
  11. 2
  12. ],
  13. [
  14. 103,
  15. 2
  16. ],
  17. [
  18. 103,
  19. 3
  20. ],
  21. [
  22. 102,
  23. 3
  24. ],
  25. [
  26. 102,
  27. 2
  28. ]
  29. ]
  30. ],
  31. [
  32. [
  33. [
  34. 100,
  35. 0
  36. ],
  37. [
  38. 101,
  39. 0
  40. ],
  41. [
  42. 101,
  43. 1
  44. ],
  45. [
  46. 100,
  47. 1
  48. ],
  49. [
  50. 100,
  51. 0
  52. ]
  53. ],
  54. [
  55. [
  56. 100.2,
  57. 0.2
  58. ],
  59. [
  60. 100.8,
  61. 0.2
  62. ],
  63. [
  64. 100.8,
  65. 0.8
  66. ],
  67. [
  68. 100.2,
  69. 0.8
  70. ],
  71. [
  72. 100.2,
  73. 0.2
  74. ]
  75. ]
  76. ]
  77. ]
  78. }
  79. },
  80. )
  81. print(resp)

Ruby

  1. response = client.index(
  2. index: 'example',
  3. body: {
  4. location: {
  5. type: 'MultiPolygon',
  6. coordinates: [
  7. [
  8. [
  9. [
  10. 102,
  11. 2
  12. ],
  13. [
  14. 103,
  15. 2
  16. ],
  17. [
  18. 103,
  19. 3
  20. ],
  21. [
  22. 102,
  23. 3
  24. ],
  25. [
  26. 102,
  27. 2
  28. ]
  29. ]
  30. ],
  31. [
  32. [
  33. [
  34. 100,
  35. 0
  36. ],
  37. [
  38. 101,
  39. 0
  40. ],
  41. [
  42. 101,
  43. 1
  44. ],
  45. [
  46. 100,
  47. 1
  48. ],
  49. [
  50. 100,
  51. 0
  52. ]
  53. ],
  54. [
  55. [
  56. 100.2,
  57. 0.2
  58. ],
  59. [
  60. 100.8,
  61. 0.2
  62. ],
  63. [
  64. 100.8,
  65. 0.8
  66. ],
  67. [
  68. 100.2,
  69. 0.8
  70. ],
  71. [
  72. 100.2,
  73. 0.2
  74. ]
  75. ]
  76. ]
  77. ]
  78. }
  79. }
  80. )
  81. puts response

Js

  1. const response = await client.index({
  2. index: "example",
  3. document: {
  4. location: {
  5. type: "MultiPolygon",
  6. coordinates: [
  7. [
  8. [
  9. [102, 2],
  10. [103, 2],
  11. [103, 3],
  12. [102, 3],
  13. [102, 2],
  14. ],
  15. ],
  16. [
  17. [
  18. [100, 0],
  19. [101, 0],
  20. [101, 1],
  21. [100, 1],
  22. [100, 0],
  23. ],
  24. [
  25. [100.2, 0.2],
  26. [100.8, 0.2],
  27. [100.8, 0.8],
  28. [100.2, 0.8],
  29. [100.2, 0.2],
  30. ],
  31. ],
  32. ],
  33. },
  34. },
  35. });
  36. console.log(response);

Console

  1. POST /example/_doc
  2. {
  3. "location" : {
  4. "type" : "MultiPolygon",
  5. "coordinates" : [
  6. [ [[102.0, 2.0], [103.0, 2.0], [103.0, 3.0], [102.0, 3.0], [102.0, 2.0]] ],
  7. [ [[100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]],
  8. [[100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2]] ]
  9. ]
  10. }
  11. }

以下は、WKT ポリゴンのリストの例です(2 番目のポリゴンには穴があります):

Python

  1. resp = client.index(
  2. index="example",
  3. document={
  4. "location": "MULTIPOLYGON (((102.0 2.0, 103.0 2.0, 103.0 3.0, 102.0 3.0, 102.0 2.0)), ((100.0 0.0, 101.0 0.0, 101.0 1.0, 100.0 1.0, 100.0 0.0), (100.2 0.2, 100.8 0.2, 100.8 0.8, 100.2 0.8, 100.2 0.2)))"
  5. },
  6. )
  7. print(resp)

Ruby

  1. response = client.index(
  2. index: 'example',
  3. body: {
  4. location: 'MULTIPOLYGON (((102.0 2.0, 103.0 2.0, 103.0 3.0, 102.0 3.0, 102.0 2.0)), ((100.0 0.0, 101.0 0.0, 101.0 1.0, 100.0 1.0, 100.0 0.0), (100.2 0.2, 100.8 0.2, 100.8 0.8, 100.2 0.8, 100.2 0.2)))'
  5. }
  6. )
  7. puts response

Js

  1. const response = await client.index({
  2. index: "example",
  3. document: {
  4. location:
  5. "MULTIPOLYGON (((102.0 2.0, 103.0 2.0, 103.0 3.0, 102.0 3.0, 102.0 2.0)), ((100.0 0.0, 101.0 0.0, 101.0 1.0, 100.0 1.0, 100.0 0.0), (100.2 0.2, 100.8 0.2, 100.8 0.8, 100.2 0.8, 100.2 0.2)))",
  6. },
  7. });
  8. console.log(response);

Console

  1. POST /example/_doc
  2. {
  3. "location" : "MULTIPOLYGON (((102.0 2.0, 103.0 2.0, 103.0 3.0, 102.0 3.0, 102.0 2.0)), ((100.0 0.0, 101.0 0.0, 101.0 1.0, 100.0 1.0, 100.0 0.0), (100.2 0.2, 100.8 0.2, 100.8 0.8, 100.2 0.8, 100.2 0.2)))"
  4. }

Geometry Collection

以下は、GeoJSON ジオメトリオブジェクトのコレクションの例です:

Python

  1. resp = client.index(
  2. index="example",
  3. document={
  4. "location": {
  5. "type": "GeometryCollection",
  6. "geometries": [
  7. {
  8. "type": "Point",
  9. "coordinates": [
  10. 100,
  11. 0
  12. ]
  13. },
  14. {
  15. "type": "LineString",
  16. "coordinates": [
  17. [
  18. 101,
  19. 0
  20. ],
  21. [
  22. 102,
  23. 1
  24. ]
  25. ]
  26. }
  27. ]
  28. }
  29. },
  30. )
  31. print(resp)

Ruby

  1. response = client.index(
  2. index: 'example',
  3. body: {
  4. location: {
  5. type: 'GeometryCollection',
  6. geometries: [
  7. {
  8. type: 'Point',
  9. coordinates: [
  10. 100,
  11. 0
  12. ]
  13. },
  14. {
  15. type: 'LineString',
  16. coordinates: [
  17. [
  18. 101,
  19. 0
  20. ],
  21. [
  22. 102,
  23. 1
  24. ]
  25. ]
  26. }
  27. ]
  28. }
  29. }
  30. )
  31. puts response

Js

  1. const response = await client.index({
  2. index: "example",
  3. document: {
  4. location: {
  5. type: "GeometryCollection",
  6. geometries: [
  7. {
  8. type: "Point",
  9. coordinates: [100, 0],
  10. },
  11. {
  12. type: "LineString",
  13. coordinates: [
  14. [101, 0],
  15. [102, 1],
  16. ],
  17. },
  18. ],
  19. },
  20. },
  21. });
  22. console.log(response);

Console

  1. POST /example/_doc
  2. {
  3. "location" : {
  4. "type": "GeometryCollection",
  5. "geometries": [
  6. {
  7. "type": "Point",
  8. "coordinates": [100.0, 0.0]
  9. },
  10. {
  11. "type": "LineString",
  12. "coordinates": [ [101.0, 0.0], [102.0, 1.0] ]
  13. }
  14. ]
  15. }
  16. }

以下は、WKT ジオメトリオブジェクトのコレクションの例です:

Python

  1. resp = client.index(
  2. index="example",
  3. document={
  4. "location": "GEOMETRYCOLLECTION (POINT (100.0 0.0), LINESTRING (101.0 0.0, 102.0 1.0))"
  5. },
  6. )
  7. print(resp)

Ruby

  1. response = client.index(
  2. index: 'example',
  3. body: {
  4. location: 'GEOMETRYCOLLECTION (POINT (100.0 0.0), LINESTRING (101.0 0.0, 102.0 1.0))'
  5. }
  6. )
  7. puts response

Js

  1. const response = await client.index({
  2. index: "example",
  3. document: {
  4. location:
  5. "GEOMETRYCOLLECTION (POINT (100.0 0.0), LINESTRING (101.0 0.0, 102.0 1.0))",
  6. },
  7. });
  8. console.log(response);

Console

  1. POST /example/_doc
  2. {
  3. "location" : "GEOMETRYCOLLECTION (POINT (100.0 0.0), LINESTRING (101.0 0.0, 102.0 1.0))"
  4. }

Envelope

Elasticsearch は、envelope タイプをサポートしており、これは形状の上部左点と下部右点の座標で構成され、[[minLon, maxLat], [maxLon, minLat]] 形式のバウンディング長方形を表します:

Python

  1. resp = client.index(
  2. index="example",
  3. document={
  4. "location": {
  5. "type": "envelope",
  6. "coordinates": [
  7. [
  8. 100,
  9. 1
  10. ],
  11. [
  12. 101,
  13. 0
  14. ]
  15. ]
  16. }
  17. },
  18. )
  19. print(resp)

Ruby

  1. response = client.index(
  2. index: 'example',
  3. body: {
  4. location: {
  5. type: 'envelope',
  6. coordinates: [
  7. [
  8. 100,
  9. 1
  10. ],
  11. [
  12. 101,
  13. 0
  14. ]
  15. ]
  16. }
  17. }
  18. )
  19. puts response

Js

  1. const response = await client.index({
  2. index: "example",
  3. document: {
  4. location: {
  5. type: "envelope",
  6. coordinates: [
  7. [100, 1],
  8. [101, 0],
  9. ],
  10. },
  11. },
  12. });
  13. console.log(response);

Console

  1. POST /example/_doc
  2. {
  3. "location" : {
  4. "type" : "envelope",
  5. "coordinates" : [ [100.0, 1.0], [101.0, 0.0] ]
  6. }
  7. }

以下は、WKT BBOX 形式を使用したエンベロープの例です:

注意: WKT 仕様は、次の順序を期待します:minLon, maxLon, maxLat, minLat。

Python

  1. resp = client.index(
  2. index="example",
  3. document={
  4. "location": "BBOX (100.0, 102.0, 2.0, 0.0)"
  5. },
  6. )
  7. print(resp)

Ruby

  1. response = client.index(
  2. index: 'example',
  3. body: {
  4. location: 'BBOX (100.0, 102.0, 2.0, 0.0)'
  5. }
  6. )
  7. puts response

Js

  1. const response = await client.index({
  2. index: "example",
  3. document: {
  4. location: "BBOX (100.0, 102.0, 2.0, 0.0)",
  5. },
  6. });
  7. console.log(response);

Console

  1. POST /example/_doc
  2. {
  3. "location" : "BBOX (100.0, 102.0, 2.0, 0.0)"
  4. }

Circle

GeoJSON も WKT も、ポイント半径の円タイプをサポートしていません。代わりに、円のインジェストプロセッサ を使用して、円を polygon として近似します。

Sorting and Retrieving index Shapes

形状の複雑な入力構造とインデックス表現のため、現在のところ形状をソートしたり、そのフィールドを直接取得したりすることはできません。geo_shape 値は _source フィールドを通じてのみ取得可能です。

Synthetic source

合成 _source は、一般的に TSDB インデックス(index.modetime_series に設定されているインデックス)のみで利用可能です。他のインデックスでは、合成 _source は技術プレビュー中です。技術プレビュー中の機能は、将来のリリースで変更または削除される可能性があります。Elastic は問題を修正するために作業しますが、技術プレビュー中の機能は公式 GA 機能のサポート SLA の対象ではありません。

geo_shape フィールドは、デフォルト構成で 合成 _source をサポートします。