无法使用 MongoDB 的 $geoIntersect 将多边形与其包含的点相匹配
Unable to use MongoDB's $geoIntersect to match a Polygon to a Point it contains
我已经将一组 geoJSON 多边形导入到我的 mongoDB 集合中,这些多边形等同于宾夕法尼亚联邦的立法选区。此数据来自宾夕法尼亚州立大学网站上的 geoJSON file,并且不同的工具确实从文件中正确提取,这告诉我原始数据是有效的。
我通过将数据加载到数组中并遍历每个条目并填充 mongoosejs 模式中相应的 geometry 字段来导入它。一个地区的架构如下所示:
const polygonSchema = new Schema({
type: {
type: String,
enum: ['Polygon'],
required: true
},
coordinates: {
type: [[[Number]]],
required: true
}
});
var districtSchema = new Schema({
jurisdiction: {type: String, enum:['state', 'us']},
chamber: {type: String, enum: ['house', 'senate']},
districtNumber: {type: Number},
contact: {
"firstName": String,
"lastName": String,
"party": String,
"url": String,
},
geometry: {type: polygonSchema, index: '2dsphere'},
deleted: {type: Boolean, default: false}
});
一个示例条目看起来像这样(多边形包含大量点,所以我截断了它)
{
"_id": "602dc87f9f8326e4e5825b70",
"chamber": "house",
"districtNumber": 5,
"jurisdiction": "us",
"__v": 0,
"contact": {
"firstName": "Mary Gay",
"lastName": "Scanlon",
"party": "D",
"url": "https://scanlon.house.gov"
},
"geometry": {
"coordinates": [
[
[
-75.59557557627258,
39.83744617888617
],
[
-75.5965303118867,
39.8380378976056
],
[
-75.59689506526837,
39.8383438227424
],
[
-75.59720859368865,
39.83857630244814
],
[
-75.59754671724104,
39.83897169444833
],
[
-75.59780380953957,
39.83936864305231
]
]
],
"type": "Polygon"
}
}
为了测试数据,我试图找到包含特定坐标对的 District。但是,当我知道这是一组有效的坐标时,我没有得到任何结果。
这是我 运行 使用 mongoose 的测试查询;它没有找到匹配项并且 return 没有错误,但它应该 return 上面抽样的地区:
models.district.findOne(
{"geometry": {
"$geoIntersects": { "$geometry": { "type": "Point", "coordinates": [39.948164,-75.339984] }
}
}
}).exec((err, result) => console.log("Coordinate test", err,result));
有趣的是,我还使用了 mongoDB 在 their geospatial tutorial 中使用的演示数据库来处理查询。在结构上,坐标似乎位于同一位置;我能发现的唯一区别是我的多边形有更多的点。
这是一个 RTFM 与疲劳引起的监督混合的案例。当我写下我的测试坐标时,我在查询中手写了它们,并且没有注意到 geoJSON 版本中的顺序,我假设顺序是纬度、经度。结果是 spec has them inverted.
当我反转我的测试坐标时,查询按我预期的方式工作。
我已经将一组 geoJSON 多边形导入到我的 mongoDB 集合中,这些多边形等同于宾夕法尼亚联邦的立法选区。此数据来自宾夕法尼亚州立大学网站上的 geoJSON file,并且不同的工具确实从文件中正确提取,这告诉我原始数据是有效的。
我通过将数据加载到数组中并遍历每个条目并填充 mongoosejs 模式中相应的 geometry 字段来导入它。一个地区的架构如下所示:
const polygonSchema = new Schema({
type: {
type: String,
enum: ['Polygon'],
required: true
},
coordinates: {
type: [[[Number]]],
required: true
}
});
var districtSchema = new Schema({
jurisdiction: {type: String, enum:['state', 'us']},
chamber: {type: String, enum: ['house', 'senate']},
districtNumber: {type: Number},
contact: {
"firstName": String,
"lastName": String,
"party": String,
"url": String,
},
geometry: {type: polygonSchema, index: '2dsphere'},
deleted: {type: Boolean, default: false}
});
一个示例条目看起来像这样(多边形包含大量点,所以我截断了它)
{
"_id": "602dc87f9f8326e4e5825b70",
"chamber": "house",
"districtNumber": 5,
"jurisdiction": "us",
"__v": 0,
"contact": {
"firstName": "Mary Gay",
"lastName": "Scanlon",
"party": "D",
"url": "https://scanlon.house.gov"
},
"geometry": {
"coordinates": [
[
[
-75.59557557627258,
39.83744617888617
],
[
-75.5965303118867,
39.8380378976056
],
[
-75.59689506526837,
39.8383438227424
],
[
-75.59720859368865,
39.83857630244814
],
[
-75.59754671724104,
39.83897169444833
],
[
-75.59780380953957,
39.83936864305231
]
]
],
"type": "Polygon"
}
}
为了测试数据,我试图找到包含特定坐标对的 District。但是,当我知道这是一组有效的坐标时,我没有得到任何结果。
这是我 运行 使用 mongoose 的测试查询;它没有找到匹配项并且 return 没有错误,但它应该 return 上面抽样的地区:
models.district.findOne(
{"geometry": {
"$geoIntersects": { "$geometry": { "type": "Point", "coordinates": [39.948164,-75.339984] }
}
}
}).exec((err, result) => console.log("Coordinate test", err,result));
有趣的是,我还使用了 mongoDB 在 their geospatial tutorial 中使用的演示数据库来处理查询。在结构上,坐标似乎位于同一位置;我能发现的唯一区别是我的多边形有更多的点。
这是一个 RTFM 与疲劳引起的监督混合的案例。当我写下我的测试坐标时,我在查询中手写了它们,并且没有注意到 geoJSON 版本中的顺序,我假设顺序是纬度、经度。结果是 spec has them inverted.
当我反转我的测试坐标时,查询按我预期的方式工作。