从谷歌地图网址获取坐标的最佳方法是什么?

时间:2017-11-18 20:33:32

标签: php google-maps

我已经编写了一个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;
}

1 个答案:

答案 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);