Let's take a look at a Google "Embed map" URL for a random lat-long. You can obtain one of these by clicking a random point on a Google Map, then clicking the lat-long hyperlink on the popup that appears at the bottom of the page. From there the map sidebar swings out; choose Share -> Embed map - that's your URL.
"https://www.google.com/maps/embed?pb= !1m18!1m12!1m3!1d3152.8774048836685 !2d145.01352231578036 !3d-37.792912740624445!2m3!1f0!2f0!3f0!3m2!1i1024!2i768 !4f13.1!3m3!1m2!1s0x0%3A0x0!2zMzfCsDQ3JzM0LjUiUyAxNDXCsDAwJzU2LjYiRQ !5e0!3m2!1sen!2sau!4v1471218824160"Well, it's not pretty, but with the help of Andrew Whitby's cheat sheet and the comments from others, it turns out we can actually render it as a nested structure knowing that the format [id]m[n] means a structure (multi-field perhaps?) with n children in total - my IDE helped a lot here with indentation:
"https://www.google.com/maps/embed?pb=" + "!1m18" + "!1m12" + "!1m3" + "!1d3152.8774048836685" + "!2d145.01352231578036" + "!3d-37.792912740624445" + "!2m3" + "!1f0" + "!2f0" + "!3f0" + "!3m2" + "!1i1024" + "!2i768" + "!4f13.1" + "!3m3" + "!1m2" + "!1s0x0%3A0x0" + "!2zMzfCsDQ3JzM0LjUiUyAxNDXCsDAwJzU2LjYiRQ" + "!5e0" + "!3m2" + "!1sen" + "!2sau" + "!4v1471218824160"It all (kinda) makes sense! You can see how a decoder could quite easily be able to count ! characters to decide that a bang-group (or could we call it an m-group?) has finished. I'm going to take a stab and say the e represents an enumerated type too - given that !5e0 is "roadmap" (default) mode and !5e1 forces "satellite" mode.
So this is all very well but it doesn't explain why URLs that I generate using the standard method don't actually put the lat-long I selected into the URL - yet they render perfectly! What do I mean? Well, the lat-long that I clicked on (i.e. the marker) for this example is actually:
-37.792916, 145.015722And yet in the URL it appears (kinda) as:
-37.792912, 145.013522Which is enough to be slightly, visibly, annoyingly, wrong if you're trying to use it as-is by parsing the URL. What I thought I needed to understand now was this section of the URL:
"!1d3152.8774048836685" + "!2d145.01352231578036" + "!3d-37.792912740624445" +Being the "scale" and centre points of the map. Then I realised - it's quite subtle, but for (one presumes) aesthetic appeal, Google doesn't put the map marker in the dead-centre of the map. So these co-ordinates are just the map centre. The marker itself is defined elsewhere. And there's only one place left. The mysterious z field:
!2zMzfCsDQ3JzM0LjUiUyAxNDXCsDAwJzU2LjYiRQSure enough, substituting the z-field from Mr. Whitby's example completely relocates the map to put the marker in the middle of Iowa. So now; how to decode this? Well, on a hunch I tried base64decode-ing it, and bingo:
% echo MzfCsDQ3JzM0LjUiUyAxNDXCsDAwJzU2LjYiRQ | base64 --decode 37°47'34.5"S 145°00'56.6"ESo there we have it. I can finally parse out the lat-long of the marker when given an embed URL. Hope it helps someone else out there...