use*_*951 7 mysql mongodb spatial
与此查询等效的 MongoDB 是什么:
SELECT 111151.29341326 * SQRT( pow(-6.186753-`Latitude`, 2)
+ pow(106.772835-`Longitude`, 2)
* cos(-6.186753*0.017453292519943)
* cos(`Latitude`*0.017453292519943)
)
as distance
from tablename ;
Run Code Online (Sandbox Code Playgroud)
这使用半正弦公式来计算到固定点的大圆距离。我们想从一个位置获得最近的 20 个点,然后显示距离。
MongoDB 内置了对地理索引的支持。您无需自己进行计算。
基本上,您将创建一个字段,其中 lat/long 存储为数组或子文档,类似于以下内容之一:
{ loc : [ 50 , 30 ] } //SUGGESTED OPTION
{ loc : { x : 50 , y : 30 } }
{ loc : { lon : 40.739037, lat: 73.992964 } }
Run Code Online (Sandbox Code Playgroud)
然后适当地索引新的 loc 字段:
db.places.ensureIndex( { loc : "2d" } )
Run Code Online (Sandbox Code Playgroud)
最后,您可以使用其中一个运算符来查询最接近的 20 个结果的点:
db.places.find( { loc : { $near : [50,50] } } ).limit(20)
Run Code Online (Sandbox Code Playgroud)
当然,您可以只使用 MongoDB 来存储数据,然后使用 find() 从数据库中提取信息并在客户端进行计算,但我想这不是您想要做的。
如果方程的距离部分是你想要的:
http://www.mongodb.org/display/DOCS/Geospatial+Indexing#GeospatialIndexing-geoNearCommand
$geoNear 运算符也将返回距离。一个例子:
> db.runCommand( { geoNear : "places" , near : [50,50], num : 10 } );
{
"ns" : "test.places",
"near" : "1100110000001111110000001111110000001111110000001111",
"results" : [
{
"dis" : 69.29646421910687,
"obj" : {
"_id" : ObjectId("4b8bd6b93b83c574d8760280"),
"y" : [
1,
1
],
"category" : "Coffee"
}
},
{
"dis" : 69.29646421910687,
"obj" : {
"_id" : ObjectId("4b8bd6b03b83c574d876027f"),
"y" : [
1,
1
]
}
}
],
"stats" : {
"time" : 0,
"btreelocs" : 1,
"btreelocs" : 1,
"nscanned" : 2,
"nscanned" : 2,
"objectsLoaded" : 2,
"objectsLoaded" : 2,
"avgDistance" : 69.29646421910687
},
"ok" : 1
}
Run Code Online (Sandbox Code Playgroud)
这些"dis" : 69.29646421910687元素就是您要寻找的,还有一个球面距离选项。
对于所有这些,如何使用距离等等,请查看此处以获取有关地理索引以及如何使用它们的更多信息:
http://www.mongodb.org/display/DOCS/Geospatial+Indexing/