查找指向内部的多边形

Find polygons which points within

我有大约 500 个固定多边形,我希望能够检查这些多边形中是否有很多点。 也许有些点在许多这些多边形中,有些根本不在任何多边形中。 我知道 elasticsearch geo_shape 可能会帮助我,但据我所知我只能, 查询一个点以了解它在哪个多边形中。

例如,对于 20 个点,我应该连接到 elasticsearch 20 次(考虑 rtt)

如果我在我的进程中加载​​所有多边形并迭代点和多边形,则应该有一个嵌套循环,计数为 20 * 500 在每个循环中我应该检测该点是否在多边形中 所以我认为这个脚本的执行速度和内存量都不好。

任何人都可以帮助我提供更好的解决方案吗?

我认为更好的方法是使用 percolator mapping type。首先,创建一个索引,您将在其中存储 geo_shape 查询(在 queries 类型中)。您还需要定义点的映射(在 points 类型中)以便 ES 知道它在查询什么:

PUT /my-index
{
    "mappings": {
        "points": {
            "properties": {
                "point": {
                    "type": "geo_shape"
                }
            }
        },
        "queries": {
            "properties": {
                "query": {
                    "type": "percolator"
                }
            }
        }
    }
}

然后,您可以为每个已编入索引的多边形编入一个 geo_shape 查询。在这里,我们为您已经存储在 polygon-index:

中的每个多边形定义一个 geo_shape 查询
PUT /my-index/queries/query-id-for-polygon-id
{
    "query" : {
            "geo_shape": {
                "location": {
                    "indexed_shape": {
                        "index": "polygon-index",
                        "type": "polygon-type",
                        "id": "polygon-id",
                        "path": "polygon-field"
                    }
                }
            }
    }
}

最后,您可以为每个要检查的点发出一个 msearch query containing one percolate query

单个点的渗透查询如下所示。这个查询基本上是说:"find me all the polygon queries that contain the given point"。结果,您将获得一个命中列表,其中每个命中都是一个查询,并将包含匹配的多边形(查询)的 ID。

POST /my-index/_search
{
    "query" : {
        "percolate" : {
            "field" : "query",
            "document_type" : "points",
            "document" : {
                "point" : {
                    "type" : "point",
                    "coordinates" : [-77.03653, 38.897676]
                }
            }
        }
    }
}

所以现在您需要按照以下格式为每个要检查的点创建一个:

POST /my-index/_search
{}
{"query": {"percolate": {"field": "query", "document_type" : "points", "document" : {"point" : {"type" : "point","coordinates" : [-77.03653, 38.897676]}}}}}
{}
{"query": {"percolate": {"field": "query", "document_type" : "points", "document" : {"point" : {"type" : "point","coordinates" : [-77.03653, 38.897676]}}}}}
{}
{"query": {"percolate": {"field": "query", "document_type" : "points", "document" : {"point" : {"type" : "point","coordinates" : [-77.03653, 38.897676]}}}}}
{}
{"query": {"percolate": {"field": "query", "document_type" : "points", "document" : {"point" : {"type" : "point","coordinates" : [-77.03653, 38.897676]}}}}}
...

您将返回每个点,即包含它的多边形。