问题
I'm currently trying to build an 2dsphere index, but the creation seems to fail.
The document on which the index creation fails is valid geojson (according to geojsonlint).
Also as far as I can see it obeys the MongoDB "Polygon" rules.
I would appreciate any help, since I can't figure out why the index creation seems to fail.
Thanks in advance!
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
}
回答1:
Apply the index to "loc" (the GeoJSON field) as you have done. However, make sure that your coordinates are specified in the order of Longitude, Latitude (not Latitude, Longitude).
Per the documentation at http://docs.mongodb.org/manual/applications/geospatial-indexes/#spherical:
Store your location data as GeoJSON objects with this coordinate-axis order: longitude, latitude. The coordinate reference system for GeoJSON uses the WGS84 datum.
Also, per the GeoJSON spec at http://geojson.org/geojson-spec.html#positions:
A position is represented by an array of numbers. There must be at least two elements, and may be more. The order of elements must follow x, y, z order (easting, northing, altitude for coordinates in a projected coordinate reference system, or longitude, latitude, altitude for coordinates in a geographic coordinate reference system). Any number of additional elements are allowed -- interpretation and meaning of additional elements is beyond the scope of this specification.
回答2:
There was an intersection in the coordinates, but I couldn't see it through geojsonlint.com because it wasn't obvious!
MongoDB doesn't allow inserting a polygon which lines would intersect.
回答3:
This error occur if you have multiple documents in your collection and at least one document among them is having the 'loc' field as NULL OR EMPTY.
So make sure you don't have any document where 'loc' field is NULL OR EMPTY.
Query: db.poly.find("loc":{$exists:true, $eq:""});
Note: You need to add the Index to 'loc' field, not for 'loc.coordinates' field.
回答4:
So the solution would be simply building index on loc.coordinates
instead of loc
db.coor.ensureIndex({"loc.coordinates": "2dsphere"})
Note 2d index supports different format, which you can find examples in the document. While loc
is not one of them.
I don't understand why you have nested array there though.
来源:https://stackoverflow.com/questions/23923909/mongodb-2dsphere-index-fails-malformed-geometry