找到指向其中的多边形

时间:2017-08-15 19:21:31

标签: elasticsearch geolocation location polygon geo

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

所以例如20分我应该连接到elasticsearch 20次(考虑rtt)

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

任何人都能帮助我找到更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

我认为更好的方法是使用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查询。在这里,我们为您已存储在geo_shape中的每个多边形定义polygon-index个查询:

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,其中包含一个percolate query

单个点的一个percolate查询将如下所示。这个查询基本上是这样说的:"找到包含给定点的所有多边形查询"。因此,您将获得一个匹配列表,其中每个匹配是一个查询,并将包含匹配的多边形(查询)的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]}}}}}
...

你会回到每个点,包含它的多边形。