加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 00:36:15 所属栏目:Java 来源:网络整理
导读:我已将ElasticSearch中的路径存储为Polygon.现在我有一个圆(一个点和一个半径),我能够检查圆点与多边形是否相交(下面是我使用的代码). 问题:如何获得与圆相交的路线中的点? public Boolean isMatchingDoc(Long elasticDocId,Double latitude,Double longit
我已将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看起来很有希望,因为它允许查询交叉 – 它支持线和多边形.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读