查找指向内部的多边形
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]}}}}}
...
您将返回每个点,即包含它的多边形。
我有大约 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]}}}}}
...
您将返回每个点,即包含它的多边形。