Geo关键词优化系统源码开发(PHP)

核心功能模块设计
  • 地理位置数据库构建
    使用MySQL存储经纬度数据,设计表结构包含idkeywordlatitudelongituderadius(影响范围)等字段。示例建表SQL:

    CREATE TABLE geo_keywords (
      id INT AUTO_INCREMENT PRIMARY KEY,
      keyword VARCHAR(255) NOT NULL,
      latitude DECIMAL(10, 8) NOT NULL,
      longitude DECIMAL(11, 8) NOT NULL,
      radius INT DEFAULT 5000,
      UNIQUE KEY (keyword, latitude, longitude)
    );
    
  • 关键词-地理坐标绑定
    通过PHP表单提交实现关键词与经纬度关联:

    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
        $keyword = trim($_POST['keyword']);
        $lat = floatval($_POST['lat']);
        $lng = floatval($_POST['lng']);
        $stmt = $pdo->prepare("INSERT INTO geo_keywords VALUES (NULL, ?, ?, ?, ?)");
        $stmt->execute([$keyword, $lat, $lng, $_POST['radius'] ?? 5000]);
    }
    
距离算法实现
  • Haversine公式计算
    计算用户当前位置与关键词坐标的距离(单位:公里):
    function haversineDistance($lat1, $lng1, $lat2, $lng2) {
        $earthRadius = 6371;
        $dLat = deg2rad($lat2 - $lat1);
        $dLng = deg2rad($lng2 - $lng1);
        $a = sin($dLat/2) * sin($dLat/2) + 
             cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * 
             sin($dLng/2) * sin($dLng/2);
        $c = 2 * atan2(sqrt($a), sqrt(1-$a));
        return $earthRadius * $c;
    }
    
动态排序逻辑
  • 权重综合排序
    根据距离和搜索热度生成排序分数:
    $keywords = $pdo->query("SELECT * FROM geo_keywords WHERE keyword LIKE '%{$query}%'");
    $results = [];
    foreach ($keywords as $row) {
        $distance = haversineDistance($userLat, $userLng, $row['latitude'], $row['longitude']);
        $score = ($row['radius'] / max(1, $distance)) * log($row['search_count'] + 1);
        $results[] = ['keyword' => $row['keyword'], 'score' => $score];
    }
    usort($results, fn($a, $b) => $b['score'] <=> $a['score']);
    
技术栈建议
  • 前端交互
    使用Leaflet.js地图库实现坐标拾取,通过AJAX异步提交数据:

    map.on('click', function(e) {
        document.getElementById('lat').value = e.latlng.lat;
        document.getElementById('lng').value = e.latlng.lng;
        fetch('/api/save-keyword', { method: 'POST', body: new FormData(form) });
    });
    
  • 性能优化
    对频繁访问的数据使用Redis缓存,采用GEORADIUS命令快速查询附近关键词:

    $redis->geoadd('geo:keywords', $lng, $lat, $keyword);
    $results = $redis->georadius('geo:keywords', $userLng, $userLat, 50, 'km');
    
部署注意事项
  • 配置Nginx/Apache支持URL重写,实现SEO友好路径如/geo/关键词-城市
  • 使用Composer引入依赖包(如geocoder-php/google-maps-provider)处理地理编码
  • 定期通过cron任务更新关键词的热度统计数据

完整系统需包含用户权限管理、数据导入导出和日志监控模块,建议采用Laravel框架加速开发。

更多推荐