gpt4 book ai didi

c# - MongoDB $geoIntersects 没有在多边形中找到一条完全包含的线,但找到了另一条

转载 作者:IT老高 更新时间:2023-10-28 13:16:24 25 4
gpt4 key购买 nike

我有一个 MongoDB 数据库,其中包含一个名为 fooCollection 的集合。该集合中包含以边界多边形方式包含地理空间数据的文档。我在我的应用程序中使用 C# MongoDB 驱动程序。我注意到它没有找到具有某些空间查询的文档,尽管它适用于大多数文档。我清空了集合,除了一个有问题的文档,我试图通过直接执行查询来找到它。

我的文档如下所示:

{
"_id" : UUID("12345678-62d9-4024-86dc-123456789012"),
"polygon" : {
"type" : "Polygon",
"coordinates" : [ [
[ 18.414846, -33.9699577 ],
[ 18.414846, -26.0991189 ],
[ 31.0330578, -26.0991189 ],
[ 31.0330578, -33.9699577 ],
[ 18.414846, -33.9699577 ]
] ]
},
"foo": "bar"
}

我在那个集合上也有这个索引:

[
1,
{
"polygon" : "2dsphere"
},
"polygon_2dsphere",
"data.fooCollection",
3
]

以下查询正确返回此文档:

db.getCollection('fooCollection').find( { 
"polygon": {
$geoIntersects: {
$geometry: {
type: "LineString",
coordinates: [[24.7698287, -28.7353533],[28.0423, -26.19793]]
}}}})

但是,此查询不会:

db.getCollection('fooCollection').find( { 
"polygon": {
$geoIntersects: {
$geometry: {
type: "LineString",
coordinates: [[27.7706902, -26.1091189],[28.0423, -26.19793]]
}}}})

如果您绘制这三个几何图形,我真的不明白为什么一个会起作用,而另一个不起作用。

  • 两条线都完全位于多边形内
  • 工作线更长
  • 工作线的方位角在 0° 到 90° 之间,另一个在 90° 到 180° 之间。

有人能解释这种行为吗?

编辑:我还单独测试了这些点,而不是使用 LineStrings。唯一成功的是 [24.7698287, -28.7353533]。我确实需要 LineStrings - 即使只有边缘与多边形相交并且没有点位于其中,查询也应该是一个命中

您可以查看geojson here 或者您可以通过将以下行粘贴到http://geojson.io/ 中自己绘制三个几何图形:

{"type":"GeometryCollection","geometries":[{"type":"Polygon","coordinates":[[[18.414846,-33.9699577],[18.414846,-26.0991189],[31.0330578,-26.0991189],[31.0330578,-33.9699577],[18.414846,-33.9699577]]]},{"type":"LineString","coordinates":[[27.7706902,-26.1091189],[28.0423,-26.19793]]},{"type":"LineString","coordinates":[[24.7698287,-28.7353533],[28.0423,-26.19793]]}]}

最佳答案

Is anyone able to explain this behaviour?

这是因为地球不是平的,而是相当球形(弯曲的)。地球表面无法在没有失真的情况下在平面上表示。所以这意味着每个 map 投影都会以某种方式扭曲地球。另见 Map Projections

MongoDB 2dsphere index ,支持计算类地球体上的几何形状的查询。

当您将坐标映射到 http://geojson.io 时,它没有考虑地球的球形性质。较短的 LineString 显示在“方形”多边形内。

geojson.io

如果您将 GeoJSON 几何映射到 https://geodndmap.mongodb.com考虑到存在球面失真的事实,您将在下面看到:

geodndmap.mongodb.com

较短的 LineString 实际上在“方形”多边形之外。这就是执行 MongoDB 2dsphere 索引/查询的内容。

失真效果的影响随着投影面积的延长/更大而增加。

例子:

{"type":"GeometryCollection","geometries":[
{"type":"Polygon","coordinates":[[[18.414846,-33.9699577],[18.414846,-26.0991189],[31.0330578,-26.0991189],[31.0330578,-33.9699577],[18.414846,-33.9699577]]]},
{"type":"LineString","coordinates":[[24.7698287,-28.7353533],[88.0423,-26.19793]]}]}

geojson.io

geodndmap.mongodb.com

PS:要使用 geodndmap.mongodb.com,请将 GeoJSON 作为文件或编辑程序中的文本拖放到 map 上。

关于c# - MongoDB $geoIntersects 没有在多边形中找到一条完全包含的线,但找到了另一条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41697055/

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