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. jQuery Datatable 转载

    jQuery Datatable 实用简单实例 时间 2014-05-08 10:44:18  51CTO推荐博文 原文  http://sgyyz.blog.51cto.com/5069360/14 ...

  2. Spring------SpringBoot参考书籍

    转载: http://download.csdn.net/download/plus_dy/8972653

  3. 7 -- Spring的基本用法 -- 3... Spring 的核心机制 : 依赖注入

    7.3 Spring 的核心机制 : 依赖注入 Spring 框架的核心功能有两个. Spring容器作为超级大工厂,负责创建.管理所有的Java对象,这些Java对象被称为Bean. Spring容 ...

  4. ios 添加动画的方法

    转自文顶顶大神的博客:http://www.cnblogs.com/wendingding/p/3751519.html ios 开发UI中,经常会用添加动画效果的需求,下面就总结一下,添加动画的三种 ...

  5. android studio如何生成签名文件,以及SHA1和MD5值

    一.生成签名文件 1.点击菜单栏中的Build的. 2.弹出窗体,如下图,选中Generate Signed APK,并点击. 3.弹出窗体,如下图. 4.点击Create new…按钮,创建一个签名 ...

  6. x86 体系指令

    FASM 第二章 - 2.1 x86 体系指令 Author: 徐艺波  From: xuyibo.org  Updated: 2008-04-17   官方论坛   本站软件反馈.软件开发交流.   ...

  7. PHP学习记录数组中的数组的指针

    unshift在数组头增加一个元素,push在数组尾增加一个元素,shift删除数组的第一个元素,pop删除数组的最后一个元素: <?php $item=array('苹果'); //在数组最前 ...

  8. 关于word文档转成html网页的方法

    在工作中,有时我们可能需要将一个word文档转换成html网页格式,如在写帮助文档的时候,采用office编写,最终却想以网页的格式传到网站的指定目录下供网友直接浏览 这时我们就需要对word文件进行 ...

  9. Android通知栏的高度获取

    public static int getStatusBarHeight(Context context){ Class<?> c = null; Object obj = null; F ...

  10. NIO之Buffer的clear()、rewind()、flip()方法的区别

    Java的NIO中有关Buffer的几种常用方法比如clear,rewind和flip到底有哪些区别.下面给大家这三种方法的源码,方便大家记忆.clear()方法用于写模式,其作用为情况Buffer中 ...