使用 MySQL 空间数据在 Google 地图上获取最近的地点

Posted

技术标签:

【中文标题】使用 MySQL 空间数据在 Google 地图上获取最近的地点【英文标题】:Get nearest places on Google Maps, using MySQL spatial data 【发布时间】:2011-06-06 10:33:27 【问题描述】:

我有一个包含商店列表的数据库,其中包含每个商店的纬度和经度。因此,根据我输入的当前(lat、lng)位置,我想从某个半径(如 1 公里、5 公里等)内的项目中获取项目列表?

算法应该是什么?我需要算法本身的 php 代码。

【问题讨论】:

【参考方案1】:

您应该选择像mysql 或postgresql 这样在空间上启用的数据库,然后您可以使用它们提供的一些现成功能。 否则,如果您想手动执行此操作,请检查 this 以获取提示。

【讨论】:

我会推荐带有 postgis 扩展的 postgresql。它比 MySQL 快。 @23tux 它更快,更完整,但是大多数人都熟悉mysql,mysql空间扩展非常方便【参考方案2】:

如果您正在寻找用于计算两组坐标之间距离的 PHP 代码,这里有一个我改编的类,它将以公里为单位计算距离。但是,如果您使用的是数据库,我建议您研究一下您的数据库是否能够进行空间计算(我知道 SQL Server 和 MySQL 是我想不到的)。

这是一个有趣的 SQL 解决方案链接,您可能想查看它。 Optimising a haversine formula SQL call in PHP

class Distance

    /**
     * Mean raidus of the earth in kilometers.
     * @var double
     */
    const RADIUS    = 6372.797;

    /**
     * Pi divided by 180 degrees. Calculated with PHP Pi constant.
     * @var double
     */
    const PI180         = 0.017453293;

    /**
     * Constant for converting kilometers into miles.
     * @var double
     */
    const MILES     = 0.621371192;

    /**
     * Calculate distance between two points of latitude and longitude.
     * @param double $lat1 The first point of latitude.
     * @param double $long1 The first point of longitude.
     * @param double $lat2 The second point of latitude.
     * @param double $long2 The second point of longitude.
     * @param bool $kilometers Set to false to return in miles.
     * @return double The distance in kilometers or miles, whichever selected.
     */
    public static function getDistance($lat1, $long1, $lat2, $long2, $kilometers = true)
    
        $lat1   *= self::PI180;
        $long1  *= self::PI180;
        $lat2   *= self::PI180;
        $long2  *= self::PI180;

        $dlat = $lat2 - $lat1;
        $dlong = $long2 - $long1;

        $a = sin($dlat / 2) * sin($dlat / 2) + cos($lat1) * cos($lat2) * sin($dlong / 2) * sin($dlong / 2);
        $c = 2 * atan2(sqrt($a), sqrt(1 - $a));

        $km = self::RADIUS * $c;

        if($kilometers)
        
            return $km;
        
        else
        
            return $km * self::MILES;
        
    


//example
echo Distance::getDistance(40.686748, -89.555054, 40.453078, -88.939819);

【讨论】:

那么我需要数据库来支持一些特殊功能吗?不能单独使用PHP直接完成吗?如果我将 lat/lng 坐标保存为 DB 中的 2 个字段 我发布的代码会给你两个坐标之间的距离。【参考方案3】:

您只需要使用以下查询。

例如,您输入了纬度和经度 37 和 -122 度数。并且您想搜索距当前给定纬度和经度 25 英里范围内的用户。

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

如果您想以公里为单位搜索距离,请将上述查询中的 3959 替换为 6371。

你也可以这样做:

    选择所有经纬度

    然后计算每条记录的距离。

    以上过程可以通过多次重定向来完成。

为了优化查询,您可以使用存储过程。

而this 也可以帮到你。

【讨论】:

一点警告,因为如果带有点的表的大小增加,这将失控。您最终将针对每个查询对表中的每个点进行计算。 存储过程可以用于此。 你是最近的 gaurav,但任何关于优化它的帮助都会非常有帮助:) 检查此arubin.org/files/geo_search.pdf 程序可能会有所帮助。让我知道你能不能做到。 这是一个很好的做法...code.google.com/apis/maps/articles/…

以上是关于使用 MySQL 空间数据在 Google 地图上获取最近的地点的主要内容,如果未能解决你的问题,请参考以下文章

从 MySQL 数据库更新谷歌地图上“实时”标记的变化坐标

角谷歌地图填充空间

使用 MySQL、JSON 和 jQuery 插件 Gmap3 填充 Google 地图标记

来自 JSON 的 Google 地图上的标记

将Google地图圆半径设置为输入框值

每 X 秒用 mysql 数据更新 google java map