我已将ElasticSearch中的路径存储为Polygon.现在我有一个圆(一个点和一个半径),我能够检查圆点与多边形是否相交(下面是我使用的代码).
问题:如何获得与圆相交的路线中的点?
public Boolean isMatchingDoc(Long elasticDocId,Double latitude,Double longitude,Long radius) { Coordinate origin = new Coordinate(latitude,longitude); ShapeBuilder circleShapeBuilder = ShapeBuilder.newCircleBuilder().center(origin).radius(radius,DistanceUnit.METERS); GeoShapeQueryBuilder geoShapeQueryBuilder = QueryBuilders.geoShapeQuery("route",circleShapeBuilder); SearchRequestBuilder finalQuery = client.prepareSearch(INDEX).setTypes(TYPE) .setQuery(QueryBuilders.termQuery("_id",elasticDocId)).setPostFilter(geoShapeQueryBuilder); SearchResponse searchResponse = finalQuery.execute().actionGet(); SearchHits searchHits = searchResponse.getHits(); if (searchHits.getTotalHits() > 0) { return true; } return false; }
解决方法
我想你知道使用elasticsearch,你可以查询与给定圆相交的多边形吗?见
https://www.elastic.co/guide/en/elasticsearch/guide/current/querying-geo-shapes.html.
这有两个原因可能对您没有帮助:
>您的路线不是多边形,而是线条.
>如果我正确地阅读了您的问题,您想知道交叉点的确切点.
Elasticsearch可能无法为您方便地解决这个问题.如果您将单独存储所有线段而不是每个路径存储一个巨大的多边形,则可以解决这个问题.然后,每个线段必须具有引用其所属路线的属性.这种方法听起来对你有用吗?
无论如何,我建议你看一下“空间数据库”的主题:
空间数据库针对几何空间中的索引和搜索进行了优化.众所周知的数据库(如Postgresql和MongoDB)具有用于空间索引的插件/扩展.我不确定要推荐什么,但MongoDB geospatial API看起来很有希望,因为它允许查询交叉 – 它支持线和多边形.