【问题标题】:Query polygons $geowithin $box mongodb doesn't return anything查询多边形 $geowithin $box mongodb 不返回任何内容
【发布时间】:2017-07-13 08:01:52
【问题描述】:

伙计们,我试图通过边界框查询里面的所有多边形,但它只返回 0.. 它应该返回许多多边形!

或者,我尝试查询一个更大的边界框,但没有任何反应!

我的查询是:

{
 geometry: 
    { $geoWithin: 
        { $box:  
            [ [-73.995762,40.764826], [-73.934034,40.802038] ] 
        } 
    }                       
}

请注意,对于 Point 类型的几何图形,同样的查询返回有效结果

【问题讨论】:

    标签: mongodb geometry gis geospatial bounding-box


    【解决方案1】:

    通过边界框查询里面的所有多边形,但它只是返回0

    $geoWithin$box operator 仅支持基于grid coordinates 的文档,不支持GeoJSON 形状格式。

    对于 Point 类型的几何,同样的查询返回有效结果

    根据您的文档结构以及查询它们的方式,这可能被视为网格坐标,即{geometry: [<long>, <lat>]} 这可能不适用于您的多边形文档,因为GeoJSON Polygons 需要一个额外的数组包装器。即[[ [<long>, <lat>] ]] 使网格坐标格式无效。

    如果您的文档是 GeoJSON 格式,并且您想选择一个区域,您可以改用 $geometry

    db.places.find(
       {
         'geometry': {
           $geoWithin: {
              $geometry: {
                 type : "Polygon" ,
                 coordinates: [ [ [ 0, 0 ], [ 3, 6 ], [ 6, 1 ], [ 0, 0 ] ] ]
              }
           }
         }
       }
    )
    

    值得注意的是,MongoDB Compass 地理空间可视化目前 (v1.6) 尚不支持 GeoJSON。

    【讨论】:

    • Wan,它确实为点和多边形提供了对 GeoJSON 的支持。也许您看过较旧的文档?他们确实对数组进行了内包装,但它仍然可以正常工作,请查看我发布的解决方案。谢谢您的帮助。
    • 基于 MongoDB 手册 $box 为当前稳定的 v3.4 “当与 $box 运算符一起使用时,$geoWithin 基于网格坐标返回文档并且不查询 GeoJSON 形状”。请使用您的文档示例结构/架构更新您的帖子,以便其他人可以尝试复制您的问题。
    【解决方案2】:

    答案如下:

    $box 确实适用于 GeoJSON,但不适用于多边形!您需要使用 $box 生成几何图形。

    此外,它总是必须有起点和点,所以一个 4 点多边形将有 5 个坐标元组

    但它变得更棘手,它必须遵循右手定则(逆时针)。

    使用 $BOX 和点测试 GEOJSON

    我的查询:

    { 
      geometry: { 
        $geoWithin: { 
          $box: [ 
            [ -71.934034, 38.764826 ], 
            [ -75.995762, 43.802038 ] 
          ] 
        } 
      }
    }
    

    【讨论】:

    • 这不应该是公认的答案。这不仅与文档相矛盾(直到当前的 MongoDB v3.4),答案还暗示了一种未经证实的(逆时针方向)解决方法,以及无济于事的破损图像。
    • data.ny.gov - datasets = "Building Footprints" and "Selected Facilities and Program Sites" 你可以在这个问题上找到其余的信息。尝试复制它,也许我们可以深入了解解决方案,以便将其传递给可能需要它的人!我删除了正确的答案检查,直到我们找到它=)谢谢!
    • 感谢您使用工作图像更新屏幕截图。您的最后两个屏幕截图使用$geometry 而不是$box。正如上述答案中所建议的,您应该使用 $geometry 而不是 $box 来获取 GeoJSON 格式。 $box 不支持 GeoJSON,它只返回类型 Point,因为它与旧坐标的格式相似。如需将来参考,请在提问时另见guide: minimal, complete and verifiable example
    猜你喜欢
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    相关资源
    最近更新 更多