查找其中点的多边形

Posted

技术标签:

【中文标题】查找其中点的多边形【英文标题】:Find polygons which points within 【发布时间】:2018-01-23 19:09:11 【问题描述】:

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

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

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

任何机构都可以帮助我找到更好的解决方案吗?

【问题讨论】:

我认为更好的方法是使用 percolator 映射类型并为每个多边形存储一个 geo_shape 查询。接下来,您可以针对要检查的每个点发出一个包含一个 percolate 查询的单个 msearch 查询。您将返回每个点,包含它的多边形。 直到现在我对 percolate 一无所知,感谢您的评论,我会尝试阅读更多相关信息。 我继续向您提供了解决方案的快速提示。 【参考方案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 查询。在这里,我们为您已经存储在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,其中包含一个 percolate query。

单个点的渗透查询看起来像这样。这个查询基本上是说:“找到我所有包含给定点的多边形查询”。结果,您将获得一个命中列表,其中每个命中都是一个查询,并将包含匹配的多边形(查询)的 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]
...

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

【讨论】:

以上是关于查找其中点的多边形的主要内容,如果未能解决你的问题,请参考以下文章

使用shapefile在Python中查找点的封闭多边形[重复]

用于查找从点到多边形的最小距离的 Javascript 代码(由 html 区域定义)

查找与指定方向的空间点的最近距离

在 R(邻居)中查找相邻的多边形

Gym 101873G - Water Testing - [皮克定理]

提高内点的几何多边形距离