首页 > 解决方案 > Elasticsearch 是否支持 postgis 中的 ST_DWithin 等地理查询

问题描述

如何在 Elasticsearch 中执行这样的查询,即 geo_point 是否在一条线的指定距离(或半径/缓冲区)内(由 2 对纬度/经度表示)

像这样的形状

标签: elasticsearch

解决方案


据我所知,这并没有在 Elastic 中实现。但是您仍然可以通过离线计算多边形然后在geo_polygon查询中使用它来实现您想要的。geo_shape也可以使用查询,但您需要一个字段geo_shape而不是一个字段geo_point

因此,例如,使用草皮buffer,您可以使用该功能预先计算线周围的多边形。下面,我在圣何塞(加利福尼亚州)某处的某处道路上定义一条线,并在该线/道路周围定义一个 50 米的缓冲区:

const line = turf.lineString([[-121.862282,37.315430], [-121.851553,37.305532]], {name: 'line 1'});
const bufferPoly = turf.buffer(line, 50, {units: 'meters'});

您将得到以下多边形(缩写)

{
  "type": "Feature",
  "properties": {
    "name": "line 1"
  },
  "geometry": {
    "type": "Polygon",
    "coordinates": [
      [
        [
          -121.85121372045873,
          37.305765606399724
        ],
        [
          -121.85116304254947,
          37.30570833334188
        ],
        [
          -121.85112738572346,
          37.30564429665501
        ],
        [
          -121.85110812025259,
          37.30557595721911
        ],
        ...
        [
          -121.85121372045873,
          37.305765606399724
        ]
      ]
    ]
  }
}

看起来像这样:

线周围的多边形

然后您可以geo_polygon像这样利用查询:

GET /_search
{
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": {
        "geo_polygon": {
          "your_geo_point": {
            "points": [
              [
                -121.85121372045873,
                37.305765606399724
              ],
              [
                -121.85116304254947,
                37.30570833334188
              ],
              [
                -121.85112738572346,
                37.30564429665501
              ],
              [
                -121.85110812025259,
                37.30557595721911
              ],
              ...
              [
                -121.85121372045873,
                37.305765606399724
              ]
            ]
          }
        }
      }
    }
  }
}

推荐阅读