12

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

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

我猜“!” 是变量之间的分隔符,后跟 XY,其中 x 是数字,y 是小写字母,但不能完全弄清楚如何在变量的数量/顺序及其 XY 前缀发生变化时可靠地提取坐标。

想法?谢谢

4

3 回答 3

15

嗯,这是旧的,但是,嘿。我自己一直在研究这个,所以这就是我想出的:

数据是一个编码的 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?

其余字符实际上保存值本身,因此字符串将只保存字符串,布尔值将是“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!4m2!1sgid!2sznfCVopRY49wPV6IT72Cvw!4m2!1ssp!2s1!8m11!13m9!2sa!15b1!18m5!2b1160b0!4b1!1b!u!4b160b0!4b1!1b! !3m1!5e1105!4e5!18m1!1b1

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

于 2015-12-14T19:32:05.960 回答
6

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

尝试以下操作:

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

在此处输入图像描述

于 2017-06-26T00:46:29.207 回答
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);

于 2013-08-23T23:42:55.060 回答