从谷歌地图URL的ftid(十六进制)获取经纬度

4
当使用安卓谷歌地图应用程序的共享按钮分享位置时,它只会将一个URL作为意图返回到其他应用程序中,例如:

https://goo.gl/maps/tkNXzF2krmR2

这是一个谷歌短链接,可通过谷歌短链接API将其转换为长链接,如下所示:

http://maps.google.com/?q=Tehran+Province,+Tehran,+Banafsheh+3&ftid=0x3f8dfd04d309f925:0x2867166b05b0bfe6&hl=en≷=us&shorturl=1

显然,此URL没有纯纬度和经度值。但似乎在ftid参数后面有值,该值与“:”字符分隔。

请帮助我从这种十六进制格式中提取纬度和经度值。

我正在使用PHP语言,但其他语言也可以帮助。

我需要像这样的函数(这不起作用):

    function hextolatlon($hex){
            // 假设hex是一个值,例如0x1446041F或0x447D1100
            // 转换为有符号整数
            $h=$hex&0xFF;
            $h=($h>>8)&0xFF;
            $h=($h>>16)&0xFF;
            $h=($h>>24)&0xFF;
            $negative=($h>>31)!=0; // 获取符号
            if($negative){
                $h=~$h;
                $h=$h&0x7FFFFFFF;
                $h++;
            }
            // 转换为度和分
            $degrees=floor($h/10000000);
            $minutes=$h%10000000;
            // 转换为完整度数
            $degrees+=($minutes/100000.0) / 60.0;
            if($negative)$degrees=-$degrees;
            return $degrees;
        }

将0x3f8dfd04d309f925转换为类似35.74388的内容。非常感谢。

2个回答

13

我认为回复晚一些总比没有回复好。

你试图解密的FTID参数不一定存储纬度和经度。如果它与地图位置有关(例如咖啡馆、时装店),那么冒号后面的第二部分是指客户ID。

举个实际例子,参数如下:

!1s0x6ad63fbf56e24c27:0xe665b3308d32f379

可以这样理解

0xe665b3308d32f379  ---hex-to-dec--->  16601872622479930233

并且https://google.com/maps?cid=16601872622479930233将会带你到所标记的位置。

如何从中提取坐标?如果只有少量样本,可以手动完成。点击上面的链接,1-2秒后,Google地图将刷新浏览器中的URL。现在它包含了该地址的确切坐标,即!3d!4d参数。

如果您有很多样本和/或想要自动化该过程,则必须使用Google Maps API(例如,请查看此链接)。

我还没弄清楚以下问题: 1)第一个参数保存了什么信息, 2)如果FTID参数指向地址或地理位置,应如何理解。

请查看我在这里发布的问题以获取更多细节。


1
function ftid_to_latlong($ftid)
{
    $fetch = curl_request("https://www.google.com/maps?ftid=$ftid");
    preg_match("/\"$ftid\",.*?(\d+\.\d+),(\d+\.\d+)/", $fetch, $geo);
    return [$geo[1], $geo[2]];
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接