如何从 ElasticSearch 中的形状中获取相交点

Posted

技术标签:

【中文标题】如何从 ElasticSearch 中的形状中获取相交点【英文标题】:How to get the intersecting points from shape in ElasticSearch 【发布时间】:2016-11-05 18:33:41 【问题描述】:

我在ElasticSearch 中存储了一条路线作为多边形。现在我有一个圆(一个点和一个半径),我能够检查圆点是否与多边形相交(下面是我使用的代码)。

问题:如何获得与圆相交的路线中的点?

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;

【问题讨论】:

因为你有一个多边形,所以你有一堆可以检查相交的线。您应该能够在网络搜索中找到很多关于如何做到这一点的方法(我会搜索“圆线交叉点”或“圆多边形交叉点”) @Thomas 我已经试过了。我不能去手动对所有这些点应用任何公式。我有很多数据。所以我不是在寻找一个开箱即用的解决方案。我检查了 ES API 并没有找到任何.... 我不太明白为什么这不可能。只需传入这些点并对其进行迭代,从 i 和 i + 1 构建一条线段并检查其是否相交。如果您有很多积分,性能可能会成为一个问题,但有一些选项可以加快速度,但这取决于具体情况。 @Thomas 每条路线包含 1000 - 15000 个点,最多可能有 10 条路线。当然,它会导致我遇到性能问题。这就是我正在寻找 ES API 的原因 可能没有直接的 API 可以做到这一点。不过,您可以尝试一些基于屏幕空间碰撞检测的方法。或创建近似层次结构(边界球体、边界框等)以缩小可能相交的线段。 【参考方案1】:

我想您知道使用 elasticsearch,您可以查询与给定圆相交的多边形吗?见https://www.elastic.co/guide/en/elasticsearch/guide/current/querying-geo-shapes.html

这可能对您没有帮助的原因有两个:

    您的路线不是多边形,而是线。 如果我没看错你的问题,你想知道交叉点的确切点。

Elasticsearch 可能无法方便地为您解决这个问题。如果您将所有线段分别存储而不是每条路线一个巨大的多边形中,则可能会解决。然后,每个线段都必须带有一个引用它所属的路由的属性。这种方法听起来可行吗?

无论如何,我建议您研究“空间数据库”的主题: 空间数据库针对几何空间中的索引和搜索进行了优化。众所周知的数据库,如 PostgreSQL 和 MongoDB,具有用于空间索引的插件/扩展。我不知道该推荐什么,但 MongoDB geospatial API 看起来很有希望,因为它允许查询交叉点 - 它支持线和多边形。

【讨论】:

即使它是一个多边形/线或其他什么,它只是一组 latlng 对吗?如果 ES 能够比较点,他们也应该能够检索它。我可以将其视为 API 的设计问题。从数据存储返回的真/假是无用的。

以上是关于如何从 ElasticSearch 中的形状中获取相交点的主要内容,如果未能解决你的问题,请参考以下文章

如何通过Elasticsearch 6.x中的动态或未知字段进行聚合

如何识别形状轮廓中的关节?

使用 Spark 中的复杂过滤从 elasticsearch 中获取 esJsonRDD

Elasticsearch & X-Pack:如何从嵌套文档中获取顶点/连接

如何从 Amplify - AppSync - ElasticSearch - DynamoDB Stack 中获取看不见的附近文档?

旋转形状时如何计算形状中的点