Ho utilizzato la nuova tecnica delle interfacce REST per fornire un nuovo componente aggiuntivo di geocodifica. Al centro c'è la chiamata alla rispettiva interfaccia REST di MapQuest , una società che fornisce numerosi servizi e applicazioni di routing.
Uno dei servizi di MapQuest è il routing. Per ogni coppia di indirizzi forniti, MapQuest restituisce la latitudine e la longitudine di ciascuna posizione, oltre a informazioni amministrative come paese e stato. Fornisce anche le posizioni di tutti i waypoint tra i due punti e dove cambiare direzione per viaggiare dal primo indirizzo al secondo. Vengono fornite anche informazioni di riepilogo come la distanza totale e il tempo di viaggio stimato. Se la funzione viene chiamata con solo due indirizzi, restituisce il percorso e / o la distanza tra loro. Se fornisci un elenco di indirizzi, i percorsi verranno calcolati per ogni coppia di elementi di elenco consecutivi. Verranno quindi forniti i collegamenti tra l'elemento 1 e l'elemento 2, tra l'elemento 2 e l'elemento 3 e così via. Un elenco di n posizioni produrrà n-1 rotte.
Poiché le tabelle di dati sono il modo usuale per raccogliere informazioni in formato JMP , l'analisi inizia con l'assegnazione dei ruoli da parte dell'utente alle colonne della tabella dati tramite una finestra di dialogo utente. Il Componente aggiuntivo Geocoding 2020 funziona allo stesso modo. Dopo che l'utente ha completato la finestra di dialogo, il programma raccoglie i dati rilevanti dalla tabella dati, li traduce nella struttura richiesta dall'API REST e quindi li invia a MapQuest. Quindi, la struttura approssimativa del programma è: 1) completare la finestra di dialogo utente, 2) raccogliere dati, 3) preparare i dati per l'interfaccia, 4) inviare la richiesta dell'interfaccia, 5) interpretare i risultati, 6) scrivere le tabelle di dati JMP. La terza fase, la preparazione dei dati, è definita come una funzione ed è disponibile come MapQuest_route.jsl nel JSL Cookbook. Puoi incorporarlo nella tua applicazione geografica o utilizzarlo per ottenere idee su come strutturare i dati per le chiamate REST.
Funzionalità di base
Tu o qualsiasi utente del tuo programma avete bisogno di un vlid Chiave API da MapQuest.
I dati JMP si presentano sotto forma di colonne di tabelle di dati, mentre le interfacce REST utilizzano molto probabilmente strutture JSON. Di conseguenza, è necessaria una funzionalità che si traduca tra entrambi i formati. Il JSL dispone anche di strutture per la raccolta dei dati, elenchi o array associativi. Lo scopo di questa funzione è incapsulare tutti i comandi JSL non nativi. I dati necessari vengono forniti con le tipiche variabili JSL in formato carattere, numerico o elenco. Anche i dati restituiti dalla chiamata arrivano come elenchi JSL. Quindi, l'incorporamento di questa funzione in uno script JSL non richiede alcuna conoscenza aggiuntiva oltre agli standard JSL.
L'interfaccia
Le funzioni JSL vengono chiamate con un'istruzione come:
risultato = funzione ();
Se la funzione necessita o accetta parametri, questi sono elencati tra parentesi. Questa funzione, GC_route, può essere chiamata con parentesi vuote o con un elenco completo di parametri. Chiamandolo tra parentesi vuote si richiama una finestra di definizione dei parametri con una struttura per input e output, come mostrato nelle sezioni seguenti:

I parametri in una chiamata di funzione sono sempre parametri posizionali. Quando la funzione viene chiamata con parametri, è necessario fornire TUTTI i parametri obbligatori, ma possono essere vuoti.
Nel mio post del blog sul mio componente aggiuntivo di geocodifica , Ho utilizzato alcuni dei siti turistici locali nella mia città natale come esempi di come utilizzare il componente aggiuntivo. Prendiamo due di questi per vedere come funziona questa interfaccia:

|
Alte Freiheit 24a, 42103 Wuppertal, Germania
|
Wuppertaler Schwebebahn, una ferrovia sospesa lunga 13 km, la più antica ferrovia sopraelevata elettrica con vagoni sospesi nel mondo, inaugurata nel 1901.
|

|
Schloßplatz 2, 42659 Solingen, Deutschland
|
Schloss Burg, un castello ricostruito, originario del 12 th secolo.
|
Innanzitutto, è necessaria una chiave di accesso da MapQuest, supponiamo che sia 1234ABCD. Inoltre, supponi che:
- Ogni indirizzo è solo una stringa di testo.
- Hai fornito una coppia di stringhe di indirizzi; nessuna tabella dati è coinvolta.
- Vuoi viaggiare in macchina.
- Ti interessano solo distanze e tempi di percorrenza.
- Vuoi le distanze in miglia.
Un modo per utilizzare questa interfaccia è prendere le stringhe degli indirizzi così come sono. In questo caso, l'indicatore di formato (posizione 2) deve essere 1 o più grande. Quindi, la chiamata alla funzione ha questo aspetto:
routes = GC_route ("1234ABCD", "", 1, "fastest", "m", {"Alte Freiheit 24a, 42103 Wuppertal, Deutschland",<BR /> "Schloßplatz 2, 42659 Solingen, Deutschland"}, {}, {}, {}, {}, {}, {});
Se gli indirizzi non sono in una stringa, ma in elementi separati, l'indicatore di formato deve essere 0 (zero), il che significa che la tua chiamata sarebbe simile a:
routes = GC_route ("1234ABCD", "", 0, "fastest", "m", {}, {"Deutschland", "Deutschland"}, {},
{"Wuppertal", "Solingen"}, {42103, 42659}, {"Alte Freiheit 24a", "Schloßplatz 2"}, {})
Ovviamente non è necessario inserire i valori come parametri; è anche possibile fornire una variabile, ad esempio una variabile di elenco con l'elenco dei nomi dei paesi.

In ogni caso, il risultato è lo stesso elenco di dati:
{200, "HTTP/1.1 200 OK", "", {}, {""}, {51.256414, 51.137675}, {7.148503, 7.152488}, {"close", "exact"},{"DE", "DE"},<BR />{"North Rhine-Westphalia", "North Rhine-Westphalia"}, {"Wuppertal", "Solingen"}, {"42103", "42659"},<BR /> {"Elberfeld", "Unterburg"}, {"Alte Freiheit", "Schloßplatz 2"}, {., 16.002}, {., 1600}, {}, {}, {0, 1}, [=>], }
Vengono trovate entrambe le posizioni e vengono calcolati la distanza e il tempo di percorrenza. Pertanto, il parametro cinque è un elenco con una stringa vuota. Alla fine, c'è il simbolo di un array associativo vuoto ([=>]). È vuoto perché il parametro 13, flag di dettaglio, è stato impostato a zero. Altrimenti, le informazioni di instradamento potrebbero essere trovate in questo array.
Una modifica minore nell'elenco dei parametri della chiamata provoca una modifica significativa nell'output. Questa è la modifica del parametro 13, il flag "dettaglio". Se è impostato su 1, l'output viene esteso da un array che contiene tutte le informazioni di routing:
{200, "HTTP/1.1 200 OK", "", {}, {""}, {51.20971, 51.21327}, {7.07255, 7.08376},{"exact", "exact"}, {"DE", "DE"},<BR /> {"Nordrhein-Westfalen", "Nordrhein-Westfalen"}, {"", ""}, {"42653", "42653"}, {"Solingen", "Solingen"},<BR /> {"Klosterhof 4", "Lützowstraße 347"}, {., 1.0767}, {., 965}, {}, {}, {0, 1},<BR /> ["gc#city" => {"Solingen", ., ., ., ., ., ., ., ., "Solingen"},
"gc#coordtype" => {"Point of Interest", "Waypoint", "Waypoint", "Waypoint", "Waypoint", "Waypoint", "Waypoint", "Waypoint", "Waypoint", "lPoint of Interest"},
"gc#ctrycd" => {"DE", ., ., ., ., ., ., ., ., "DE"},
"gc#dist" => {., 0.0064, 0.0499, 0.1481, 0.0853, 0.2366, 0.2993, 0.2478, 0.0032, 1.0767},<BR />"gc#district" => {"", ., ., ., ., ., ., ., ., ""},
"gc#lat" => {51.20971, 51.2099, 51.209949, 51.210171, 51.209187, 51.209667, 51.210789, 51.212135,51.213226, 51.21327},
"gc#leg" => {0, 1, 1, 1, 1, 1, 1, 1, 1},
"gc#long" => {7.07255, 7.072152, 7.072176, 7.072798, 7.074032, 7.074655, 7.077532, 7.081177, 7.084009, 7.08376},
"gc#msg" => {"", ., ., ., ., ., ., ., .},
"gc#postalc" => {"42653", ., ., ., ., ., ., ., ., "42653"},
"gc#ql" => {"exact", ., ., ., ., ., ., ., ., "exact"},
"gc#resp" => {0, ., ., ., ., ., ., ., .},
"gc#state" => {"Nordrhein-Westfalen", ., ., ., ., ., ., ., ., "Nordrhein-Westfalen"},<BR />"gc#street" => {"Klosterhof 4", "Klosterhof", ., "Gerberstraße", ., "Gräfrather Heide", .,<BR /> "Gräfrather Heide", "Lützowstraße", "Lützowstraße 347"},
"gc#time" => {., "00:00:05", "00:00:45", "00:02:13", "00:01:17", "00:03:32", "00:04:28", "00:03:42", "00:00:03", "00:16:05"},
"gc#wpidx" => {0, 1, 2, 3, 4, 5, 6, 7, 8, 0}], }
Per semplicità, questo esempio utilizza un percorso tra due luoghi vicini l'uno all'altro. La rotta è composta da otto waypoint tra il punto di partenza e quello di arrivo. Sono enumerati nell'ultimo elenco dell'array associativo con la chiave "gc # wpidx". Alcune informazioni sono disponibili solo per le posizioni iniziale e finale, motivo per cui alcuni elenchi hanno così tanti valori mancanti. Ogni elenco ha lo stesso numero di elementi in modo che l'intero array possa essere facilmente trasformato in una tabella di dati.
Dettagli tecnici
La funzione accetta una coppia di indirizzi o un elenco di indirizzi come input. MapQuest restituisce la posizione e le informazioni geografiche sui punti finali di ogni viaggio, le coordinate di ciascuna posizione, le direzioni per ogni punto tra di loro e dove deve avvenire un cambio di direzione. Per questa semplice operazione, MapQuest offre diversi formati di input. Le informazioni sull'indirizzo possono essere fornite come una stringa di testo con parti separate da virgole, come "Deutschland, Schloßplatz 2, 42659 Solingen", che è l'indirizzo di un famoso castello vicino alla mia città natale. In alternativa, l'indirizzo può essere fornito come elementi singoli: paese = "Deutschland", Via = "Schloßplatz 2", città = "Solingen", codice postale = "42659".
Presumo che, nella maggior parte dei casi, verrà cercato più di un indirizzo. Quindi, la funzione si aspetta di ottenere informazioni sull'indirizzo come elenchi, un elenco di stringhe con indirizzi completi o diversi elenchi con elementi di indirizzo. Ogni indirizzo, indipendentemente dal formato, deve fornire il proprio paese. E non viene effettuato alcun controllo se vengono fornite le informazioni minime richieste. Tutti gli altri elementi sono opzionali.
Se viene richiesto un instradamento dettagliato, viene restituito un array con molti elenchi. Il primo elemento di ogni lista appartiene alla prima posizione, gli elementi successivi al percorso, poi di nuovo un elemento per la seconda posizione e così via. Per distinguere tra le posizioni che sono state inserite nella richiesta e i punti di instradamento che sono tornati, il gc # coordtype denomina le posizioni originali "Punto di interesse" e i punti tra "Waypoint". La lista gc # leg unisce tutti i punti che portano a una destinazione. La prima location non appartiene a una gamba (mia definizione). Per il percorso verso e includendo la prima destinazione, è uno; per il percorso verso la seconda destinazione, sono due e così via.
Se per il parametro 2 viene fornita una variabile JSL con un riferimento a una tabella dati e viene richiesto un instradamento dettagliato, si presume che l'elenco delle ubicazioni sia identico all'elenco delle ubicazioni nella tabella dati. Tutto il contenuto della tabella dati di riferimento verrà copiato e inserito nell'array con il routing dettagliato. Queste informazioni possono essere collegate solo ai punti di interesse, poiché tutti gli elenchi hanno valori mancanti per i waypoint.
Se non è possibile trovare una rotta, viene visualizzato un messaggio di errore nella posizione che corrisponde al punto di origine per quella tratta. Se possibile, verranno calcolati i percorsi successivi.
Se fornisci un collegamento a una tabella dati e tale tabella dati ha righe escluse, devi fornire un elenco di righe escluse (
excludedrows = As List( dt << Get Excluded Rows )
); come parametro 12. In caso contrario, gli elenchi non verranno sincronizzati. Nell'elenco dei messaggi, queste osservazioni sono contrassegnate come "escluse". Se sono presenti più osservazioni "escluse" rispetto a quelle originariamente presenti nella tabella dati, queste osservazioni non hanno fornito un minimo di informazioni sulla posizione.
Spero che questo pezzo di codice possa aiutarti con il tuo progetto o semplicemente fornire alcune informazioni sull'applicazione di JSL. Sono aperto a qualsiasi domanda o suggerimento, ma poiché fa parte del componente aggiuntivo Geocoding 2020, apporterò solo modifiche coerenti con l'uso previsto in quel componente aggiuntivo.