查找其中点的多边形
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 区域定义)