gpt4 book ai didi

PHP/Mongo geoJSON 循环无效

转载 作者:IT老高 更新时间:2023-10-28 11:07:08 25 4
gpt4 key购买 nike

我将一些坐标传递给 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
}

更新

我添加了一个蛮力方法的图像。

Polygon Slicing

  • 基本上它是在交叉点上进行预测。
  • 如果它找到一个,它会交换这些点,以便它保持在一个循环内。
  • 它会在某个队列中添加截止点作为“起点”。
  • 当向前看并找到它自己的起点时,我们就有了一个循环。
  • 然后继续遍历“起点”队列,直到它为空。
  • 新的多边形集应该包含所有单独的循环(理论上)。

这有一些问题,通过所有这些循环可能会变得非常昂贵。假设最多 50 个点将是大约 1275 次操作。

同时处理 0/180 度坐标上的环绕可能是一个挑战。

无论如何,我不想花一整天的时间在这上面,我什至可以处理一个不处理环绕条件的解决方案。

希望我已经可以在某个地方找到一个很好的算法(可能有一些花哨的技术术语)。

如果有一种比蛮力前瞻更有效的方法,那就太好了。

最佳答案

这是因为您的坐标相同,才会在多边形形状中产生异常:[-97.1788790, 49.9193990] 和 [-97.2035980, 49.9193990]。在您的代码中删除或更改任何重复的坐标,

"coordinates": [[
[-97.209091, 49.905691],
[-97.206345, 49.918072],
[-97.178879, 49.919399], // this line
[-97.165146, 49.907903],
[-97.164459, 49.892865],
[-97.180939, 49.889326],
[-97.197418, 49.895077],
[-97.200165, 49.902596],
[-97.203598, 49.919399], // and this one
[-97.216644, 49.928682],
[-97.244797, 49.927356],
[-97.255096, 49.913209],
[-97.209091, 49.905691]
]]

关于PHP/Mongo geoJSON 循环无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38880927/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com