2013-08-23 8 views
6

Im cercando di capire come estrarre la latitudine/longitudine di inizio/fine a un google maps direzioni dei collegamenti che assomiglia a questo: "!"come faccio a decodificare/codificare i parametri url per le nuove 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 indovinando il è un separatore tra le variabili seguito da XY dove x è un numero ey è una lettera minuscola, ma non è in grado di capire come estrarre in modo affidabile le coordinate quando il numero/ordine delle variabili cambia così come i loro prefissi XY.

idee? grazie

risposta

0

Prova questo.

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

Bene, questo è vecchio, ma hey. Ho lavorato su questo un po 'me stesso, quindi ecco cosa ho capito:

I dati sono un array javascript codificato, quindi il trucco quando si cerca di generare la propria stringa di dati è assicurarsi che la propria formattazione mantenga la struttura dell'array è intatta. Per fare questo, diamo un'occhiata a ciò che ogni passo rappresenta.

Come si è capito correttamente, ciascun punto esclamativo definisce l'inizio di una definizione di valore. Il primo carattere, un valore int, è un conteggio interno e (credo) agisce come un identificatore, anche se non ne sono sicuro al 100%. Sembra essere abbastanza flessibile in termini di ciò che puoi avere qui, purché sia ​​un int. Il secondo personaggio, tuttavia, è molto più importante. Definisce il tipo di dati del valore. Non so se ho trovato ancora tutti i tipi di dati, ma quelli che ho capito sono:

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

i caratteri rimanenti in realtà contengono il valore stesso, in modo da una stringa sarà solo contenere la stringa, un booleano sarà '1' o '0', e così via. Tuttavia, c'è un trucchetto importante: il tipo di dati della matrice.

Il valore della matrice sarà un numero intero. Questa è la lunghezza della matrice, misurata nel numero di valori. Cioè, per una matrice! 1mx, le prossime definizioni di valore x apparterranno alla matrice. Ciò include le definizioni di matrice annidate, quindi una matrice di forma [[1,2]] assomiglierebbe a !1m3!1m2!1i1!2i2 (la matrice esterna ha tre figli, la matrice interna ne ha 2). questo significa anche che, per rimuovere un valore dall'elenco, è necessario anche controllarlo per gli antenati di matrice e, se esistono, aggiornare i loro valori per riflettere il membro ora mancante.

Il tipo di dati x è un'altra anomalia. Immagino che sia codificato in modo esadecimale per la maggior parte degli scopi, ma nella mia situazione particolare (facendo una richiesta di informazioni di attribuzione), sembrano usare anche il tipo di dati x per memorizzare informazioni lat/long e questo NON è codificato in esadecimale , ma è un unsigned long con il valore impostato come value = coordinate<0 ? (430+coordinate)*1e7 : coordinate*1e7

un esempio (estratto direttamente da google maps) del tipo x dati utilizzati in questo modo: 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

Per il contesto della domanda posta , è importante notare che non ci sono identificatori affidabili nella struttura. Google legge i valori in un ordine specifico, quindi tieni sempre presente quando crei i tuoi dati codificati in base ai quali l'ordine è importante; dovrai fare qualche ricerca/test per determinare quell'ordine. Per quanto riguarda la lettura, la tua migliore speranza è ricostruire la struttura della matrice, quindi scansionarla per qualcosa che assomiglia a valori lat/long (cioè una matrice che contiene esattamente due figli di tipo double (o x?))

+1

ho creato una base Javascript Gist in base alla risposta per analizzare i "dati" valore di attributo in un 'Array': https://gist.github.com/jeteon/e71fa21c1feb48fe4b5eeec045229a0c – jeteon

1

Sembra che gli strumenti di sviluppo dei browser correnti (sto utilizzando Chrome per questo) possano darti molte informazioni.

Provare quanto segue:

  • Vai con Chrome Google Maps (o adattare le istruzioni sugli altri browser);
  • Strumenti di sviluppo aperti (Ctrl + Shift + I);
  • Passare alla scheda Rete. Cancella i valori visualizzati correnti;
  • Trascinare la mappa finché non viene visualizzato un url con dati codificati;
  • Fare clic su tale URL, quindi andare alla sottoscheda Anteprima;

enter image description here

Problemi correlati