我已经编写了一个php函数来从谷歌地图网址获取坐标
此函数获取url
中的所有坐标(lat,lng)如果网址中有多个坐标,它将获取每个坐标并保存在数组
中e.g。
在第一个网址中,我想获得此坐标39.0101036,30.6895281
在第二个网址中,我想获得44.2850711,25.4921039
44.2897146,25.4775629
44.28462,25.5294405
它可以处理两种情况
$url="https://www.google.com/maps/place/Turkey/@39.0101036,30.6895281,6z/data=!3m1!4b1!4m5!3m4!1s0x14b0155c964f2671:0x40d9dbd42a625f2a!8m2!3d38.9893026!4d35.4364014?hl=en";
$url="https://www.google.com/maps/dir/Videle/44.2850711,25.4921039/44.2897146,25.4775629/44.28462,25.5294405/@44.2801102,25.4944293,14z/data=!4m11!4m10!1m5!1m1!1s0x40ade955dedb9419:0xe28ca19380f0b772!2m2!1d25.5332629!2d44.2748537!1m0!1m0!1m0!3e2?hl=en";
但我不确定处理所有案件是否足够
如果我的功能无法处理任何案件,请告诉我
function urlToCoor($url){
$originalUrl=$url;
$coor=array();
$at=strpos($url, "@");
$url=substr($url, $at+1);
$o=new Location();
//get lat
$comma=strpos($url, ",");
$lat=substr($url, 0, $comma);
$url=substr($url, $comma+1);
//get lng
$comma=strpos($url, ",");
$lng=substr($url, 0, $comma);
$url=substr($url, $comma+1);
$o->lat=$lat;
$o->lng=$lng;
array_push($coor, $o);
//get other coor
if(strpos($originalUrl, '/dir/Videle/')){
$coor=array();
$start=strpos($originalUrl, '/dir/Videle/')+12;
$end=strpos($originalUrl, '/@');
$url=substr($originalUrl, $start, $end - $start);
$otherCoor=explode('/', $url);
foreach($otherCoor as $value){
$lat=explode(',', $value)[0];
$lng=explode(',', $value)[1];
$o=new Location();
$o->lat=$lat;
$o->lng=$lng;
array_push($coor, $o);
}
}else if(strpos($originalUrl, '/dir/')){
$coor=array();
$start=strpos($originalUrl, '/dir/')+5;
$end=strpos($originalUrl, '/@');
$url=substr($originalUrl, $start, $end - $start);
$otherCoor=explode('/', $url);
foreach($otherCoor as $value){
$lat=explode(',', $value)[0];
$lng=explode(',', $value)[1];
$o=new Location();
$o->lat=$lat;
$o->lng=$lng;
array_push($coor, $o);
}
}
return $coor;
}
答案 0 :(得分:1)
在这种情况下,正则表达式可能比strpos更好。
https://regex101.com/r/txBSa9/1
$re = '/@(\d+\.\d+,\d+\.\d+)/';
$str = 'https://www.google.com/maps/place/Turkey/@39.0101036,30.6895281,6z/data=!3m1!4b1!4m5!3m4!1s0x14b0155c964f2671:0x40d9dbd42a625f2a!8m2!3d38.9893026!4d35.4364014?hl=en
https ://www.google.com/maps/dir/Videle/44.2850711,25.4921039/44.2897146,25.4775629/44.28462,25.5294405/@44.2801102,25.4944293,14z/data=!4m11!4m10!1m5!1m1!1s0x40ade955dedb9419:0xe28ca19380f0b772!2m2!1d25.5332629!2d44.2748537!1m0!1m0!1m0!3e2?hl=en';
preg_match_all($re, $str, $matches);
var_dump($matches);
这将匹配@
和带有以逗号分隔的点的数字。
$ array [1]将包含以下的子阵列;
array(2) {
[0]=>
string(21)
"39.0101036,30.6895281"
[1]=>
string(21)
"44.2801102,25.4944293"
}
更新:
然后尝试一下。 https://3v4l.org/pgDRN
它将获得链接中的所有lat / lon并将它们保存在单独的数组中。
$ matches [0]是完全匹配,意思是lat和lon。
$ matches [1]是拉特。
$ matches [2]是lons。
$re = '/(\d+\.\d+),(\d+\.\d+)/';
$str = 'https://www.google.com/maps/place/Turkey/@39.0101036,30.6895281,6z/data=!3m1!4b1!4m5!3m4!1s0x14b0155c964f2671:0x40d9dbd42a625f2a!8m2!3d38.9893026!4d35.4364014?hl=en
https ://www.google.com/maps/dir/Videle/44.2850711,25.4921039/44.2897146,25.4775629/44.28462,25.5294405/@44.2801102,25.4944293,14z/data=!4m11!4m10!1m5!1m1!1s0x40ade955dedb9419:0xe28ca19380f0b772!2m2!1d25.5332629!2d44.2748537!1m0!1m0!1m0!3e2?hl=en';
preg_match_all($re, $str, $matches);
var_dump($matches);