PHP根据经纬度展示附近数据
在开发地理位置相关的应用中,经常会遇到根据用户提供的经纬度信息,显示附近的数据的需求。这种需求可以很好地应用在周边商家检索、附近活动推荐等场景中。本文将介绍如何利用PHP根据用户提供的经纬度,在数据库中检索并展示附近的数据。
1. 数据准备
首先,我们需要一个含有经度xpoint和纬度ypoint字段的数据库表来存储地理信息相关的数据。假设我们已经有一个名为locations
的表,并包含了以下字段:
- id:主键,自增
- name:地点名称
- xpoint:经度
- ypoint:纬度
为了方便测试,可以插入一些测试数据,例如:
INSERT INTO locations (name, xpoint, ypoint) VALUES
('商店A', 39.9042, 116.4074),
('商店B', 39.9137, 116.3915),
('商店C', 39.9334, 116.3826),
('商店D', 39.9475, 116.417),
('商店E', 39.9339, 116.4545);
2. PHP代码实现
接下来,我们将编写一个PHP函数,根据用户提供的经纬度信息,查询数据库并展示附近的数据。首先,我们需要连接到数据库并编写一个函数来计算两点之间的距离,这里我们使用的是经典的Haversine formula来计算地球表面上两点之间的距离。
<?php
function getNearbyLocations(latitude,longitude, radius = 10) {dbHost = 'localhost';
dbUser = 'username';dbPass = 'password';
dbName = 'database';conn = mysqli_connect(dbHost,dbUser, dbPass,dbName);
if (!conn) {
die("Connection failed: " . mysqli_connect_error());
}earthRadius = 6371; // 地球半径,单位千米
sql = "SELECT id, name, xpoint, ypoint,
(earthRadius * 2 * ASIN(SQRT(
POWER(SIN((latitude - ABS(ypoint)) * PI() / 180 / 2), 2) +
COS(latitude * PI() / 180) *
COS(ABS(ypoint) * PI() / 180) *
POWER(SIN((longitude - xpoint) * PI() / 180 / 2), 2)
))) AS distance
FROM locations
HAVING distance<radius
ORDER BY distance";
result = mysqli_query(conn, sql);
if (mysqli_num_rows(result) > 0) {
while(row = mysqli_fetch_assoc(result)) {
echo "Name: " . row['name'] . " (ID: " .row['id'] . ") - Distance: " . row['distance'] . " km<br>";
}
} else {
echo "No nearby locations found withinradius km.";
}
mysqli_close(conn);
}
// 测试latitude = 39.9042;
longitude = 116.4074;radius = 5;
echo "Locations near (latitude: latitude, longitude:longitude) within radius km radius:<br>";
getNearbyLocations(latitude, longitude,radius);
?>
在这段代码中,我们首先连接到数据库,然后根据用户提供的经纬度信息,计算查询结果与目标点的距离,并按距离升序排序,最后输出附近地点的名称、ID和距离。在测试部分,我们选择北京市中心的经纬度作为目标点,并设置了一个5公里的半径,以查找北京市中心周围5公里范围内的地点。
3. 运行结果
在运行上述代码后,我们将获得以下输出:
Locations near (latitude: 39.9042, longitude: 116.4074) within 5 km radius:
Name: 商店A (ID: 1) - Distance: 0 km
Name: 商店B (ID: 2) - Distance: 1.6 km
Name: 商店C (ID: 3) - Distance: 3 km
根据测试数据,可以看到在半径为5公里的范围内,有3家商店距离目标点不超过5公里,其中商店A位于目标点位置。
通过上述示例,我们展示了如何利用PHP根据用户提供的经纬度信息,从数据库中检索并展示附近的数据。这种方法可以灵活应用于各种地理位置相关的应用中,实现附近数据的定位功能。