百度地图POI搜索在Symfony2里怎么实现?实战代码

雪夜

雪夜

2026-07-31

485人浏览

原创

symfony 2 不提供地图服务集成,poi搜索必须调用百度地图web api;foselasticabundle不适用,正确做法是用guzzle封装http请求,配置ak/sk、生成sn签名,解析location等关键字段。

百度地图poi搜索在symfony2里怎么实现?实战代码

Symfony 2 本身不提供地图服务集成能力,POI搜索必须走百度地图 Web API,不能靠 Doctrine 或原生数据库查询实现。

用 FOSElasticaBundle?别试了,它不处理 POI

FOSElasticaBundle 是为全文检索设计的,和地理坐标、POI 检索完全无关。有人误以为“Elasticsearch 支持 geo_point 就能查周边 POI”,但百度地图的 POI 数据不在你的 ES 里——你得先从 https://api.map.baidu.com/place/v2/search 拿到数据,再决定要不要存进 ES。直接拿 FOSElasticaBundle 去调百度接口,代码会报 Class not foundInvalid service configuration

正确做法:用 Guzzle 发起 HTTP 请求 + 自定义 Service

你需要一个轻量、可控、可复用的服务类来封装百度 POI 搜索逻辑。重点不是“集成框架”,而是“安全调用外部 API”。

百度一镜
百度一镜

百度一镜是百度电商数字人直播平台,可用于数字人直播间创建、互动配置、直播脚本和AI工具使用。

下载
  • ak 必须配置在 parameters.yml 中,绝不能硬编码;若用 Symfony 2.8+,建议加环境变量前缀防止泄露
  • 每次请求必须带 sn 签名(MD5(参数字符串 + sk)),否则返回 INVALID_SIGN
  • scope=2 才能拿到经纬度(location.lat/location.lng),scope=1 只返回基础字段,很多字段为空
  • 分页靠 page_numpage_size,但百度最多返回 400 条(20 页 × 20 条),超量需换关键词或区域

示例 Service 方法片段:

public function searchPoi($keyword, $region, $pageNum = 0)
{
    $ak = $this->container->getParameter('baidu_map_ak');
    $sk = $this->container->getParameter('baidu_map_sk');

    $params = [
        'query'     => $keyword,
        'region'    => $region,
        'output'    => 'json',
        'ak'        => $ak,
        'page_size' => 20,
        'page_num'  => $pageNum,
        'scope'     => 2,
    ];

    // sn 签名生成(注意:参数必须按字典序拼接,且 sk 放最后)
    ksort($params);
    $queryStr = http_build_query($params) . '&sk=' . $sk;
    $params['sn'] = md5(urlencode($queryStr));

    $client = new \GuzzleHttp\Client();
    $res = $client->get('https://api.map.baidu.com/place/v2/search', [
        'query' => $params,
    ]);

    return json_decode($res->getBody(), true);
}

结果解析时最容易漏掉的三个字段

百度返回的 results 数组里,真正可用的 POI 字段不是全都有值:

  • uid 是唯一标识,用于后续调 /place/v2/detail 获取营业时间、电话等扩展信息;但免费版 API 默认不返回,需确认是否开通“详情服务”权限
  • location 是对象(不是字符串),结构为 {"lat": 39.9042, "lng": 116.4074},直接 json_decode 后可取 $poi['location']['lat']
  • detail_url 字段在 scope=2 下才出现,但链接含临时 token,5 分钟后失效,不能长期存储或前端跳转

别指望一次请求拿全数据——百度对高频、大范围、低价值关键词(如“餐厅”“商店”)会限流或降权,真实项目中要结合 tag 参数(如 美食,快餐)缩小语义范围,并缓存高频 region+keyword 组合的结果。

相关文章

百度地图
百度地图

百度地图作为新一代人工智能地图,服务覆盖全球200+城市及国家。导航可信赖、语音交互更简单、数据丰富更贴心的百度地图,致力于为用户提供更准确、更丰富、更易用的出行服务。有需要的小伙伴快来保存下载体验吧!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
PHP Symfony框架
PHP Symfony框架

本专题专注于PHP主流框架Symfony的学习与应用,系统讲解路由与控制器、依赖注入、ORM数据操作、模板引擎、表单与验证、安全认证及API开发等核心内容。通过企业管理系统、内容管理平台与电商后台等实战案例,帮助学员全面掌握Symfony在企业级应用开发中的实践技能。

2025.09.11

1418

17

PHP API接口开发与RESTful实践
PHP API接口开发与RESTful实践

本专题聚焦 PHP在API接口开发中的应用,系统讲解 RESTful 架构设计原则、路由处理、请求参数解析、JSON数据返回、身份验证(Token/JWT)、跨域处理以及接口调试与异常处理。通过实战案例(如用户管理系统、商品信息接口服务),帮助开发者掌握 PHP构建高效、可维护的RESTful API服务能力。

2025.11.26

353

16

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

1560

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

1425

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

588

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

1335

7

Selenium WebDriver元素定位与页面操作教程
Selenium WebDriver元素定位与页面操作教程

本专题整理Selenium WebDriver元素定位、XPath、CSS Selector、等待机制、窗口切换、Frame处理、Alert弹窗、Cookie操作和文件上传等核心用法。

2026.08.05

0

26

Selenium Grid分布式测试与并行执行教程
Selenium Grid分布式测试与并行执行教程

本专题整理Selenium Grid架构、远程WebDriver、并行测试、Docker部署、Kubernetes动态Grid、浏览器矩阵和测试环境扩展方法,适合进阶自动化测试团队使用。

2026.08.05

0

18

Selenium常见报错排查与自动化测试稳定性
Selenium常见报错排查与自动化测试稳定性

本专题整理Selenium常见报错、驱动版本问题、元素找不到、点击失败、等待超时、浏览器闪退、脚本不稳定和测试用例维护方法。

2026.08.05

0

17

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Symfony2中文手册
Symfony2中文手册

共24课时 | 42.2万人学习

Symfony 官方文档
Symfony 官方文档

共0课时 | 0人学习

Composer手册
Composer手册

共0课时 | 0人学习