在php项目中集成高德地图定位服务,首先需要完成高德开放平台的账号注册和服务申请,之后通过php发送HTTP请求调用对应接口即可实现定位相关功能。整个流程分为前期准备、接口调用、结果处理三个核心环节,下面逐步展开说明。

一、前期准备工作
在调用高德地图api之前,需要完成以下基础准备:
- 注册高德开放平台账号,进入控制台创建应用,获取专属的
key,这是调用所有高德api的必要凭证 - 根据需求选择对应的服务类型,定位相关常用服务包括地理编码、逆地理编码、IP定位等,需要在控制台为应用开通对应权限
- 确认服务器的网络环境可以正常访问高德api的接口域名,避免出现请求超时的问题
二、核心接口调用方法
1. IP定位接口调用
IP定位接口可以根据用户IP地址获取对应的地理位置坐标,适合无法获取设备GPS信息的场景。接口请求地址为https://restapi.amap.com/v3/ip,请求参数如下:
| 参数名 | 是否必填 | 说明 |
|---|---|---|
| key | 是 | 高德开放平台申请的密钥 |
| ip | 否 | 需要定位的IP地址,不填则默认使用请求方的公网IP |
| output | 否 | 返回数据格式,可选json或xml,默认json |
php中使用curl发送请求的示例代码如下:
<?php
/**
* 调用高德IP定位接口
* @param string $key 高德api密钥
* @param string $ip 待定位的IP地址,为空则使用请求方IP
* @return array 定位结果数组
*/
function getLocationByIp($key, $ip = '') {
$url = 'https://restapi.amap.com/v3/ip';
$params = [
'key' => $key,
'output' => 'json'
];
if (!empty($ip)) {
$params['ip'] = $ip;
}
$queryStr = http_build_query($params);
$requestUrl = $url . '?' . $queryStr;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $requestUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
// 如果需要代理可以取消下面注释配置
// curl_setopt($ch, CURLOPT_PROXY, '127.0.0.1');
// curl_setopt($ch, CURLOPT_PROXYPORT, 8080);
$response = curl_exec($ch);
$error = curl_error($ch);
curl_close($ch);
if (!empty($error)) {
return ['status' => 'error', 'msg' => '请求失败:' . $error];
}
$result = json_decode($response, true);
if ($result['status'] == 1) {
return ['status' => 'success', 'data' => $result];
} else {
return ['status' => 'error', 'msg' => '接口返回错误:' . $result['info']];
}
}
// 使用示例
$amapKey = '你的高德api密钥';
$locationResult = getLocationByIp($amapKey, '192.168.0.1');
print_r($locationResult);
?>
2. 地理编码接口调用
地理编码接口可以将结构化地址转换为对应的经纬度坐标,比如将"北京市朝阳区望京SOHO"转换为具体的经纬度。接口地址为https://restapi.amap.com/v3/geocode/geo,核心参数除了key和output之外,还需要传入address参数指定待转换的地址,可选传入city参数指定城市限定范围,提升转换准确率。
对应的php实现代码如下:
<?php
/**
* 地址转坐标(地理编码)
* @param string $key 高德api密钥
* @param string $address 待转换的结构化地址
* @param string $city 限定城市,可选
* @return array 转换结果
*/
function addressToCoordinate($key, $address, $city = '') {
$url = 'https://restapi.amap.com/v3/geocode/geo';
$params = [
'key' => $key,
'address' => $address,
'output' => 'json'
];
if (!empty($city)) {
$params['city'] = $city;
}
$queryStr = http_build_query($params);
$requestUrl = $url . '?' . $queryStr;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $requestUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$response = curl_exec($ch);
$error = curl_error($ch);
curl_close($ch);
if (!empty($error)) {
return ['status' => 'error', 'msg' => '请求失败:' . $error];
}
$result = json_decode($response, true);
if ($result['status'] == 1) {
return ['status' => 'success', 'data' => $result['geocodes']];
} else {
return ['status' => 'error', 'msg' => '接口返回错误:' . $result['info']];
}
}
// 使用示例
$amapKey = '你的高德api密钥';
$coordinateResult = addressToCoordinate($amapKey, '北京市朝阳区望京SOHO', '北京');
print_r($coordinateResult);
?>
3. 逆地理编码接口调用
逆地理编码接口的作用和地理编码相反,是将经纬度坐标转换为对应的结构化地址信息,适合获取到用户GPS坐标后需要展示具体地址的场景。接口地址为https://restapi.amap.com/v3/geocode/regeo,核心参数为location,格式为经度,纬度,比如116.481488,39.990464。
php实现代码如下:
<?php
/**
* 坐标转地址(逆地理编码)
* @param string $key 高德api密钥
* @param string $location 经纬度坐标,格式为经度,纬度
* @return array 转换结果
*/
function coordinateToAddress($key, $location) {
$url = 'https://restapi.amap.com/v3/geocode/regeo';
$params = [
'key' => $key,
'location' => $location,
'output' => 'json'
];
$queryStr = http_build_query($params);
$requestUrl = $url . '?' . $queryStr;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $requestUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$response = curl_exec($ch);
$error = curl_error($ch);
curl_close($ch);
if (!empty($error)) {
return ['status' => 'error', 'msg' => '请求失败:' . $error];
}
$result = json_decode($response, true);
if ($result['status'] == 1) {
return ['status' => 'success', 'data' => $result['regeocode']];
} else {
return ['status' => 'error', 'msg' => '接口返回错误:' . $result['info']];
}
}
// 使用示例
$amapKey = '你的高德api密钥';
$addressResult = coordinateToAddress($amapKey, '116.481488,39.990464');
print_r($addressResult);
?>
三、注意事项
- 高德api的
key需要妥善保管,不要暴露在前端代码中,避免被他人盗用产生额外费用 - 接口调用有每日配额限制,正式上线前需要根据业务量评估配额是否充足,必要时申请提升配额
- 请求返回的结果中
status为1表示请求成功,为0表示请求失败,失败原因可以通过info字段查看 - 如果项目部署在本地测试环境,访问公网接口时如果遇到SSL证书验证问题,可以临时关闭curl的SSL验证,正式环境建议开启验证
高德地图api的更多参数和高级功能可以参考官方文档,本文仅针对php集成定位服务的核心场景做了说明,开发者可以根据实际需求扩展更多功能。