我如何解码/编码新谷歌地图的网址参数?

las*_*nda 9 url google-maps url-encoding

我试图弄清楚如何在谷歌地图方向链接中提取开始/结束的纬度/经度,如下所示:

https://www.google.com/maps/preview#!data=!1m4!1m3!1d189334!2d-96.03687!3d36.1250439!4m21!3m20!1m4!3m2!3d36.0748342!4d-95.8040972!6e2! 1M5!1s1331-1399 + E + 14 + ST%2C +塔尔萨%2C + OK + 74120!2s0x87b6ec9a1679f9e5%3A0x6e70df70feebbb5e!3平方米!3d36.1424613!4D-95.9736986!3m8!1立方米!1d189334!2D-96.03687!3d36.1250439! 3平方米!1i1366!2i705!4f13.1&FID = 0

我在猜猜"!" 是变量后跟XY的分隔符,其中x是数字,y是小写字母,但不能完全弄清楚如何在变量的数量/顺序变化以及XY前缀的情况下可靠地提取坐标.

想法?谢谢

Jos*_*ert 10

嗯,这很老了,但是嘿.我自己一直在研究这个问题,所以这就是我的想法:

数据是一个编码的javascript数组,因此尝试生成自己的数据字符串时的技巧是确保格式化保持数组的结构完整.为此,让我们看看每个步骤代表什么.

正确地计算出来后,每个感叹号都定义了值定义的开始.第一个字符,一个int值,是一个内部计数,并且(我相信)充当标识符,尽管我不是100%肯定.就你可以拥有的东西而言,它似乎非常灵活,只要它是一个int.然而,第二个角色更为重要.它定义值的数据类型.我不知道我是否已找到所有数据类型,但我发现的数据类型是:

m: matrix
f: float
d: double
i: integer
b: boolean
e: enum (as integer)
s: string
u: unsigned int
x: hexdecimal value?
Run Code Online (Sandbox Code Playgroud)

其余的字符实际上保存了值本身,因此字符串将只保存字符串,布尔值将为"1"或"0",依此类推.然而,有一个重要的问题:矩阵数据类型.

矩阵的值将是整数.这是矩阵的长度,以值的数量来衡量.也就是说,对于矩阵!1mx,下一个x值定义将属于矩阵.这包括嵌套的矩阵定义,因此形式矩阵[[1,2]]看起来像!1m3!1m2!1i1!2i2(外部矩阵有三个子,内部矩阵有2个).这也意味着,为了从列表中删除值,您还必须检查矩阵祖先,如果它们存在,则更新它们的值以反映现在缺少的成员.

x数据类型是另一个异常.我猜它是十六进制编码用于大多数目的,但在我的特殊情况下(调用归因信息),他们似乎也使用x数据类型来存储纬度/经度信息,这不是以十六进制编码,但是是无符号长整型,其值设置为 value = coordinate<0 ? (430+coordinate)*1e7 : coordinate*1e7

以这种方式使用的x数据类型的示例(直接从谷歌地图中提取):https: //www.google.com/maps/vt?pb =!1m8!4m7!2u7!5m2!1x405712614!2x3250870890!6m2 !1x485303036!2x3461808386!2M1!1E0!2m20!1E2!2spsm!4平方米!1sgid!2sznfCVopRY49wPV6IT72Cvw!4平方米!1ssp!2S1!8m11!13m9!撒下!15B1!18m5!2B1!3B0!4B1!5b0!6b0!19B1!19u12 !3M1!5e1105!4E5!18m1!1B1

对于所提问题的上下文,重要的是要注意结构中没有可靠的标识符.Google会按特定顺序读取值,因此在构建您自己的编码数据时请始终牢记这些数据; 你需要做一些研究/测试来确定订单.至于阅读,你最好的希望是重建矩阵结构,然后扫描它看起来像lat/long值的东西(即一个矩阵包含两个类型为double(或x?)的子类)

  • 我根据你的答案创建了一个基本的Javascript Gist,将"data"属性值解析为`Array`:https://gist.github.com/jeteon/e71fa21c1feb48fe4b5eeec045229a0c (3认同)

Sta*_*ave 5

尝试这个。

function URLtoLatLng(url) {
  this.lat = url.replace(/^.+!3d(.+)!4d.+$/, '$1');
  this.lng = url.replace(/^.+!4d(.+)!6e.+$/, '$1');
  return this;
}

var url = new URLtoLatLng('https://www.google.com/maps/preview#!data=!1m4!1m3!1d189334!2d-96.03687!3d36.1250439!4m21!3m20!1m4!3m2!3d36.0748342!4d-95.8040972!6e2!1m5!1s1331-1399+E+14th+St%2C+Tulsa%2C+OK+74120!2s0x87b6ec9a1679f9e5%3A0x6e70df70feebbb5e!3m2!3d36.1424613!4d-95.9736986!3m8!1m3!1d189334!2d-96.03687!3d36.1250439!3m2!1i1366!2i705!4f13.1&fid=0');

console.log(url.lat + ' ' + url.lng);
Run Code Online (Sandbox Code Playgroud)


hel*_*ker 5

看起来当前浏览器(我正在使用Chrome)中的开发人员工具可以为您提供大量信息。

请尝试以下操作:

  • 使用Chrome浏览器访问Google Maps(或改编其他浏览器的说明);
  • 打开开发人员工具(Ctrl + Shift + I);
  • 转到网络选项卡。清除当前显示的值;
  • 拖动地图,直到出现带有编码数据的网址;
  • 单击该URL,然后转到“预览”子选项卡;

在此处输入图片说明