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

本文介绍如何使用MySQL和MongoDB进行地理空间数据的存储及查询,包括创建空间索引、插入地理位置数据,并演示了如何查找特定距离范围内的记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#仅支持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实现


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值