显示用户在PHP中当前位置的10公里半径范围内的用户
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了显示用户在PHP中当前位置的10公里半径范围内的用户相关的知识,希望对你有一定的参考价值。
我有一个要求,我将从android应用程序获得纬度和经度。根据收到的纬度和经度,我想从数据库中获取其他用户的信息。
用户应在半径5或10公里范围内,具有给定的纬度和经度。任何帮助表示赞赏。
答案
如果您的数据库是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();
}
以上是关于显示用户在PHP中当前位置的10公里半径范围内的用户的主要内容,如果未能解决你的问题,请参考以下文章
在我周围 5 公里半径值范围内的 android 应用上标记地理位置。
通过谷歌地图获取我当前位置10公里半径内所有位置的纬度和经度(使用PHP)
如果我想显示我当前位置半径 1000 米范围内数据库中的所有位置怎么办?