如何通过PHP从Google Maps短链接提取GPS经纬度?
从Google Maps短链接提取GPS坐标的PHP解决方案
核心思路
Google Maps短链接(如maps.app.goo.gl/xxx)本质是重定向链接,需先解析获取最终跳转的完整Google Maps长链接,再从长链接中提取GPS坐标——这比依赖API更高效,且无需API密钥和调用次数限制。
完整实现代码
1. 解析短链接获取完整长链接
function expandGoogleMapsShortLink($shortUrl) { $ch = curl_init($shortUrl); // 跟随重定向获取最终目标URL curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_NOBODY, true); // 仅获取响应头,避免下载页面内容 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 开发环境临时关闭SSL验证,生产环境建议开启 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_exec($ch); $finalUrl = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); curl_close($ch); return $finalUrl; }
2. 从长链接提取GPS坐标
Google Maps长链接有两种常见的坐标存储格式,正则匹配覆盖这两种情况:
function extractCoordinatesFromMapsUrl($mapsUrl) { // 匹配@lat,lng格式(如@48.8583701,2.2919064) if (preg_match('/@(-?\d+\.\d+),(-?\d+\.\d+)/', $mapsUrl, $matches)) { return [ 'latitude' => (float)$matches[1], 'longitude' => (float)$matches[2] ]; } // 匹配3d=lat和4d=lng参数格式(如3d48.8583701!4d2.2944813) if (preg_match('/3d(-?\d+\.\d+)/', $mapsUrl, $latMatch) && preg_match('/4d(-?\d+\.\d+)/', $mapsUrl, $lngMatch)) { return [ 'latitude' => (float)$latMatch[1], 'longitude' => (float)$lngMatch[1] ]; } return null; }
3. 组合使用示例
// 测试短链接 $shortLink = 'https://maps.app.goo.gl/GmCgwbfgzPHq1JeHA'; $expandedUrl = expandGoogleMapsShortLink($shortLink); if ($expandedUrl) { $coordinates = extractCoordinatesFromMapsUrl($expandedUrl); if ($coordinates) { print_r($coordinates); // 输出示例:Array ( [latitude] => 48.8583701 [longitude] => 2.2944813 ) } else { echo "无法从展开后的链接提取坐标"; } } else { echo "短链接解析失败"; }
之前方案的问题分析
- 第一种方案:未开启
CURLOPT_FOLLOWLOCATION选项,无法处理短链接的多层重定向,导致无法获取最终的长链接。 - 第二种方案:错误将短链接后缀(如
GmCgwbfgzPHq1JeHA)当作Place ID——该后缀仅为短链接的跳转标识,并非Google Places API认可的合法Place ID,因此调用API会返回INVALID_ARGUMENT错误。
内容的提问来源于stack exchange,提问作者Buddy
相关产品推荐
相关产品推荐

