MongoDB 2dsphere 索引失败(几何形状错误?)

Posted

技术标签:

【中文标题】MongoDB 2dsphere 索引失败(几何形状错误?)【英文标题】:MongoDB 2dsphere index fails (malformed geometry?) 【发布时间】:2014-07-18 09:39:04 【问题描述】:

我目前正在尝试构建 2dsphere 索引,但创建似乎失败了。

索引创建失败的文档是有效的geojson(根据geojsonlint)。

据我所知,它遵守 MongoDB“多边形”规则。

我将不胜感激,因为我无法弄清楚索引创建似乎失败的原因。

提前致谢!

db.poly.ensureIndex(  loc: "2dsphere"  )

        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "ok" : 0,
        "errmsg" : "Can't extract geo keys from object, malformed geometry?:  _
id: 353, loc:  type: \"Polygon\", coordinates: [ [ [ 8.090732000000001, 53.6379
766 ], [ 8.050639500000001, 53.6250853 ], [ 8.036974600000001, 53.6286108 ], [ 7
.994035500000001, 53.6016978 ], [ 8.0120927, 53.59855020000001 ], [ 8.0102720000
00001, 53.5883803 ], [ 8.023379, 53.5867745 ], [ 8.0148004, 53.5832729 ], [ 8.02
6839500000001, 53.57895840000001 ], [ 8.0271685, 53.5727671 ], [ 8.0432450000000
01, 53.57190120000001 ], [ 8.0386477, 53.565241 ], [ 8.0192488, 53.5609644 ], [
8.030192100000001, 53.5508096 ], [ 8.037298, 53.5565769 ], [ 8.041402400000001,
53.55249540000001 ], [ 8.030647100000001, 53.53854200000001 ], [ 8.0381080000000
01, 53.5275022 ], [ 8.048501400000001, 53.5243656 ], [ 8.051459700000001, 53.509
912 ], [ 8.091510100000001, 53.50258460000001 ], [ 8.153839000000001, 53.5148059
0000001 ], [ 8.1708242, 53.53993010000001 ], [ 8.164240300000001, 53.5287913 ],
[ 8.1562255, 53.531339 ], [ 8.1700993, 53.54524050000001 ], [ 8.150740200000001,
 53.5596328 ], [ 8.1539377, 53.56452330000001 ], [ 8.1408203, 53.58015880000001
], [ 8.155694800000001, 53.5858101 ], [ 8.1496093, 53.60191990000001 ], [ 8.1234
503, 53.5984032 ], [ 8.090732000000001, 53.6379766 ] ] ]  ",
        "code" : 16755

【问题讨论】:

据我了解,您应该在loc.coordinates 上建立索引。但是为什么coordinates字段中有这么多嵌套数组呢? 您能分享您的架构和示例文档吗?这将有助于调试。 文档基本上只包含“loc”属性。所以架构在上面的错误信息中是可见的 仅作记录,从 csv 地理名称转储导入时,我遇到了坐标格式问题。需要将数字解析为浮点数。至于你的问题,也许你可以检查你的多边形是否相互交叉?这是无效的 有一个路口,但是因为不明显所以没看到! 【参考方案1】:

坐标中有一个交叉点,但是我通过geojsonlint.com看不到,因为它不明显!

MongoDB 不允许插入线相交的多边形。

【讨论】:

【参考方案2】:

如果您的集合中有多个文档,并且其中至少一个文档的“loc”字段为 NULL 或 EMPTY,则会发生此错误。

因此,请确保您没有任何“loc”字段为 NULL 或 EMPTY 的文档。

查询:db.poly.find("loc":$exists:true, $eq:"");

注意: 您需要将索引添加到“loc”字段,而不是“loc.coordinates”字段。

【讨论】:

【参考方案3】:

按照您的做法将索引应用于“loc”(GeoJSON 字段)。但是,请确保您的坐标按经度、纬度(不是纬度、经度)的顺序指定。

根据http://docs.mongodb.org/manual/applications/geospatial-indexes/#spherical 的文档:

使用此坐标轴将您的位置数据存储为 GeoJSON 对象 顺序:经度、纬度。坐标参考系 GeoJSON 使用 WGS84 数据。

另外,根据 http://geojson.org/geojson-spec.html#positions 的 GeoJSON 规范:

位置由数字数组表示。必须在 至少两个元素,并且可能更多。元素的顺序必须遵循 x, y, z 顺序(东、北、高度) 投影坐标参考系,或经度、纬度、 地理坐标参考系统中坐标的高度)。 允许任何数量的附加元素——解释和 附加元素的含义超出了本文的范围 规范。

【讨论】:

【参考方案4】:

因此,解决方案将只是在 loc.coordinates 而不是 loc 上构建索引

db.coor.ensureIndex("loc.coordinates": "2dsphere")

注意二维索引支持不同的格式,你可以在document找到例子。虽然loc 不是其中之一。

我不明白为什么你在那里有嵌套数组。

【讨论】:

据我了解,我需要在“loc”字段上创建索引。它是一个嵌套数组,因为根据 geojson 格式,这是一个有效的 geojson 对象。见mongodb polygon 这个答案不正确。您需要将索引放在 GeoJSON 对象上,而不是放在带有坐标的数组上。 深入了解docs.mongodb.com/v3.0/tutorial/build-a-2dsphere-index

以上是关于MongoDB 2dsphere 索引失败(几何形状错误?)的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB 创建具有用于空间查询的特征数组的 2dsphere 索引

Mongodb 复合 2dsphere 索引无法按预期工作

java中地理空间字段的2dsphere索引的Spring mongodb注释......?

MongoError:找不到任何特殊索引:2d(需要索引),2dsphere(需要索引)

2dsphere vs 2d index:哪个“更好”/更快?

MongoDB索引