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根据经纬度获取附近的商家的更多相关文章

  1. 【转】MySql根据经纬度获取附近的商家

    创建geo表 create table geo( geo_id INT NOT NULL AUTO_INCREMENT, lng float NOT NULL, lat float NOT NULL, ...

  2. Mysql 计算地址经纬度距离实时位置

    前言 最近在做项目时候,遇到一个这样子的需求, 点到卡包里面卡券使用使用,需要展示卡券使用附近门店, 思路 数据库地址表设计 通用的区域街道地址表tz_sys_area 字段名称 类型 备注 area ...

  3. JS根据经纬度获取地址信息

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  4. 获取某地的经纬度 && 通过经纬度获取相应的地理位置

    最近要通过一个经纬度判断该经纬度是否位于某个地区内,所以通过网上查找资料,整合后出了下面的内容. 1.通过地址获取改地址的经纬度 /** * @param addr * 查询的地址 * @return ...

  5. php根据经纬度获取城市名

    /*php根据经纬度获取城市名*/ function get_my_addr_infos(){ $ch = curl_init(); $timeout = 5; $lat = $list['info' ...

  6. 百度api:根据经纬度获取地理位置信息

    调用百度api,根据经度和纬度获取地理位置信息,返回Json. C#代码: using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Syste ...

  7. C#根据经纬度获取物理地址

    废话不多说,直接上代码: 1.首先新建几个类,定义一些属性: public class BaiDuGeoCoding { public int Status { get; set; } public ...

  8. JAVA通过经纬度获取两点之间的距离

    private static double EARTH_RADIUS = 6378.137; private static double rad(double d) { return d * Math ...

  9. 微信红包店小程序开发过程中遇到的问题 php获取附近周边商家 显示最近商家

    最近公司在做一个项目就是微信红包店.仿照的是微信官方在做的那个红包店的模式.客户抢红包,抢到以后到店消费,消费以后就可以拿到商家的红包了. 项目中的两个难点: 1通过小程序来发红包  这个之前在开发语 ...

随机推荐

  1. javascript在字符串中提取网址并替换成超链接

    var str = " http://wasmip.baidu.com.cn/mip/km/archives/km_archives_main/kmArchivesMain.do?metho ...

  2. Chrome浏览器无法观看视频,一直提示“adobe flash player 已过期” ?

       很多新用户在安装了Chrome浏览器或者更新过的的时候,经常提示“ adobe flash player 已过期”的问题,反复提示,导致无法观看视频.于是从网上也找了很多办法都没有解决.这里给大 ...

  3. Java课后简答题

    1.简述Java的特点. 面向对象.跨平台性.健壮性.安全性.可移植性.多线程性.动态性等. 2.简述JRE与JDK的区别. JRE(Java Runtime Environment,Java运行时环 ...

  4. 九度 1481 Is It A Tree?

    题目 给定一个有向图, 判断其是否是一棵树 要求 (1) 除了根节点外, 每个节点只有唯一的前驱 (2) 从根节点出发, 到任何节点有且只有一条路径 思路 1. 要求(1) 可以通过记录每个节点的前驱 ...

  5. iOS根据文字字数动态确定Label宽高

    我们有时候在写项目的时候,会碰到,意见反馈,还有其他地方,讲座活动细则等需要大篇展示的文本, 因为每次服务器返回的内容大小不一,所以需要动态的调整label的宽高: 在ios 6 的时候可以: -(v ...

  6. hadoop 2.2.0集群安装详细步骤(简单配置,无HA)

    安装环境操作系统:CentOS 6.5 i586(32位)java环境:JDK 1.7.0.51hadoop版本:社区版本2.2.0,hadoop-2.2.0.tar.gz 安装准备设置集群的host ...

  7. MQTT的学习研究(八)基于HTTP DELETE MQTT 订阅消息服务端使用

    HTTP DELETE 订阅主题请求协议和响应协议http://publib.boulder.ibm.com/infocenter/wmqv7/v7r0/topic/com.ibm.mq.csqzau ...

  8. object.prototype.call

    object.prototype.call /* * object.prototype.call * @ 当一个object没有某个方法,但是其他的有,我们可以借助call或apply用其它对象的方法 ...

  9. Egret的一些性能优化

    Egret的性能优化不知道在哪里啊,主要参考Laya的性能优化,都差不多 一.性能统计面板 index.html页面设置data-show-fps=true打开性能面板 性能统计面板说明 Egret没 ...

  10. 【BZOJ3203】[Sdoi2013]保护出题人 二分+凸包

    [BZOJ3203][Sdoi2013]保护出题人 Description Input 第一行两个空格隔开的正整数n和d,分别表示关数和相邻僵尸间的距离.接下来n行每行两个空格隔开的正整数,第i + ...