google-maps - 我如何解码/编码新谷歌地图的 url 参数?

标签 google-maps url 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+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 前缀发生变化时可靠地提取坐标。

想法?
谢谢

最佳答案

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

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

其余字符实际上保存值本身,因此字符串将只保存字符串, bool 值将是“1”或“0”,依此类推。但是,有一个重要的问题:矩阵数据类型。

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

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!2b1!3b0!4b1!5b0!6b0!19b1!19u12!3m1!5e1105!4e5!18m1!1b1

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

关于google-maps - 我如何解码/编码新谷歌地图的 url 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18413193/

相关文章:

internet-explorer - IE url 长度限制是否适用于 "#"之后的内容?

c# - Uri.AbsoluteUri 与 Uri.OriginalString

android - 如何禁用使用 Flutter 1.0 在 Google map 中点击标记时出现的导航按钮?

android查找谷歌地图上两点之间的距离和持续时间

android - 街景在 android 应用程序中显示错误消息

jquery - 将外部内容加载到 div 中时的导航

java - Struts2 URL中 ".action"扩展意义的解释

javascript - 如何在调用后内容类型中转义 + 作为 application/x-www-form-urlencoded

url - 从浏览器地址栏中复制 UTF-8 URL,只给出丑陋的编码 URL

android - 在自定义图 block 上使用 Google map KML 导入实用程序