1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
|
t = db.geo_s2meridian;
t.drop();
t.ensureIndex({geo: "2dsphere"});
/*
* Test 1: check that intersection works on the meridian. We insert a line
* that crosses the meridian, and then run a geoIntersect with a line
* that runs along the meridian.
*/
meridianCrossingLine = {
geo: {
type: "LineString",
coordinates: [
[-178.0, 10.0],
[178.0, 10.0]]
}
};
t.insert(meridianCrossingLine);
assert(! db.getLastError());
lineAlongMeridian = {
type: "LineString",
coordinates: [
[180.0, 11.0],
[180.0, 9.0]
]
}
result = t.find({geo: {$geoIntersects: {$geometry: lineAlongMeridian}}});
assert.eq(result.count(), 1);
t.drop();
t.ensureIndex({geo: "2dsphere"});
/*
* Test 2: check that within work across the meridian. We insert points
* on the meridian, and immediately on either side, and confirm that a poly
* covering all of them returns them all.
*/
pointOnNegativeSideOfMeridian = {
geo: {
type: "Point",
coordinates: [-179.0, 1.0]
}
};
pointOnMeridian = {
geo: {
type: "Point",
coordinates: [180.0, 1.0]
}
};
pointOnPositiveSideOfMeridian = {
geo: {
type: "Point",
coordinates: [179.0, 1.0]
}
};
t.insert(pointOnMeridian);
t.insert(pointOnNegativeSideOfMeridian);
t.insert(pointOnPositiveSideOfMeridian);
meridianCrossingPoly = {
type: "Polygon",
coordinates: [
[[-178.0, 10.0], [178.0, 10.0], [178.0, -10.0], [-178.0, -10.0], [-178.0, 10.0]]
]
};
result = t.find({geo: {$geoWithin: {$geometry: meridianCrossingPoly}}});
assert.eq(result.count(), 3);
t.drop();
t.ensureIndex({geo: "2dsphere"});
/*
* Test 3: Check that near works around the meridian. Insert two points, one
* closer, but across the meridian, and confirm they both come back, and
* that the order is correct.
*/
pointOnNegativeSideOfMerid = {
name: "closer",
geo: {
type: "Point",
coordinates: [-179.0, 0.0]
}
};
pointOnPositiveSideOfMerid = {
name: "farther",
geo: {
type: "Point",
coordinates: [176.0, 0.0]
}
};
t.insert(pointOnNegativeSideOfMerid);
t.insert(pointOnPositiveSideOfMerid);
pointOnPositiveSideOfMeridian = {
type: "Point",
coordinates: [179.0, 0.0]
};
result = t.find({geo: {$geoNear: pointOnPositiveSideOfMeridian}});
assert.eq(result.count(), 2);
assert.eq(result[0].name, "closer");
assert.eq(result[1].name, "farther");
|