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

7
我已经将一条路线存储在ElasticSearch中,作为一个多边形。现在我有一个圆(一个点和一个半径),我能够检查圆点是否与多边形相交(下面是我使用的代码)。
问题:如何获取与圆相交的路线上的点?
请看下图:Route and Circle
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;
}

1
由于您有一个多边形,因此您有一堆可以检查交叉的线。您应该能够在网络搜索中找到很多关于如何做到这一点的方法(我会搜索“圆线相交”或“圆多边形相交”)。 - Thomas
@Thomas 我已经尝试过那些了。我不能手动地在所有这些点上应用任何公式。我有很多数据。所以我不想要一个现成的解决方案。我检查了ES API,但没有找到任何... - Viswanath Lekshmanan
我不太明白为什么这不可能。只需传入点并迭代它们,从i和i + 1构建线段并检查其是否相交即可。如果有很多点,则性能可能是一个问题,但有一些加速选项,适用哪个取决于情况。 - Thomas
你能否提供您在ElasticSearch中存储的数据的代码以及如何使用它来在容器上绘制,这样我才能给你一个更直接的答案? - Dan
我将其存储为多边形(一个 LatLng 的数组)。那里没有定制数据模式。 - Viswanath Lekshmanan
显示剩余2条评论
1个回答

0

我猜你已经知道了,使用elasticsearch,你可以查询与给定圆相交的多边形?请参见https://www.elastic.co/guide/en/elasticsearch/guide/current/querying-geo-shapes.html

这可能无法帮助你的原因有两个:

  1. 你的路线不是多边形,而是线。
  2. 如果我正确理解你的问题,你想知道交点的确切位置。

对于Elasticsearch来说,方便地解决这个问题可能是不可能的。如果你将所有的线段分别存储而不是放在一个巨大的多边形中,可能会解决这个问题。然后每个线段都必须带有一个属性,指向它所属的路线。这种方法听起来可行吗?

无论如何,我建议您研究“空间数据库”这个主题: 空间数据库针对几何空间进行索引和搜索优化。著名的数据库如PostgreSQL和MongoDB都具有用于空间索引的插件/扩展。我不确定该推荐什么,但例如MongoDB地理空间API看起来很有前途,因为它允许查询交集 - 并且它支持线条以及多边形。

无论是多边形、线条还是其他什么,它们都只是一组经纬度对,对吧?如果ES能够比较这些点,那么他们也应该能够检索它。我认为这是API设计问题。从数据存储返回的true/false毫无用处。 - Viswanath Lekshmanan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接