mysql根据经纬度获取附近的商家
create table geo(
geo_id INT NOT NULL AUTO_INCREMENT,
lng float NOT NULL,
lat float NOT NULL,
name VARCHAR(100) NULL,
PRIMARY KEY ( geo_id )
);
INSERT INTO `geo`(`lng`, `lat`, `name`) VALUES (118.302416,33.958887,"实验小学");
INSERT INTO `geo`(`lng`, `lat`, `name`) VALUES (118.303997,33.95188,"宿迁市人民医院");
INSERT INTO `geo`(`lng`, `lat`, `name`) VALUES (118.302991,33.935828,"宿迁学院");
INSERT INTO `geo`(`lng`, `lat`, `name`) VALUES (118.28215,33.959307,"金陵名府");
INSERT INTO `geo`(`lng`, `lat`, `name`) VALUES (118.290081,33.925404,"润园");
INSERT INTO `geo`(`lng`, `lat`, `name`) VALUES (118.354751,33.959007,"国际馆");
下面是google给的解决方案(基于公里km)。
SELECT
geo_id, `name`,(
6371 * acos (
cos ( radians(33.958887) )
* cos( radians( lat ) )
* cos( radians( lng ) - radians(118.302416) )
+ sin ( radians(33.958887) )
* sin( radians( lat ) )
)
) AS distance
FROM geo
HAVING distance < 20
ORDER BY distance
LIMIT 0 , 20;
其中33.958887是纬度,118.302416是经度。

详情代码:
/** 附近的商家 */
public function get_near_business() {
if (!$this->validate->validate('lng', ['require','regex|-?((0|1?[0-7]?[0-9]?)(([.][0-9]{1,4})?)|180(([.][]{1,4})?))'])) { // 经度
$this->json->setErr(10001, '缺少lng或lng格式不正确');
$this->json->Send();
}
if (!$this->validate->validate('lat', ['require','regex|-?((0|[1-8]?[0-9]?)(([.][0-9]{1,4})?)|90(([.][]{1,4})?))'])) { // 纬度
$this->json->setErr(10001, '缺少lat或lng格式不正确');
$this->json->Send();
} if (!isset($_POST['page']) || $_POST['page'] < 1) {
$_POST['page'] = 1;
}
// 分页获取附近的商家信息
$sql_count = "SELECT id, `name`,( 6371 * acos (
cos ( radians(".$_POST['lat'].") )
* cos( radians( lat ) )
* cos( radians( lng ) - radians(".$_POST['lng'].") )
+ sin ( radians(".$_POST['lat'].") )
* sin( radians( lat ) )
)
) AS distance
FROM tf_my_business
WHERE `status` = 1
HAVING distance < 10";
$count = count(M()->query($sql_count));
$hasPage = ceil($count / C('PAGE.LIMIT'));
$hasPage = $hasPage ? $hasPage : 1; if ($_POST['page'] > $hasPage) {
$this->json->setErr(10002, '页数有误');
$this->json->Send();
} $limit = (($_POST['page'] - 1) * C('PAGE.LIMIT')) . "," .C('PAGE.LIMIT');
$sql_list = "SELECT `id`,`name`,`info`,( 6371 * acos (
cos ( radians(".$_POST['lat'].") )
* cos( radians( lat ) )
* cos( radians( lng ) - radians(".$_POST['lng'].") )
+ sin ( radians(".$_POST['lat'].") )
* sin( radians( lat ) )
)
) AS distance
FROM tf_my_business
WHERE `status` = 1
HAVING distance < 10
ORDER BY distance ASC
LIMIT ".$limit;
$datalist = M()->query($sql_list);
if ($datalist) {
// 处理datalist
$my_business_img_model = M('my_business_img');
foreach ($datalist as &$v) {
// 获取主图
$my_business_img_info = $my_business_img_model->where(['m_b_id'=>$v['id'],'type'=>1,'is_main'=>1])->find();
$v['img'] = $my_business_img_info['img'];
if (strpos($v['img'],'cdn') === false) {
$v['img'] = C('CDN.URI').$v['img'];
}
} $data['datalist'] = $datalist;
$data['current_page'] = $_POST['page'];
$data['hasPage'] = $hasPage;
$this->json->setErr(0, '获取成功');
$this->json->setAttr('data',$data);
$this->json->Send();
} else {
$this->json->setErr(10003, '暂无数据');
$this->json->Send();
}
}
{
"errno": 0,
"errdesc": "获取成功",
"timestamp": 1524749336,
"data": {
"datalist": [
{
"id": "3",
"name": "京东",
"info": "京东",
"distance": "4.665364145881758",
"img": "https://cdn.caomall.net/1524732806744365022.png"
}
],
"current_page": "1",
"hasPage": 1
}
}
mysql根据经纬度获取附近的商家的更多相关文章
- 【转】MySql根据经纬度获取附近的商家
创建geo表 create table geo( geo_id INT NOT NULL AUTO_INCREMENT, lng float NOT NULL, lat float NOT NULL, ...
- Mysql 计算地址经纬度距离实时位置
前言 最近在做项目时候,遇到一个这样子的需求, 点到卡包里面卡券使用使用,需要展示卡券使用附近门店, 思路 数据库地址表设计 通用的区域街道地址表tz_sys_area 字段名称 类型 备注 area ...
- JS根据经纬度获取地址信息
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- 获取某地的经纬度 && 通过经纬度获取相应的地理位置
最近要通过一个经纬度判断该经纬度是否位于某个地区内,所以通过网上查找资料,整合后出了下面的内容. 1.通过地址获取改地址的经纬度 /** * @param addr * 查询的地址 * @return ...
- php根据经纬度获取城市名
/*php根据经纬度获取城市名*/ function get_my_addr_infos(){ $ch = curl_init(); $timeout = 5; $lat = $list['info' ...
- 百度api:根据经纬度获取地理位置信息
调用百度api,根据经度和纬度获取地理位置信息,返回Json. C#代码: using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Syste ...
- C#根据经纬度获取物理地址
废话不多说,直接上代码: 1.首先新建几个类,定义一些属性: public class BaiDuGeoCoding { public int Status { get; set; } public ...
- JAVA通过经纬度获取两点之间的距离
private static double EARTH_RADIUS = 6378.137; private static double rad(double d) { return d * Math ...
- 微信红包店小程序开发过程中遇到的问题 php获取附近周边商家 显示最近商家
最近公司在做一个项目就是微信红包店.仿照的是微信官方在做的那个红包店的模式.客户抢红包,抢到以后到店消费,消费以后就可以拿到商家的红包了. 项目中的两个难点: 1通过小程序来发红包 这个之前在开发语 ...
随机推荐
- Spring Framework 官方文档学习(四)之Validation、Data Binding、Type Conversion(二)
接前一篇 Spring Framework 官方文档学习(四)之Validation.Data Binding.Type Conversion(一) 本篇主要内容:Spring Type Conver ...
- IOS -执行时 (消息传递 )
一 函数调用概述 Objective-C不支持多重继承(同Java和Smalltalk),而C++语言支持多重继承. Objective-C是动态绑定,它的类库比C++要easy操作. Ob ...
- docker学习-docker镜像
docker就是一系列文件,
- oracle12c创建用户和表空间出现的问题
Oracle12c 中,增加了可插接数据库的概念,即PDB,允许一个数据库容器(CDB)承载多个可插拔数据库(PDB).CDB全称为 ContainerDatabase,中文翻译为数据库容器,PDB全 ...
- ios错误大全
/读取数据库数据 -(void)movethesqlitefile{ NSString *sourcepath=[[NSBundle mainBundle]pathForResource:@" ...
- Extjs6 Sdk中常用文件的作用
一.框架文件 ext.js: 压缩版. 动态加载扩展类的基础框架. ext-all.js: 压缩版. 包含框架全部类. ext-all-debug.js: 未压缩版. 包含框架全部类 ext-debu ...
- 谷歌Volley网络框架讲解——第一篇
自从公司新招了几个android工程师后,我清闲了些许.于是就可以有时间写写博客,研究一些没来的研究的东西. 今年的谷歌IO大会上,谷歌推出了自己的网络框架——Volley.不久前就听说了但是没有cl ...
- java基础---->数字签名算法的介绍
数字签名(又称公钥数字签名)是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法.关于数字签名的介绍,可以参见百度百科:http://baike.baidu.c ...
- 开源的PaaS方案:在OpenStack上部署CloudFoundry (二)部署OpenStack
硬件要求 安装OpenStack 1 安装CentOS 65系统并清空iptables防火墙规则 2 安装系统需要的工具包包括Openstack依赖的和CloudFoundry依赖的 3 安装EPEL ...
- WEB安全第六篇--千里之外奇袭客户端:XSS和HTML注入
零.前言 最近做专心web安全有一段时间了,但是目测后面的活会有些复杂,涉及到更多的中间件.底层安全.漏洞研究与安全建设等越来越复杂的东东,所以在这里想写一个系列关于web安全基础以及一些讨巧的pay ...