当前位置: 首页 > 面试题库 >

如何在Elasticsearch中知道地理坐标是否在地理多边形内?

艾焱
2023-03-14
问题内容

我正在使用elasticsearch1.4.1-1.4.4。我正在尝试将地理多边形形状(文档)索引到索引中,现在在对形状进行索引时,我想知道地理坐标是否位于该特定索引的地理多边形形状的边界内。

GET /city/_search
{
"query":{
    "filtered" : {
        "query" : {
            "match_all" : {}
        },
        "filter" : {
            "geo_polygon" : {
                "location" : {
                    "points" : [
                        [72.776491, 19.259634],
                        [72.955705, 19.268060],
                        [72.945406, 19.189611],
                        [72.987291, 19.169507],
                        [72.963945, 19.069596],
                        [72.914506, 18.994300],
                        [72.873994, 19.007933],
                        [72.817689, 18.896882],
                        [72.816316, 18.941052],
                        [72.816316, 19.113720],
                        [72.816316, 19.113720],
                        [72.790224, 19.192205],
                        [72.776491, 19.259634]
                    ]
                }
            }
        }
    }
}
}

使用上面的地理多边形过滤器,我可以使所有索引的地理坐标都位于所描述的多边形内,但是我还需要知道未索引的地理坐标是否位于此地理多边形中。我的怀疑是,在elasticsearch1.4.1中是否可行?


问题答案:

是的,可以使用Percolator解决此问题。

与Elasticsearch的正常使用情况一样,我们将文档索引到elasticsearch中,然后对索引数据运行查询以检索匹配的/必需的文档。

但是渗滤器的工作方式却不同。

在渗滤器中,您注册查询,然后通过注册的查询对文档进行渗滤,并取回与您的文档匹配的查询。

经过无数的Google搜索结果和许多博客之后,我找不到任何可以解释我如何使用渗滤器解决此问题的东西。

因此,我以一个示例进行说明,以便其他面临相同问题的人可以从我的问题和找到的解决方案中得到一些提示。我希望有人可以改善我的答案,或者可以分享一种更好的方法。

例如:-

首先,我们需要创建一个索引。

PUT /city/

然后,我们需要为用户文档添加一个映射,其中包含用户的纬度-经度,以对注册的查询进行渗透。

PUT /city/user/_mapping
{
    "user" : {
        "properties" : {
            "location" : {
                "type" : "geo_point"
            }
        }
    }
}

现在,我们可以将地理多边形查询注册为渗滤器,其ID为城市名称或您想要的任何其他标识符。

PUT /city/.percolator/mumbai
{
    "query":{
        "filtered" : {
            "query" : {
                "match_all" : {}
            },
            "filter" : {
                "geo_polygon" : {
                    "location" : {
                        "points" : [
                            [72.776491, 19.259634],
                            [72.955705, 19.268060],
                            [72.945406, 19.189611],
                            [72.987291, 19.169507],
                            [72.963945, 19.069596],
                            [72.914506, 18.994300],
                            [72.873994, 19.007933],
                            [72.817689, 18.896882],
                            [72.816316, 18.941052],
                            [72.816316, 19.113720],
                            [72.816316, 19.113720],
                            [72.790224, 19.192205],
                            [72.776491, 19.259634]
                        ]
                    }
                }
            }
        }
    }
}

让我们为另一个城市注册另一个地理多边形过滤器

PUT /city/.percolator/delhi
{
    "query":{
        "filtered" : {
            "query" : {
                "match_all" : {}
            },
            "filter" : {
                "geo_polygon" : {
                    "location" : {
                        "points" : [
                            [76.846998, 28.865160],
                            [77.274092, 28.841104],
                            [77.282331, 28.753252],
                            [77.482832, 28.596619],
                            [77.131269, 28.395064],
                            [76.846998, 28.865160]
                        ]
                    }
                }
            }
        }
    }
}

现在,我们已将2个查询注册为渗滤器,并且可以通过进行此API调用来确保。

GET /city/.percolator/_count

现在要知道在任何注册城市中是否都存在地理点,我们可以使用以下查询对用户文档进行过滤。

GET /city/user/_percolate
{
  "doc": {
        "location" : {
            "lat" : 19.088415,
            "lon" : 72.871248
             }
          }
}

这将返回:_id为“孟买”

{
   "took": 25,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "total": 1,
   "matches": [
      {
         "_index": "city",
         "_id": "mumbai"
      }
   ]
}

用不同的纬度尝试另一个查询

GET /city/user/_percolate
{
  "doc": {
        "location" : {
            "lat" : 28.539933,
            "lon" : 77.331770
             }
          }
    }

这将返回:_id as“ delhi”

{
   "took": 25,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "total": 1,
   "matches": [
      {
         "_index": "city",
         "_id": "delhi"
      }
   ]
}

让我们用随机纬度运行另一个查询

GET /city/user/_percolate
{
  "doc": {
        "location" : {
            "lat" : 18.539933,
            "lon" : 45.331770
             }
          }
}

该查询将不返回匹配结果。

{
   "took": 5,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "total": 0,
   "matches": []
}


 类似资料:
  • 我应该自己写方法吗?尽管我害怕不能解释一些事情,因为我的数学已经生疏了。或者我能为Java找到一个现成的实现吗?我有谷歌地图sdk在我的项目,但我找不到任何有用的东西。

  • 如何从多个地理位置(长,晚值)创建多边形地理围栏。也可以在Android上跟踪用户进入或退出该地理区域的情况。

  • 我有一个包含芝加哥地址的DataFrame,我已经将其地理编码为纬度和经度值,然后编码为Point对象(使DataFrame成为GeoDataFrame)。一小部分被错误地用芝加哥以外的LatLong值进行了地理编码。我有一个芝加哥边界的形状文件(GeoDataFrame),我想选择点在芝加哥边界多边形之外的所有行。 选择多边形内的所有点很容易(通过geopandas sjoin函数),但我还没有

  • 问题内容: 我正在使用python,并且已经在地图上定义了多边形的纬度和经度(以度为单位)。我的目标是检查通用坐标点是否落在此类多边形内。因此,我希望有一个函数可以检查这种情况并返回,或者该点在多边形内部还是外部。 在这个例子中,点在外面,所以结果是 问题 :是否有可以实现我的目标的库/软件包?如果是,您推荐哪一个?您能否举一个小例子来说明如何使用它? 这是我到目前为止编写的代码: 为了绘制多边形

  • 根据API文件,只允许圆形土工篱笆: 但我有4个位置,代表矩形的4个角,我想让我的地理围栏是那个矩形。 我想避免建立我的自定义位置监控服务的解决方案扩展的功能监测地理围栏,因为我认为这类服务是CPU和功耗消耗。 谢谢,

  • 问题内容: 我已经在Web项目的jsp / servlet中创建了一个登录应用程序,我想知道访问我的登录页面的不同用户的地理位置。我怎么知道某个人正在从哪里访问我的登录页面?例如:如果某人正在访问加拿大的页面,那么一条记录将插入到我的数据库中,例如:IP:20.4.9.134和位置:Canada。 问题答案: 我用这个: http://freegeoip.net/xml/122.169.8.137