coalmee
coalmee

Reputation: 1536

MongoDB 2dsphere index fails (malformed geometry?)

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
}

Upvotes: 7

Views: 5428

Answers (4)

coalmee
coalmee

Reputation: 1536

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.

Upvotes: 2

Mahan
Mahan

Reputation: 441

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.

Upvotes: 0

philidem
philidem

Reputation: 329

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.

Upvotes: 2

yaoxing
yaoxing

Reputation: 4183

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.

Upvotes: -2

Related Questions