【问题标题】:Show Users who are in 10 KM radius from User's current location in PHP [closed]在PHP中显示用户当前位置10公里半径内的用户[关闭]
【发布时间】:2017-12-20 13:33:37
【问题描述】:

我有一个要求,我将从一个 android 应用程序中获取纬度和经度。根据收到的纬度和经度,我想从数据库中获取其他用户的信息。

用户应在指定纬度和经度的半径 5 或 10 公里范围内。任何帮助表示赞赏。

【问题讨论】:

  • 选择半径中心距离小于10公里的用户(google:如何计算距离纬度经度)?
  • 我没听懂你..你能详细解释一下吗.?
  • 所以我在这里了解到您有一个包含用户的数据库,并且对于每个用户,您都有他们的位置信息。如果要在半径10km的特定圈内获取用户,则必须计算所有用户与圈心的距离,并与10km进行比较,看是在里面还是在外面;所以对半径内的人做事
  • 您可以使用具有空间扩展的数据库,例如带有 PostGIS 的 PostgreSQL。

标签: php api codeigniter maps


【解决方案1】:

如果你的数据库是MySQL,你的users表是users,你想查找半径10公里内的所有用户,那么使用CodeIgniter:

// You would supply real latitude and longitude values here.
// I used a location in the southwestern United States.
$lat      = '34.770498';
$lng      = '-116.015625';
$distance = 10; // Kilometers

$this->load->database();

$query = $this->db->query(
    '
    SELECT 
        *,
        6371 * 2 * ASIN(SQRT(POWER(SIN(RADIANS(? - ABS(users.latitude))), 2) + COS(RADIANS(?)) * COS(RADIANS(ABS(users.latitude))) * POWER(SIN(RADIANS(? - users.longitude)), 2))) AS distance
    FROM users
    HAVING distance < ?
    ', 
    [
        $lat,
        $lat,
        $lng,
        $distance
    ] 
);

$local_users = $query->num_rows() > 0
    ? $query->result()
    : NULL;

有关更多信息,请查看以下内容: http://vinsol.com/blog/2011/08/30/geoproximity-search-with-mysql/

但更好的是创建一个可以调用的存储过程。我在我的网站上使用以下方式:

--
-- STORED PROCEDURE users_in_km_radius
-- 
DELIMITER $$

DROP PROCEDURE IF EXISTS users_in_km_radius $$

CREATE PROCEDURE `users_in_km_radius`( center_latitude float, center_longitude float, dist int, x_limit int, x_offset int )

BEGIN
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

PREPARE ps FROM 'SELECT 
    u.*, 
    6371 * 2 * ASIN(SQRT(POWER(SIN(RADIANS(? - ABS(u.latitude))), 2) + COS(RADIANS(?)) * COS(RADIANS(ABS(u.latitude))) * POWER(SIN(RADIANS(? - u.longitude)), 2))) AS distance
FROM `users` u  
WHERE u.`longitude` between ? and ? 
AND u.`latitude` between ? and ? 
HAVING distance < ? 
ORDER BY distance';

set @center_latitude = center_latitude;
set @center_longitude = center_longitude;
set @dist = dist;
set @east = center_longitude-dist/abs(cos(radians(center_latitude))*111.04);
set @west = center_longitude+dist/abs(cos(radians(center_latitude))*111.04);
set @north = center_latitude-(dist/111.04);
set @south = center_latitude+(dist/111.04);

EXECUTE ps USING @center_latitude, @center_latitude, @center_longitude, @east, @west, @north, @south, @dist;
DROP PREPARE ps;

END $$

DELIMITER ;

在 CodeIgniter 中使用这个有点棘手:

$sql = '
    CALL users_in_km_radius( ?, ?, ? );
';

$query = $this->db->query( $sql, [ $lat, $long, $km ] ); 

if( $query->num_rows() > 0 )
{
    $result = $query->result();

    mysqli_next_result($this->db->conn_id);
    $query->free_result();
}
else
{
    $result = NULL;

    mysqli_next_result($this->db->conn_id);
    $query->free_result();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-18
    • 2017-12-31
    • 1970-01-01
    • 2016-05-15
    • 2013-05-23
    • 2017-06-13
    • 2021-08-06
    相关资源
    最近更新 更多