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?))
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