我有一个MongoDB数据库,其中有一个名为/*
|--------------------------------------------------------------------------
| Index File
|--------------------------------------------------------------------------
|
| Typically this will be your index.php file, unless you've renamed it to
| something else. If you are using mod_rewrite to remove the page set this
| variable so that it is blank.
|
*/
$config['index_page'] = 'index.php';
的集合。该集合中包含文档,其中包含边界多边形的地理空间数据。我在我的应用程序中使用C#MongoDB驱动程序。我注意到它没有查找具有某些空间查询的文档,尽管它适用于大多数文档。我删除了除了一个违规文档之外的集合,我试图通过直接执行查询来找到它。
我的文档如下:
fooCollection
我在该集合上也有这个索引:
{
"_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]]
}}}})
如果你绘制这三个几何图形,我真的不明白为什么一个会工作而不是另一个。
是否有人能够解释此行为?
编辑:我还单独测试了这些点,而不是使用LineStrings。唯一受欢迎的是db.getCollection('fooCollection').find( {
"polygon": {
$geoIntersects: {
$geometry: {
type: "LineString",
coordinates: [[27.7706902, -26.1091189],[28.0423, -26.19793]]
}}}})
。我确实需要LineStrings - 即使只有边与多边形相交并且没有任何点位于
您可以看到geojson here或者您可以通过将以下行粘贴到http://geojson.io/来自己绘制三个几何图形:
[24.7698287, -28.7353533]
答案 0 :(得分:4)
有人能够解释这种行为吗?
这是因为地球不平坦,而是非常球形(弯曲)。地球表面不能在没有失真的平面上表示。所以这意味着每个地图投影都会以某种方式扭曲地球。另请参阅Map Projections
MongoDB 2dsphere index,支持在地球球体上计算几何的查询。
当你在http://geojson.io上映射坐标时,它并没有考虑到地球的球形特性。较短的LineString显示在" square"多边形。
如果您在https://geodndmap.mongodb.com上映射GeoJSON几何图形,考虑到球面扭曲的事实,您将在下面看到:
较短的LineString实际上在" square"之外。多边形。这就是执行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]]}]}
PS:要使用geodndmap.mongodb.com,请将GeoJSON拖放到地图上,作为文件或编辑程序中的文本。