mysql ,mongodb 针对坐标值按照距离远近排序
文章目录
针对mysql 和 mongodb 不同数据库下坐标转换距离排序
mysql
//坐标转换因子.是需要计算的.
xFactor = cityObject.xFactor;
yFactor = cityObject.yFactor;
//地区坐标
latitude = location.latitude;
longitude = location.longitude;
//组合sql语句
let sql = [
'SELECT *, ',
' sqrt(pow((latitude - ' + latitude + ') * ' + yFactor + ',2) + ',
' pow((longitude - ' + longitude + ') * ' + xFactor + ', 2)) AS distance ',
' FROM shop ',
' WHERE city = ' + city
];
sql.push(' ORDER BY distance DESC ');
将横纵坐标值转换为距离,然后倒序排列出来.
如何计算某个地区的坐标转换因子
我们以香港中心点坐标为基础
var city={};
city.latitude=22.284338;
city.longitude=114.170459;
//地球半径
var R = 6371.393;
var girthY = R * 2 * Math.PI;
var girthX = Math.cos(city.latitude / 180 * Math.PI) * girthY ;
//y轴转换因子
city.yFactor = girthY / 360;
//x轴转换因子
city.xFactor = girthX / 360;
console.log(city);
如果把上面的这一段代码copy 上以后,
shell 命令行进入 node 环境,直接运行:
> console.log(city);
{ latitude: 22.284338,
longitude: 114.170459,
yFactor: 111.20178578851908,
xFactor: 102.89650354764173 }
上面我们就计算出了坐标转换因子.
mongodb下如何通过坐标值来进行距离排序
mongodb 下对坐标的支持实在是太友善,大致有下面几种方式,都来自官方文档
{
$near: {
$geometry: {
type: "Point" ,
coordinates: [ <longitude> , <latitude> ]
},
$maxDistance: <distance in meters>,
$minDistance: <distance in meters>
}
}
把坐标转换成距离,取最大和最小距离.
db.legacy2d.find(
{ location : { $near : [ -73.9667, 40.78 ], $maxDistance: 0.10 } }
)
在哪个坐标附近
End!