EatgirlHuiUnique 2017-10-18
随着近几年各类移动终端的迅速普及,基于地理位置的服务(LBS)和相关应用也越来越多,而支撑这些应用的最基础技术之一,就是基于地理位置信息的处理。
关于LBS的详细介绍及通用的几个解决方案,可以参考:深入浅出Symfony2 - 结合MongoDB开发LBS应用
本文主要举例说明使用Perl语言 + MongoDB实现查找附近的人的实现方案。
涉及的官方API说明文档列表:
实现步骤如下:
1、建立数据库表geoperson,包含位置信息字段:loc (按照GeoJSON格式组织), 数据如下:
{
"_id": "o15041420964119780063",
"name": "stephen",
"head_fid": "f15022500199301140308001",
"loc": {
"type": "Point",
"coordinates": [
119.29647,
26.07421
]
},
"type": "geoperson",
"province": "福建省"
}
2、建立2dsphere索引
my $mocl = mdb()->get_collection("geoperson")->ensure_index({loc=>"2dsphere"});
3、查找附近2.5公里的人
my $rad = 2500; # 查找范围 2.5公里
my $max_size = 20; # 最多返回20条匹配数据
my $longitude = 119.31647; # 中心点坐标(经纬度)
my $latitude = 26.17421;
my $mocl = mdb()->get_collection("geoperson")->aggregate([
{
'$geoNear'=>{
'near'=> { type=>"Point", coordinates=>[$longitude, $latitude] }, # 也要采取GeoJSON格式
#'num'=> $max_size,#The default value is 100
'spherical'=>1, #Required if using a 2dsphere index.
# Specify the distance in meters if the specified point is GeoJSON
'maxDistance'=>$rad, # 单位是米
# The output field that contains the calculated distance.
'distanceField'=>"distance",
}
},
{ '$match'=> { "name"=> "lily" } } # 进一步过滤条件
{ '$sort'=> { "ut"=> -1 } } # 排序
]);
MongoDB原生支持地理位置索引,且高性能、支持复杂查询。
是不是很简单呀。