zoukankan      html  css  js  c++  java
  • 数据库根据坐标查找附近的店铺

    创建表格

    当你创建MySQL表时,你要特别注意lat和lng属性。利用Google地图的当前缩放功能,您应该只需要小数点后六位数的精度。为了将表格所需的存储空间保持在最低限度,可以指定lat和lng属性是大小为(10,6)的浮点数。这将使字段在小数点后面存储6位数字,加上小数点前面的4位数字,例如-123.456789度。你的表还应该有一个id属性作为主键。

    CREATE TABLE `markers` (
      `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
      `name` VARCHAR( 60 ) NOT NULL ,
      `address` VARCHAR( 80 ) NOT NULL ,
      `lat` FLOAT( 10, 6 ) NOT NULL ,
      `lng` FLOAT( 10, 6 ) NOT NULL
    ) ENGINE = MYISAM ;

    填充表格

    创建表后,是时候用数据填充它了。下面提供的样本数据是分散在美国各地的180个匹兹堡。在phpMyAdmin中,您可以使用IMPORT选项卡导入各种文件格式,包括CSV(以逗号分隔的值)。Microsoft Excel和Google Spreadsheets都导出为CSV格式,因此您可以通过导出/导入CSV文件轻松地将数据从电子表格传输到MySQL表格。

    INSERT INTO `markers` (`name`, `address`, `lat`, `lng`) VALUES ('Frankie Johnnie & Luigo Too','939 W El Camino Real, Mountain View, CA','37.386339','-122.085823');
    INSERT INTO `markers` (`name`, `address`, `lat`, `lng`) VALUES ('Amici's East Coast Pizzeria','790 Castro St, Mountain View, CA','37.38714','-122.083235');
    INSERT INTO `markers` (`name`, `address`, `lat`, `lng`) VALUES ('Kapp's Pizza Bar & Grill','191 Castro St, Mountain View, CA','37.393885','-122.078916');
    INSERT INTO `markers` (`name`, `address`, `lat`, `lng`) VALUES ('Round Table Pizza: Mountain View','570 N Shoreline Blvd, Mountain View, CA','37.402653','-122.079354');
    INSERT INTO `markers` (`name`, `address`, `lat`, `lng`) VALUES ('Tony & Alba's Pizza & Pasta','619 Escuela Ave, Mountain View, CA','37.394011','-122.095528');
    INSERT INTO `markers` (`name`, `address`, `lat`, `lng`) VALUES ('Oregano's Wood-Fired Pizza','4546 El Camino Real, Los Altos, CA','37.401724','-122.114646');

    使用MySQL查找位置

    要查找标记表中位于给定纬度/经度的某个半径范围内的位置,可以使用基于Haversine公式的SELECT语句。Haversine公式通常用于计算球体上两对坐标之间的大圆距离。维基百科给出了深入的数学解释,并且与编程有关的公式的讨论在Movable Type的网站上进行了很好的讨论。

    以下是SQL语句,它将查找距离37,-122坐标25英里范围内最近的20个位置。它根据该行的纬度/经度和目标纬度/经度计算距离,然后仅请求距离值小于25的行,按距离排序整个查询,并将其限制为20个结果。要以公里而不是英里搜索,请用6371替换3959。

    SELECT 
    id, 
    (
       3959 *
       acos(cos(radians(37)) * 
       cos(radians(lat)) * 
       cos(radians(lng) - 
       radians(-122)) + 
       sin(radians(37)) * 
       sin(radians(lat )))
    ) AS distance 
    FROM markers 
    HAVING distance < 25 
    ORDER BY distance LIMIT 0, 20;

    结果:

  • 相关阅读:
    leetcode69
    leetcode204
    leetcode414
    leetcode532
    leetcode28
    leetcode155
    leetcode303
    leetcode190
    2018-7-21-win10-uwp-调用-Microsoft.Windows.Photos_8wekyb3d8bbwe-应用
    2018-7-21-win10-uwp-调用-Microsoft.Windows.Photos_8wekyb3d8bbwe-应用
  • 原文地址:https://www.cnblogs.com/x-ph/p/8668000.html
Copyright © 2011-2022 走看看