如何在日期线中搜索带多边形的地理点?

时间:2016-01-13 14:13:06

标签: elasticsearch polygon geo

如何跨日期线(国际日期线,或180和-180经度)搜索多边形的地理点使用java api?

大家好:

我使用ElasticSearch 2.1及其java api,我想使用多边形地理过滤器搜索文档(多边形通常是矩形),但当多边形跨越日期线时 (国际日期线,或180和-180经度),它出错了。例如: 我的代码:

BoolQueryBuilder mustQuery = QueryBuilders.boolQuery().must(QueryBuilders.matchAllQuery());
......
GeoPolygonQueryBuilder qb = QueryBuilders.geoPolygonQuery("description.device_location.es_geo");

qb.addPoint(0,100);//the left down vertex of the polygon(rectangle),patams is (lat , lon)
qb.addPoint(0,-170);//right down
qb.addPoint(80,-170);//right up
qb.addPoint(80,100);//left up
qb.addPoint(0,100);//left down,same to the first vertex

mustQuery = mustQuery.must(qb);
SearchResponse searchResponse = EsClient.getClient().prepareSearch(Config.indexName)
.setTypes(Config.typeName)
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setQuery(mustQuery)
.setFrom(0).setSize(size).setExplain(true)
.execute()
.actionGet();

图示草图:

I want search in A area,but ES search in B area in fact

如上图所示,我提供ES点[0,100],[0,-170],[80,-170],[80,100],[0,100]来描述A区域,我想要文档区域,跨越dteline的区域。  但根据结果,经度为82,98,-121等,但[100,180]和[-180,-170]之间没有文档,所以我认为事实上 ES搜索B区域(它分析错误的多边形)。

我搜索解决方案,在ES的网站上,我找到了一些关于这个问题的话: (表格www.elastic.co/guide/en/elasticsearch/reference/2.1/geo-shape.html)

  

重要说明:GeoJSON不强制要求特定的顶点顺序,因此日期线和极点周围的模糊多边形是可能的。为了减轻歧义,Open Geospatial Consortium(OGC)简单特征访问规范定义了以下顶点排序:

  •   

    外圈 - 逆时针

  •   

    内圈/孔 - 顺时针

  

对于未穿过日期线的多边形,顶点顺序在Elasticsearch中无关紧要。对于跨越日期线的多边形,Elasticsearch要求顶点排序符合OGC规范。否则,可能会创建一个非预期的多边形,并返回意外的查询/过滤结果。

     

以下提供了一个模糊多边形的示例。 Elasticsearch将应用OGC标准来消除歧义,从而导致多边形跨越日期线。

但是这是geo-Shape数据类型,我的文档位置是地理位置,我在geo-points的网页上找不到类似的单词(www.elastic.co/guide/en/elasticsearch/reference/2.1 /geo-point.html)。

我尝试某种方式: 1.逆时针和顺时针顶点顺序; 2.从矩形的每个顶点开始; 3.用190 lon代替-170 lon; 但这些方式都不起作用。

有没有人知道如何跨日期线搜索多边形? 谢谢! (对不起,我是一名中国开发人员,我不会说英语,如果有问题,请给我建议或意见,谢谢。)

Here is the translated text of Chinese.Chinese characters couldn't be insert to question direct.

1 个答案:

答案 0 :(得分:2)

我是提问者,我已经有了答案。 我在https://discuss.elastic.co/t/search-geo-point-with-polygon-across-dateline/39103/3问了这个问题,并在那里得到答案。 之前,我曾经想过如果没有完美的解决方案,我可以将多边形分成2个日期线。我知道ES不会支持用多边形搜索地理点现在跨日期线:

目前geo_polygongeo_point类型的查询无效 跨越日期线。你要么必须:

  1. 手动将多边形拆分为2并使用布尔AND组合它们;
  2. geo_points重新编号为geo_shapes(建议设置points_only = true)并使用geo_shape(www.elastic.co/guide/en/elasticsearch/reference/2.1/geo-shape。 html)查询。
  3. 但是如果你知道多边形是一个 矩形,您可以使用geo_bounding_box(www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-geo-bounding-box-query.html)查询 处理日期行(如您的示例所示)。

    感谢@nknize和@ medcl1(在discuss.elastic.co)!