分享一段mysql,mongodb 实现LBS搜索的简单代码

转载 2015年07月09日 23:23:42
#仅支持myisam

CREATETABLE address (
 
    addressCHAR(80)NOTNULL,
 
    address_loc POINT NOTNULL,
 
    PRIMARYKEY(address)
 
);

ALTERTABLE address ADDSPATIAL INDEX(address_loc);

INSERTINTO address VALUES('Foobar street 12', GeomFromText('POINT(30.620076 104.067221)'));
 
INSERTINTO address VALUES('Foobar street 13', GeomFromText('POINT(31.720076 105.167221)'));

查询10公里内的
SELECT *
    FROM   address
    WHERE  MBRContains
                    (
                    LineString
                            (
                            Point
                                    (
                                    30.620076 + 10 / ( 111.1 / COS(RADIANS(104.067221))),
                                    104.067221 + 10 / 111.1
                                    ),
                            Point
                                    (
                                    30.620076 - 10 / ( 111.1 / COS(RADIANS(104.067221))),
                                    104.067221 - 10 / 111.1
                                    )
                            ),
                    address_loc
<?php
$m = new MongoClient();
$d = $m->user;
$r = $d->command(array(
    'geoNear' => "user",       // 在 poiConcat 集合中
    'near' => array(104.065847, 30.657554), // 经纬度附近
    'spherical' => true,              // 启用特殊搜索 弧度
    'maxDistance' => 1.5/6371,              // 搜索区域
    'distanceMultiplier' => 6371,           // 返回公里数,自动转换
    'num' => 5,                             // 最多返回5个文档
));
print_r($r);

                    )

MongoDb

1、先建立一张简单的集合user,两条数据如下:

{
  "_id": ObjectId("518b1f1a83ba88ca60000001"),
  "account":"simplephp1@163.com",
  "gps": [
    104.067221,
    30.620076
  ]
}
 
{
  "_id": ObjectId("518b1dae83ba88d660000000"),
  "account":"simplephp6@163.com",
  "gps": [
    104.07958,
    30.653936
  ]

db.user.ensureIndex({"gps":"2d"},{"min":-180,"max":180})

#查询5公里内的,只返回常规数据
db.user.find({ gps :{ $near : [104.065847, 30.657554] , $maxDistance : 5/111.12} })
#查询5公里内的,且返回距离
db.runCommand({ geoNear : "user", near : [104.065847, 30.657554], spherical : true, maxDistance : 5/6371, distanceMultiplier: 6371})

#php实现


结合MongoDB开发LBS应用

然后列举一下需求: 1.实时性要高,有频繁的更新和读取 2.可按距离排序支持分页 3.支持多条件筛选(一个经纬度数据还包含其他属性,比如社交系统的性别、年龄) 方案简单介绍: 1.sphinx geo...
  • Real_Myth
  • Real_Myth
  • 2016年04月12日 21:13
  • 876

基于LBS的地理位置附近的搜索以及由近及远的排序(MYSQL)

目前基于LBS地理位置的搜索已经应用非常广了,的确是个很方便的东西。 我们做程序的就是要考虑如何通过这些功能,来做出更符合用户的内容来。 1,如何获取位置 例如微信,可以通过发送地理...
  • zmx729618
  • zmx729618
  • 2017年02月21日 16:14
  • 366

基于LBS的地理位置附近的搜索以及由近及远的排序(MYSQL)

目前基于LBS地理位置的搜索已经应用非常广了,的确是个很方便的东西。 我们做程序的就是要考虑如何通过这些功能,来做出更符合用户的内容来。 1,如何获取位置 例如微信,可以通过发送地理...
  • z69183787
  • z69183787
  • 2016年10月19日 10:42
  • 3134

基于LBS的地理位置附近的搜索以及由近及远的排序

from:http://www.cnblogs.com/jifeng/p/4356006.html Nosql学习之Redis资料(一) http://redis.io/download   ...
  • Real_Myth
  • Real_Myth
  • 2016年04月12日 21:15
  • 1619

Solr4.7实现LBS(地理位置搜索)

Solr4.7实现LBS(地理位置搜索) 时间 2014-03-24 09:05:59 ITeye-博客 原文  http://mtou.iteye.com/blog/2035280 主题 ...
  • Real_Myth
  • Real_Myth
  • 2016年04月12日 21:05
  • 1449

基于PHP+MongoDB的LBS附近的人应用-初探

写这篇文章是基于兴趣,早之前好奇一些社交APP、O2O应用可能会带有“附近的人”类似的功能,到底他们是如何做的呢?下面我简单的分析下用到的技术,小学生的分析欢迎批评指正。 基于 GeoHash + ...
  • kingstart01
  • kingstart01
  • 2017年06月20日 10:35
  • 1869

基于LBS的地理位置附近的搜索以及由近及远的排序(MYSQL)

目前基于LBS地理位置的搜索已经应用非常广了,的确是个很方便的东西。 我们做程序的就是要考虑如何通过这些功能,来做出更符合用户的内容来。 1,如何获取位置 例如微信,可以通过发送地理...
  • zmx729618
  • zmx729618
  • 2016年11月07日 16:53
  • 2109

再提LBS经纬度搜索和距离排序,求更优方案

再提LBS经纬度搜索和距离排序,求更优方案 1赞踩收藏 一直在琢磨LBS,期待可以发现更好的方案。现在纠结了。 简单列举一下已经了解到的方案: 1.sphinx geo索引 2....
  • pi9nc
  • pi9nc
  • 2013年12月28日 13:39
  • 9644

结合MongoDB开发LBS应用

简介 随着近几年各类移动终端的迅速普及,基于地理位置的服务(LBS)和相关应用也越来越多,而支撑这些应用的最基础技术之一,就是基于地理位置信息的处理。我所在的项目也正从事相关系统的开发,我们使用的是...
  • huangrunqing
  • huangrunqing
  • 2013年06月17日 14:36
  • 29246

最简单的网页分享代码

function makeShare(url, title){ //http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url=ht...
  • leinchu
  • leinchu
  • 2014年06月25日 18:09
  • 2073
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:分享一段mysql,mongodb 实现LBS搜索的简单代码
举报原因:
原因补充:

(最多只允许输入30个字)