- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试使用 mongoDb 的 $geoNear 聚合运算符以下列方式计算用户与当前位置的距离:
'$geoNear': {
near: currentLocation,
distanceField: 'distance',
spherical: true,
}
currentLocation 是这样的:
{ "type" : "Point", "coordinates" : [ -122.1575745, 37.4457966 ] }
我的收藏属于以下类型(使用 Mongoose ):
users = [{
....
location : { // GeoJSON Point or I think it is ;)
type: {
type: String
},
coordinates: []
}
....
}]
我正在使用索引(同样是 mongoose 的语法):
userSchema.index({
location: '2dsphere'
});
现在我面临的问题是,如果我如上所述使用 currentLocation 进行查询(以 GeoJSON 的形式),我会得到奇怪的距离(非常大的数字),但是如果我使用 currentLocation.coordinates,即使用旧坐标对( [-122.1575745, 37.4457966]), 我得到了正确的结果。但是mongoDb docs for geoNear明确表示我们可以使用 GeoJSON 点或旧坐标对 进行查询。
我很想知道 GeoJSON 点和传统坐标对之间到底有什么区别?
例如集合:
{ "_id" : ObjectId("5277679914c6d8f00b000003"), "location" : { "type" : "Point", "coordinates" : [ 106.6202887, -6.1293536 ] } }
{ "_id" : ObjectId("5277810148219d011c000003"), "location" : { "type" : "Point", "coordinates" : [ 106.6202887, -6.1293536 ] } }
{ "_id" : ObjectId("5281c7ba2dfd7bdc64000003"), "location" : { "type" : "Point", "coordinates" : [ -86.9248483, 33.4480108 ] } }
{ "_id" : ObjectId("5281c8b82dfd7bdc64000004"), "location" : { "type" : "Point", "coordinates" : [ -74.0087126, 40.7136487 ] } }
{ "_id" : ObjectId("5281c9782dfd7bdc64000005"), "location" : { "type" : "Point", "coordinates" : [ -122.1575745, 37.4457966 ] } }
错误的结果:
[{"location":{"type":"Point","coordinates":[-122.1575745,37.4457966]},"dis":13.69288259318155},
{"location":{"type":"Point","coordinates":[-86.9248483,33.4480108]},"dis":12697164592.388557},
{"location":{"type":"Point","coordinates":[-74.0087126,40.7136487]},"dis":16328789117.58145},
{"location":{"type":"Point","coordinates":[106.6202887,-6.1293536]},"dis":55446284682.14049},
{"location":{"type":"Point","coordinates":[106.6202887,-6.1293536]},"dis":55446284682.14049}]
最佳答案
让我们创建一些示例文档和地理空间索引:
> db.foo.insert({name: "Warsaw", location: {"type" : "Point", "coordinates" : [21.016667, 52.233333]}})
> db.foo.insert({name: "Stockholm", location: {"type" : "Point", "coordinates" : [18.068611, 59.329444]}})
> db.foo.ensureIndex({"location": "2dsphere"})
华沙 PL 和斯德哥尔摩 SE 之间的距离大约为 810 公里,所以让我们检查一下它是否按预期工作。首先我们可以获取斯德哥尔摩的文档。
> Stockholm = db.foo.findOne({name: "Stockholm"})
现在我们可以使用 geoNear 运行查询:
> db.runCommand({ geoNear: 'foo', near: Stockholm.location.coordinates, spherical: true })
{
"ns" : "test.foo",
"results" : [
{
"dis" : 6.558558954334308e-10,
"obj" : {
"_id" : ObjectId("52876ab0b12c6fc62f5d9311"),
"name" : "Stockholm",
"location" : {
"type" : "Point",
"coordinates" : [
18.068611,
59.329444
]
}
}
},
{
"dis" : 0.12715355275490586,
"obj" : {
"_id" : ObjectId("5287697eb12c6fc62f5d9310"),
"name" : "Warsaw",
"location" : {
"type" : "Point",
"coordinates" : [
21.016667,
52.233333
]
}
}
}
],
"stats" : {
"time" : 9,
"nscanned" : 3,
"avgDistance" : 0.06357677670538088,
"maxDistance" : 0.12715355275490586
},
"ok" : 1
}
斯德哥尔摩与斯德哥尔摩之间的距离如预期接近 0
。斯德哥尔摩和华沙之间的距离是0.12715355275490586
。当您使用遗留坐标对运行查询时,您会得到以弧度为单位的结果,因此我们必须将该值乘以地球半径:
> 0.12715355275490586 * 6371.0
810.0952846015052
到目前为止一切顺利。让我们检查一下我们是否使用 geojson 作为查询得到了类似的结果。
> db.runCommand({ geoNear: 'foo', near: Stockholm.location, spherical: true })
{
"ns" : "test.foo",
"results" : [
{
"dis" : 0.004183114486663965,
"obj" : {
"_id" : ObjectId("52876ab0b12c6fc62f5d9311"),
"name" : "Stockholm",
"location" : {
"type" : "Point",
"coordinates" : [
18.068611,
59.329444
]
}
}
},
{
"dis" : 810998.0748260651,
"obj" : {
"_id" : ObjectId("5287697eb12c6fc62f5d9310"),
"name" : "Warsaw",
"location" : {
"type" : "Point",
"coordinates" : [
21.016667,
52.233333
]
}
}
}
],
"stats" : {
"time" : 4,
"nscanned" : 3,
"avgDistance" : 405499.0395045898,
"maxDistance" : 810998.0748260651
},
"ok" : 1
}
斯德哥尔摩与斯德哥尔摩之间的距离再次接近 0
。斯德哥尔摩和华沙之间的距离是 810998.0748260651。当您使用 GeoJSON 运行 geoNear 查询时,距离以米为单位计算。 810998.0748260651 大约等于 810 公里,所以这里没有什么奇怪的。
> 810998.0748260651 / 1000
810.9980748260651
两种解决方案之间的差异可能更小,但它只是一个 FP 算法。
> Math.abs(810.0952846015052 - 810.9980748260651)
0.902790224559908
当您将 find
命令与 $near
运算符一起使用时。当您在遗留坐标对上创建简单的 2d
索引时,可以使用 {$near: Stockholm.location.coordinates}
和 {$near: {$ 查询它几何:Stockholm.location}
。如果你有 2dsperhical
只有 {$near: {$geometry: Stockholm.location}
会起作用。
关于node.js - 就 mongoDb 而言,GeoJSON 和 Legacy 坐标对有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20016269/
我用运行 Node node --debug app OR node --debug-brk app 它有反应 debugger listening on port 5858 Express serv
这个问题在这里已经有了答案: What is the difference between (int *i) and (int* i) in context of both C and C++? [
我有一个应用程序,它通过消息队列将数据库写入命令分派(dispatch)给工作人员(数量非常大),因此无法保证它们的接收顺序。 我有两个 Node ,例如“Account”和“Media”。在此假设的
有没有办法在调用 ts-node 时将选项传递给 Node ?我正在尝试在 Node 中使用一个实验性功能,如果它能与 ts-node 一起使用,那就太好了。 这就是我目前正在做的事情: ts-nod
我有一个容器化的Node应用程序,它在DigitalOcean服务器上运行。当我更新服务器上的应用程序时,该应用程序必须关闭一小段时间。为了能够更新应用程序并避免停机,我目前正在阅读零停机时间部署/蓝
我正在编写一个 Node.js 应用程序。我正在使用 request 和 Cheerio 加载一组 URL 并获取该网站的大量信息,现在假设我想要获取的只是标题: var urls = {"url_1
如果不弹出以下错误,我无法安装任何 Node.js 模块。错误代码引用package.json文件。如果知道为什么会发生这种情况,我们将不胜感激。 最佳答案 这些不是错误,它们只是警告。一切都应该如此
如果我运行(从我的项目目录中): supervisor javascripts/index.js 我得到:/usr/bin/env: Node :没有这样的文件或目录 如果我运行: node java
我已遵循使用 Node-Inspector 的所有步骤 但是当我打开应用程序时,我在控制台上看不到任何脚本或日志。 我的应用程序在端口 4000 上运行。我认为唯一可能发生冲突的是端口 8080 上的
我在android中使用rxjava2,有时会遇到这样的问题: Observable.fromArray( // maybe a list about photo url in SD
我目前正在使用 Node 光纤来编写同步服务器端代码。我主要通过 try-catch block 进行错误处理,但外部库或其他小部分异步代码中总是有可能发生错误。我正在考虑使用新的域功能来尝试将这些错
看起来node-debug是node-inspector周围的一个shell?分别什么时候应该使用? 最佳答案 如果您安装node-debug,您只能访问node-debug命令。 如果您安装node
我目前正在代理后面工作,该代理不允许我执行此命令的 HTTP GET 请求阶段: Node node-sass/scripts/build.js 请求阶段: gyp http GET https://
听说node js可以用在服务端。我以前用过jsp。 jsp页面内部的java代码对客户端是不可见的。如果 Node js 只是 javascript,那么它如何对客户端不可见? 最佳答案 首先,No
我正在为 Node native 插件从 node-waf 构建迁移到 node-gyp 构建系统。 node-gyp 说它支持多个目标版本,但我在使用 node-gyp 时找不到如何指定目标 Nod
给定一个 $node ,我正在尝试在以下两种输出该 $node 的方式之间做出决定。 要么 $output = theme('node', $node); 或 node_build_content($
如果package.json中的窗口A打开一个新窗口B,node-main如何访问它?这是我的代码: package.json { "main": "index.html",
我试图在我的 xml 中的特定节点 ( ) 之前插入一个注释节点。这是它的方法: function test(xmlResponse) { var parser = new DOMParse
我正在尝试做npm install wrtc使用 Node 版本 16.14.0 但这还没有完成。它在给npm error code 1所以我试图将 Node 版本更改为以前的 lts 14.19.0
当我在 Visual Studio 中运行 Node.js 应用程序时,我收到以下消息:DeprecationWarning: 'node --debug' 和 'node --debug-brk'
我是一名优秀的程序员,十分优秀!