当前位置:首页 > PHP

php实现lbs实现商品筛选

2026-03-13 02:18:38PHP

PHP 实现 LBS 商品筛选

LBS(Location-Based Service)商品筛选通常涉及根据用户地理位置筛选附近商品。以下是实现方法:

数据库设计

商品表需包含经纬度字段,例如:

php实现lbs实现商品筛选

CREATE TABLE `products` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `latitude` decimal(10,6) NOT NULL,
  `longitude` decimal(10,6) NOT NULL,
  PRIMARY KEY (`id`)
);

计算距离

使用 Haversine 公式计算两点间距离(单位:公里):

function calculateDistance($lat1, $lon1, $lat2, $lon2) {
    $earthRadius = 6371;
    $dLat = deg2rad($lat2 - $lat1);
    $dLon = deg2rad($lon2 - $lon1);
    $a = sin($dLat/2) * sin($dLat/2) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * sin($dLon/2) * sin($dLon/2);
    $c = 2 * asin(sqrt($a));
    return $earthRadius * $c;
}

MySQL 查询优化

直接使用 SQL 计算距离并筛选:

php实现lbs实现商品筛选

SELECT 
    id, 
    name, 
    (6371 * acos(cos(radians(?)) * cos(radians(latitude)) * cos(radians(longitude) - radians(?)) + sin(radians(?)) * sin(radians(latitude)))) AS distance
FROM 
    products
HAVING 
    distance < ?
ORDER BY 
    distance
LIMIT 20

Redis GEO 优化

对于高性能场景,可使用 Redis GEO 命令:

$redis->geoadd('products:geo', $longitude, $latitude, $productId);
$results = $redis->georadius('products:geo', $userLon, $userLat, $radius, 'km', ['WITHDIST']);

前端集成

获取用户位置后通过 AJAX 提交:

navigator.geolocation.getCurrentPosition(function(position) {
    $.post('/api/nearby-products', {
        lat: position.coords.latitude,
        lng: position.coords.longitude,
        radius: 5 // 5公里范围
    });
});

性能优化建议

  1. 为经纬度字段创建复合索引:INDEX(latitude, longitude)
  2. 使用存储过程预处理距离计算
  3. 对静态商品数据可预先计算网格分区
  4. 考虑使用 MongoDB 等支持地理查询的数据库

完整示例代码

// 接收前端参数
$userLat = $_POST['lat'];
$userLon = $_POST['lng'];
$radius = $_POST['radius'] ?? 5;

// 查询数据库
$stmt = $pdo->prepare("SELECT id, name, 
    (6371 * acos(cos(radians(:lat)) * cos(radians(latitude)) * 
    cos(radians(longitude) - radians(:lng)) + 
    sin(radians(:lat)) * sin(radians(latitude)))) AS distance 
    FROM products HAVING distance < :radius ORDER BY distance");

$stmt->execute([
    ':lat' => $userLat,
    ':lng' => $userLon,
    ':radius' => $radius
]);

$products = $stmt->fetchAll(PDO::FETCH_ASSOC);
header('Content-Type: application/json');
echo json_encode($products);

标签: 商品php
分享给朋友:

相关文章

php 实现验证码

php 实现验证码

使用 PHP 生成验证码 验证码(CAPTCHA)用于防止自动化脚本提交表单,以下是几种常见的 PHP 实现方法。 使用 GD 库生成图片验证码 GD 库是 PHP 的图像处理扩展,可用于生成验证码…

php实现分类

php实现分类

PHP实现分类的方法 数据库设计 创建分类表时,通常需要包含id、名称、父级id等字段。父级id用于实现多级分类结构。 CREATE TABLE categories ( id INT AU…

php无限分类的实现

php无限分类的实现

PHP无限分类的实现 无限分类是一种常见的树形结构数据组织方式,适用于商品分类、菜单管理、地区选择等场景。以下是几种实现方法: 递归实现法 递归是最直观的实现方式,通过函数自身调用来遍历子分类。数据…

php 实现秒杀

php 实现秒杀

PHP 实现秒杀的关键技术 秒杀系统需要解决高并发、超卖、性能瓶颈等问题。以下是实现秒杀的核心方案: 使用 Redis 预减库存 将商品库存提前加载到 Redis 中,通过原子操作保证库存准确性:…

php mvc实现

php mvc实现

PHP MVC 实现步骤 模型(Model)层 模型负责数据处理和业务逻辑,通常与数据库交互。创建一个基类模型,其他具体模型继承它。 class Model { protected $db;…

php实现注册登录

php实现注册登录

PHP 注册功能实现 创建数据库表(以 MySQL 为例) CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, usern…