2013-08-23 5 views
6

Im zu versuchen, herauszufinden, wie man die Länge/Breite des Start/Ende in einer Google-Maps zu extrahieren Richtungen Link, der wie folgt aussieht: "!"Wie dekodiere/kodiere ich die URL-Parameter für die neuen Google Maps?

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

Im Erraten der ist ein Trennzeichen zwischen Variablen gefolgt von XY, wobei x eine Zahl und y ein Kleinbuchstabe ist, aber nicht genau herausfinden kann, wie man die Koordinaten zuverlässig extrahiert, wenn sich die Anzahl/Reihenfolge der Variablen sowie ihre XY-Präfixe ändern.

Ideen? danke

Antwort

0

Versuchen Sie es.

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); 
4

Nun, das ist alt, aber hey. Ich habe selbst ein wenig daran gearbeitet, also habe ich Folgendes herausgefunden:

Die Daten sind ein codiertes Javascript-Array, also ist der Trick, wenn Sie versuchen, Ihre eigene Datenkette zu generieren, sicherzustellen, dass Ihre Formatierung beibehalten wird Die Struktur des Arrays ist intakt. Sehen wir uns dazu an, was jeder Schritt darstellt.

Wie Sie richtig herausgefunden haben, definiert jedes Ausrufezeichen den Beginn einer Wertdefinition. Das erste Zeichen, ein int-Wert, ist ein innerer Zählwert, und (glaube ich) wirkt als ein Identifizierer, obwohl ich nicht 100% sicher bin. Es scheint ziemlich flexibel in Bezug auf was Sie hier haben können, solange es ein Int ist. Der zweite Charakter ist jedoch viel wichtiger. Es definiert den Datentyp des Wertes. Ich weiß nicht, ob ich noch alle Datentypen gefunden haben, aber die, die ich herausgefunden haben, sind:

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

die verbleibenden Zeichen halten tatsächlich den Wert selbst, so dass ein String wird nur die Zeichenfolge halten, Ein boolescher Wert wird '1' oder '0' sein und so weiter. Es gibt jedoch ein wichtiges Problem: den Matrix-Datentyp.

Der Wert der Matrix wird eine ganze Zahl sein. Dies ist die Länge der Matrix, gemessen in der Anzahl der Werte. Das heißt, für eine Matrix! 1mx gehören die nächsten x-Wertdefinitionen zur Matrix. Dies beinhaltet verschachtelte Matrixdefinitionen, so dass eine Matrix der Form [[1,2]] wie !1m3!1m2!1i1!2i2 aussehen würde (äußere Matrix hat drei untergeordnete, innere Matrix hat 2). Das bedeutet auch, dass Sie, um einen Wert aus der Liste zu entfernen, auch nach Matrix-Vorfahren suchen müssen und, falls vorhanden, ihre Werte aktualisieren, um das nun fehlende Element wiederzugeben.

Der x-Datentyp ist eine weitere Anomalie. Ich gehe davon aus, dass es für die meisten Zwecke hexadezimal kodiert ist, aber in meiner speziellen Situation (Aufruf von Attributinformationen) scheinen sie auch den x-Datentyp zu verwenden, um lat/long-Informationen zu speichern, und dies ist NICHT hexadezimal kodiert , sondern ist ein unsigned long mit dem Wert eingestellt, wie value = coordinate<0 ? (430+coordinate)*1e7 : coordinate*1e7

ein Beispiel für den x-Datentyp verwendet wird, auf diese Weise (direkt von google Maps gezogen): 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

Für den Kontext der Frage gestellt Es ist wichtig zu beachten, dass es in der Struktur keine zuverlässigen Bezeichner gibt. Google liest die Werte in einer bestimmten Reihenfolge. Denken Sie beim Erstellen Ihrer eigenen codierten Daten daran, dass die Bestellung wichtig ist. Sie müssen einige Untersuchungen durchführen, um diese Reihenfolge zu bestimmen. Was das Lesen angeht, besteht Ihre beste Hoffnung darin, die Matrixstruktur neu aufzubauen und dann nach etwas zu suchen, das wie lat/long-Werte aussieht (d. H. Eine Matrix, die genau zwei Kinder vom Typ double (oder x?))

+1

ich eine grundlegende Javascript Gist erstellt auf der Grundlage Ihrer Antwort die „Daten“ Attributwert in einen 'Array' zu analysieren: https://gist.github.com/jeteon/e71fa21c1feb48fe4b5eeec045229a0c – jeteon

1

Sieht aus wie die Entwickler-Tools von aktuellen Browsern (ich verwende Chrome dafür) kann Ihnen eine Menge Informationen geben.

Versuchen Sie Folgendes:

  • Zur Google Maps mit Chrome (oder die Anweisungen für andere Browser anpassen);
  • Öffnen Sie die Entwicklertools (Strg + Umschalt + I);
  • Gehen Sie zur Registerkarte Netzwerk. Löschen Sie die aktuell angezeigten Werte.
  • Ziehen Sie die Karte, bis eine URL mit codierten Daten angezeigt wird.
  • Klicken Sie auf diese URL und dann auf die Unterregisterkarte Vorschau;

enter image description here

Verwandte Themen