Ho utilizzato la nuova tecnica delle interfacce REST per fornire un nuovo componente aggiuntivo di geocodifica. Al suo centro c'è la chiamata alla rispettiva interfaccia REST di MapQuest , una società che fornisce molti servizi e applicazioni di routing. Uno dei servizi di MapQuest è la geocodifica. Per ogni indirizzo fornito, MapQuest restituisce la latitudine e la longitudine del luogo, oltre a informazioni amministrative come il paese e lo stato.
Poiché le tabelle di dati sono il modo consueto per raccogliere informazioni in JMP, l'analisi inizia con l'utente che assegna i ruoli alle colonne della tabella di dati tramite una finestra di dialogo utente. IL Componente aggiuntivo Geocodifica 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 dell'utente, 2) raccogliere i 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. Il terzo passaggio, la preparazione dei dati, è definito come una funzione ed è disponibile come MapQuest_geocode.jsl nel ricettario JSL. Puoi incorporarlo nella tua applicazione geografica o usarlo per avere idee su come strutturare i dati per le chiamate REST.
Funzionalità di base
Tu o qualsiasi altro utente del tuo programma avete bisogno di un file valido Chiave API da MapQuest.
I dati JMP si presentano sotto forma di colonne della tabella dati, mentre le interfacce REST molto probabilmente utilizzano strutture JSON. Di conseguenza, è necessaria una funzionalità che traduca tra entrambi i formati. Il JSL ha anche strutture per le raccolte di dati, liste o array associativi. Lo scopo di questa funzione è incapsulare tutti i comandi JSL non nativi. I dati necessari sono forniti con le tipiche variabili JSL nei formati carattere, numerico o lista. Anche i dati restituiti dalla chiamata vengono forniti come elenchi JSL. Pertanto, incorporare 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 del tipo:
risultato = funzione();
Se la funzione richiede o accetta parametri, questi sono elencati tra parentesi. Questa funzione, GC_geocode, può essere chiamata con parentesi vuote o con un elenco completo di parametri. Chiamandolo con parentesi vuote si richiama una finestra di definizione dei parametri con un contorno per l'input e l'output, come mostrato in questi due grafici:


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 potrebbero essere vuoti.
Nel mio post di blog sul componente aggiuntivo Geocoding 2020 , ho utilizzato alcuni dei siti turistici locali della mia città come esempio di utilizzo del componente aggiuntivo. Prendiamone due 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 al mondo, inaugurata nel 1901.
|

|
Schloßplatz 2, 42659 Solingen, Germania
|
Schloss Burg, un castello ricostruito, originario del 12 th secolo.
|
Innanzitutto, hai bisogno di una chiave di accesso da MapQuest, supponiamo che sia 1234ABCD. Un modo per utilizzare questa interfaccia è prendere le stringhe di indirizzo così come sono. In questo caso, l'indicatore di formato (Posizione 2) deve essere 1 o maggiore. Quindi, la chiamata alla funzione è simile a questa:
coordinates = GC_geocode ("1234ABCD", 1, {"Alte Freiheit 24a, 42103 Wuppertal, Deutschland",<BR /> "Schloßplatz 2, 42659 Solingen, Deutschland"}, {}, {}, {}, {}, {}, {});
Se gli indirizzi sono in elementi separati anziché in una stringa, l'indicatore di formato deve essere 0 (zero), il che significa che la tua chiamata sarà simile a:
coordinates = GC_geocode ("1234ABCD", 0, {}, {"Deutschland", "Deutschland"}, {}, {"Wuppertal", "Solingen"}, {42103, 42659},<BR /> {"Alte Freiheit 24a", "Schloßplatz 2"}, {})
Naturalmente, non è necessario inserire i valori come parametri; puoi anche 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", "", {0, 0}, {"", ""}, {51.25603, 51.13768}, {7.14865, 7.15245}, {"exact", "exact"}, {"DE", "DE"},<BR /> {"Nordrhein-Westfalen", "Nordrhein-Westfalen"}, {"", ""}, {"42103", "42659"}, {"Wuppertal", "Solingen"},<BR /> {"Alte Freiheit 24A", "Schloßplatz 2"}, 0}
Poiché gli indirizzi possono essere trovati e contrassegnati, il codice di risposta per ogni indirizzo è "0" (Elemento 4), motivo per cui ci sono testi vuoti nell'elemento 5, dove altrimenti apparirebbero messaggi di errore. Il resto può essere facilmente compreso, data la dichiarazione dell'interfaccia di cui sopra.
Dettagli tecnici
La funzionalità di base è semplice. Inviamo un indirizzo a MapQuest e riceviamo latitudine e longitudine. Per questo semplice compito, MapQuest offre diversi formati di input e modalità di elaborazione. 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”, CAP = “42659”.
Presumo che, nella maggior parte dei casi, si possa cercare più di un indirizzo. Pertanto, la funzione prevede di ottenere informazioni sugli indirizzi come elenchi, un elenco di stringhe con indirizzi completi o diversi elenchi con elementi di indirizzo. MapQuest ha due diversi URL per i due formati di indirizzo. L'interfaccia a stringa singola funziona in modalità batch, ovvero una chiamata può risolvere più indirizzi. L'interfaccia per elementi di indirizzo separati accetta solo un indirizzo alla volta. Per motivi di prestazioni, la funzione combina elementi separati in una stringa ed esegue la modalità batch quando è necessario individuare molti indirizzi (attualmente: > 100).
Ogni indirizzo, indipendentemente dal formato fornito, deve fornire il proprio paese. E non c'è controllo se vengono fornite le informazioni minime richieste. Tutti gli altri elementi sono facoltativi. Più preciso descrivi l'indirizzo, migliore è la qualità del risultato. Se l'intero indirizzo viene fornito come una singola stringa, la sequenza degli elementi dell'indirizzo all'interno di tale stringa non ha importanza.
Se stai leggendo le posizioni da una tabella di dati e tale tabella di dati ha righe escluse, devi fornire l'elenco delle righe escluse (excludedrows = As List( dt << Get Excluded Rows )) come parametro 12. In caso contrario, gli elenchi restituiti potrebbero non essere sincronizzati con la tabella dei dati. Nell'elenco dei messaggi queste osservazioni sono contrassegnate come "escluse". Se ci sono più osservazioni "escluse" rispetto a quelle originariamente nella tabella dei dati, le osservazioni non sono riuscite a fornire un minimo di informazioni sulla posizione.
MapQuest è un'azienda americana e ho trovato risultati coerenti per tutti gli indirizzi statunitensi che ho testato. Con indirizzi in altre regioni del mondo, non è sempre stato così. Le informazioni sulla posizione come stato, distretto o città vengono spesso restituite nella lingua locale, ma a volte i risultati sono in inglese.
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 tale componente aggiuntivo.