java – 如何从ElasticSearch中的形状获取交叉点

前端之家收集整理的这篇文章主要介绍了java – 如何从ElasticSearch中的形状获取交叉点前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我已将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看起来很有希望,因为它允许查询交叉 – 它支持线和多边形.

猜你在找的Java相关文章