当前位置:首页 > PHP

php实现lbs实现商品筛选

2026-02-15 03:26:56PHP

PHP实现LBS商品筛选的方法

数据库设计

在MySQL中存储商品信息时需包含经纬度字段(如latitudelongitude),推荐使用POINT空间数据类型。创建表时可添加空间索引加速查询:

CREATE TABLE products (
    id INT PRIMARY KEY,
    name VARCHAR(255),
    location POINT NOT NULL,
    SPATIAL INDEX(location)
);

距离计算

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

function getDistance($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 * atan2(sqrt($a), sqrt(1-$a));
    return $earthRadius * $c;
}

MySQL空间查询

对于MySQL 5.7+版本,可直接使用ST_Distance_Sphere函数:

SELECT 
    id, 
    name,
    ST_Distance_Sphere(location, POINT(:user_lon, :user_lat)) / 1000 AS distance_km
FROM 
    products
WHERE 
    ST_Distance_Sphere(location, POINT(:user_lon, :user_lat)) <= :radius_km * 1000
ORDER BY 
    distance_km;

Redis GEO优化

对高频访问场景可使用Redis GEO数据结构:

$redis->geoAdd('products:locations', $longitude, $latitude, $productId);
$results = $redis->geoRadius('products:locations', $userLon, $userLat, $radius, 'km');

分页处理

结合距离筛选时需注意分页逻辑,建议先获取符合条件的所有ID,再分页查询详细信息:

$page = $_GET['page'] ?? 1;
$perPage = 10;
$offset = ($page - 1) * $perPage;

$stmt = $pdo->prepare("
    SELECT SQL_CALC_FOUND_ROWS p.*
    FROM products p
    WHERE ST_Distance_Sphere(location, POINT(?, ?)) <= ? * 1000
    LIMIT ? OFFSET ?
");
$stmt->execute([$userLon, $userLat, $radius, $perPage, $offset]);

性能优化

  1. 确保latitudelongitude字段建立复合索引
  2. 对固定区域商品可先进行地理边界框预筛选
  3. 使用缓存存储热门区域的查询结果
  4. 考虑使用Elasticsearch的geo_point类型实现高级搜索

前端交互

通过浏览器获取用户位置后传递给后端:

navigator.geolocation.getCurrentPosition(position => {
    const {latitude, longitude} = position.coords;
    // 发送AJAX请求到PHP后端
});

完整示例

后端接口处理示例:

php实现lbs实现商品筛选

// 获取前端传递的经纬度和半径
$userLat = $_GET['lat'];
$userLon = $_GET['lon'];
$radius = $_GET['radius'] ?? 5; // 默认5公里

$products = $pdo->prepare("
    SELECT id, name, 
           ST_Distance_Sphere(location, POINT(?, ?)) / 1000 AS distance
    FROM products
    WHERE ST_Distance_Sphere(location, POINT(?, ?)) <= ? * 1000
    ORDER BY distance
")->execute([$userLon, $userLat, $userLon, $userLat, $radius]);

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

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

相关文章

vue实现商品

vue实现商品

Vue实现商品功能的方法 在Vue中实现商品功能通常涉及商品列表展示、商品详情、购物车操作等模块。以下是几种常见的实现方式: 商品列表展示 使用v-for指令循环渲染商品数据,结合Vue的响应式特性…

php实现图片上传

php实现图片上传

实现图片上传的基本步骤 创建HTML表单用于文件上传,表单需设置enctype="multipart/form-data"属性,确保文件数据正确传输。 <form action="upload…

php 实现验证码

php 实现验证码

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

php实现博客

php实现博客

使用PHP实现博客系统 数据库设计 创建数据库表存储博客文章和用户信息。常见的表包括posts(文章)和users(用户)。 CREATE TABLE users ( id INT AUTO…

php mvc 实现

php mvc 实现

PHP MVC 实现方法 MVC(Model-View-Controller)是一种设计模式,用于分离应用程序的逻辑、数据和界面。以下是实现PHP MVC框架的关键步骤。 目录结构 创建以下目录结构…

php 伪静态实现

php 伪静态实现

PHP 伪静态实现方法 伪静态(URL Rewrite)是一种通过服务器配置将动态URL转换为静态URL的技术,提升URL的可读性和SEO效果。以下是几种常见的实现方式: 使用Apache的mod_…