【发布时间】:2016-12-17 06:45:36
【问题描述】:
我将一些坐标传递给 mongo 进行地理搜索。如果坐标不相交(例如八字形),它可以正常工作。但是当两条线相交时,它会给出loop is not valid。有什么方法可以找到交叉点并将所有这些循环分开?
注意可能有很多。
编辑:我添加了示例查询和错误。请注意,我理解它为什么会发生,我只是想知道是否有一些已知的方法可以将这些循环分成单独的多边形(一些算法或在 Mongo 中)。
查询:
db.items.find({
"address.location": {
"$geoWithin": {
"$geometry": {
"type": "Polygon",
"coordinates": [[
[-97.209091, 49.905691],
[-97.206345, 49.918072],
[-97.178879, 49.919399],
[-97.165146, 49.907903],
[-97.164459, 49.892865],
[-97.180939, 49.889326],
[-97.197418, 49.895077],
[-97.200165, 49.902596],
[-97.203598, 49.919399],
[-97.216644, 49.928682],
[-97.244797, 49.927356],
[-97.255096, 49.913209],
[-97.209091, 49.905691]
]]
}
}
}
});
错误:
Error: error: {
"waitedMS" : NumberLong(0),
"ok" : 0,
"errmsg" : "Loop is not valid: [
[ -97.209091, 49.905691 ]
[ -97.206345, 49.918072 ],
[ -97.17887899999999, 49.919399 ],
[ -97.16514599999999, 49.907903 ],
[ -97.16445899999999, 49.892865 ],
[ -97.180939, 49.889326 ],
[ -97.197418, 49.895077 ],
[ -97.200165, 49.902596 ],
[ -97.203598, 49.919399 ],
[ -97.216644, 49.928682 ],
[ -97.24479700000001, 49.927356 ],
[ -97.25509599999999, 49.913209 ],
[ -97.209091, 49.905691 ]
]
Edges 1 and 7 cross.
Edge locations in degrees: [-97.2063450, 49.9180720]-[-97.1788790, 49.9193990]
and [-97.2001650, 49.9025960]-[-97.2035980, 49.9193990]
",
"code" : 2
}
更新
我添加了一个蛮力方法的图像。
- 基本上它是在交叉点上进行预测。
- 如果它找到一个,它会交换这些点,以便它保持在一个循环内。
- 它会在某些队列中添加截止点作为“起点”。
- 当向前看并找到它自己的起点时,我们就有了一个循环。
- 然后继续遍历“起点”队列,直到它为空。
- 新的多边形集应该包含所有单独的循环(理论上)。
这有一些问题,通过所有这些循环可能会变得非常昂贵。假设最多 50 个点将是大约 1275 次操作。
同时处理 0/180 度坐标上的环绕可能是一个挑战。
无论如何,我不想花一整天的时间在这上面,我什至可以处理一个不处理环绕条件的解决方案。
希望我已经可以在某个地方找到一个很好的算法(可能有一些花哨的技术术语)。
如果有一种比蛮力前瞻更有效的方法,那就太好了。
【问题讨论】:
-
一些代码示例将有助于解决此问题。
-
你说你明白为什么会发生。 (是不是因为不是有效的多边形?)您能否将此信息添加到问题中。
-
@PawelDubiel 是的,它是一个无效的多边形,因为它的形状是 8 字形。所以有两条线相交。问题是如何处理。
-
我不知道 mongodb 是否真的是您尝试存档的好工具。我会考虑 postgis,因为它具有诸如 postgis.refractions.net/docs/ST_Polygonize.html 之类的有用功能
-
你想用不同孔共享的边缘做什么? see closed jira