La geocodificazione esiste da qualche tempo. Ma ora questo servizio viene offerto tramite interfacce REST che garantiscono maggiore flessibilità e precisione. Ho creato un componente aggiuntivo che utilizza il servizio di Mapquest per trovare codici geografici per indirizzi e calcolare distanze, tempi di viaggio o percorsi completi tra coppie di località. Questa è la descrizione della sua funzionalità e utilizzo.
Sono sempre stato affascinato dalle mappe. Prima che diventassero disponibili le mappe digitali, acquistavo mappe per ogni vacanza, solitamente in scale diverse e con dettagli molto più dettagliati di quelli di cui avevo realmente bisogno. Quindi non dovrebbe sorprendere che anche io ne sia affascinato JMP Le funzionalità grafiche di che consentono di rappresentare i dati sulle mappe.
Cos'è la geocodificazione?
Una delle applicazioni interessanti è la geocodifica, ovvero la capacità di localizzare punti sulle mappe. Di solito hai un punto di interesse e il suo indirizzo. Per trovare la sua posizione e tracciarla su una mappa sono necessarie anche le geocoordinate. Come potresti aspettarti, Wikipedia offre maggiori dettagli sulla geocodificazione.
Perché un nuovo componente aggiuntivo di geocodifica?
Negli ultimi anni, la tecnica di comunicazione informatica nota come RIPOSO è diventato più ampiamente utilizzato. In un keynote del 2019, John Sall ha parlato del “ Caratteristiche segrete di JMP . "Una di queste gemme nascoste in JMP è davvero sepolta molto in profondità: la capacità di accedere alle API REST (interfacce di programmazione avanzate) tramite comandi JSL. Poiché i dati delle comunicazioni informatiche vengono spesso scambiati utilizzando il metodo “ JSON ", gli sviluppatori JMP hanno creato comandi JSL che trasferiscono facilmente i dati tra strutture dati JSL e dati JSON. Questa tecnica è diventata sempre più importante. Infatti, la Johns Hopkins University e il Robert Koch Institut offrono API REST per i loro pool di dati per informazioni relative a COVID-19; I clienti JMP li utilizzano per accedere ai dati SAP per la gestione della qualità; e ne uso uno per la geocodificazione. Questa interfaccia amplia le possibilità di scambio di informazioni, poiché fornisce più delle semplici coordinate geografiche dei punti di interesse. Consente inoltre agli utenti di ottenere informazioni su distanze, tempi di viaggio e persino percorso. Questo articolo riguarda l'utilizzo di aggiungere che ho caricato nello scambio file. Il background tecnico verrà fornito in un post separato, come riepilogato nell'ultimo paragrafo.
Quali sono le funzioni?
È necessaria una tabella dati con le informazioni sull'indirizzo per osservazione. Gli indirizzi possono essere utilizzati per aggiungere tre diversi livelli di informazioni geografiche, dove ogni livello contiene le informazioni di quello precedente.
- Coordinate geografiche
Per ogni osservazione vengono aggiunte la latitudine e la longitudine della sua posizione. Inoltre, otterrai la gerarchia delle unità amministrative, paese, stato, distretto, codice postale, città, via e una valutazione di quanto vicino è stato colpito quell'indirizzo, per quanto riguarda le informazioni disponibili nel database.
- Distanza e tempo di percorrenza
Per ogni coppia di righe consecutive nella tabella dati (ad esempio riga 1 –> riga 2 / riga 2 –> riga 3 /….), la distanza tra gli indirizzi e il tempo di viaggio richiesto verranno aggiunti alla seconda riga. Le connessioni vengono enumerate in una colonna aggiuntiva. Il tempo di percorrenza viene calcolato in base al mezzo di trasporto scelto dall'utente: auto, bicicletta o piedi.
- Instradamento
Viene creata una tabella aggiuntiva che contiene tutte le informazioni di cui sopra, nonché i geocodici di tutti i punti che descrivono il percorso tra due file consecutive.
Presupposti
Esistono diversi siti Internet che offrono servizi di mappatura e routing. Una buona panoramica è fornita dalla rivista Web programmabile . Ho deciso di utilizzare MapQuest . L'azienda offre una varietà di servizi a pagamento ma anche un'API gratuita. Se vuoi usarlo, devi prima registrarti e ottenere una chiave API gratuita. Naturalmente è necessario anche il componente aggiuntivo Geocoding 2020. Si installerà nel menu Componenti aggiuntivi nel sottomenu "Forme mappa".
Alla prima chiamata, verrai informato che puoi ottenere la chiave necessaria da MapQuest e ti verrà fornito un campo per incollare la chiave.

Il promemoria della finestra di dialogo è disabilitato. Dopo che la chiave è stata incollata, viene testata per determinare se si tratta di una chiave MapQuest corretta; la chiave deve essere verificata prima di poter procedere. Se hai fornito una chiave valida, questa viene salvata nella directory dell'utente nella cartella AppData/Roaming/SAS/JMP. Se questa directory non esiste, verrà creata.
Affinché tutti i comandi del componente aggiuntivo funzionino, è necessario impostare la lingua JMP sull'inglese E selezionare l'opzione "Utilizza lingua JMP...". Sfortunatamente, ciò non può essere fatto tramite JSL. È necessario effettuare queste selezioni utilizzando l'equivalenza della lingua in File -> Preferenze -> Specifiche di Windows. Il componente aggiuntivo verificherà che le impostazioni della lingua siano corrette e ti avviserà se non è così.
Andiamo
Il menù è composto da due parti. La prima parte è l'area rossa superiore, costruita come quasi tutte le finestre di dialogo della piattaforma JMP; contiene l'elenco delle colonne, la parte del ruolo e il pannello delle azioni. Nell'area dei ruoli ci sono due parti, enfatizzate dalle cornici blu. Nella tabella dati, le informazioni sull'indirizzo possono essere archiviate in due formati: come una colonna che contiene l'indirizzo completo come stringa di testo oppure come colonne separate, in cui ciascuna colonna contiene una parte dell'indirizzo come paese, città, strada. È possibile fornire uno di questi formati, ma si escludono a vicenda. In entrambi i casi, il tuo indirizzo deve contenere il paese . Può essere fornito come nome o come codice ISO, a seconda di quale preferisci.
La seconda parte è la cornice rossa inferiore che mostra quali opzioni sono disponibili. Sono organizzati in gruppi di pulsanti di opzione (la schermata seguente mostra le impostazioni predefinite). Tutte le opzioni aggiungono un gruppo di colonne aggiuntive alla tabella dati; la combinazione di “Routing” e “Percorsi dettagliati” crea un set di dati aggiuntivo con una copia dei tuoi dati. Questi punti sono identificati come “Punti di interesse”. Inoltre, ci sono i "Waypoint", i punti che necessitano di svolte lungo il percorso.

Un esempio
Per testare come funziona, ho raccolto alcune informazioni sull'indirizzo da Internet. Sono cresciuto a Solingen, una piccola cittadina nella parte occidentale della Germania. Nel Medioevo era famoso per la produzione di spade e posate di alta qualità, motivo per cui qui troverai il Museo tedesco delle posate. Accanto al museo c'è una piccola ma impressionante chiesa barocca. Ci sono anche altri luoghi famosi nelle vicinanze:

|
Museo tedesco Klingen
|
Museo tedesco delle posate
|

|
Gräfrather Klosterkirche
|
Chiesa del monastero barocco
|

|
Il Neandertal
|
La regione dove furono scoperti per la prima volta i resti di un ramo dei nostri antenati
|

|
Die Wuppertaler Schwebebahn
|
Una ferrovia sospesa lunga 13 km, la più antica ferrovia sopraelevata elettrica a vagoni sospesi del mondo, inaugurata nel 1901
|

|
Die Müngstner Brücke
|
Il ponte ferroviario più alto della Germania, costruito nel 1897
|

|
Castello Burg
|
Un castello ricostruito, originario del 12 th secolo
|
Dopo aver cercato gli indirizzi su Internet, ho copiato le stringhe in una tabella dati JMP. Nessuno degli indirizzi includeva il nome di un paese, quindi ho anteposto "Deutschland" a tutte le stringhe. Le corde ora appaiono così
Germania, Talstraße 300, 40822 Mettmann
|
Germania, Alte Freiheit 24a, 42103 Wuppertal
|
Germania, Klosterhof 4, 42653 Solingen
|
Germania, Klosterhof 3, 42653 Solingen
|
Germania, Müngstener Brückenweg, 42659 Solingen
|
Germania, Schloßplatz 2, 42659 Solingen
|
Scelgo apposta il nome del paese tedesco “Deutschland”. Nella finestra di dialogo, assegna questa colonna al ruolo "Indirizzo singolo" e vai.

Come risultato dell'esecuzione, queste colonne vengono aggiunte al set di dati:
Geo-Informazioni
|
GC#Latitudine
|
GC#Longitudine
|
GC#Codice Paese
|
GC#Stato
|
GC#Distretto
|
GC#Codice postale
|
GC#Città
|
Via GC#
|
GC#Valutazione della qualità
|
GC#Messaggio di ritorno
|
Penso che i nomi delle colonne parlino da soli. MapQuest fornisce una valutazione della qualità stimata per ciascun risultato. È piuttosto elaborato, quindi ho riassunto le informazioni in quattro categorie: Esatto, Vicino, Approssimato, Lontano. Le righe nella tabella dati ricevono simboli e colori in base a questa classificazione. Tutte le posizioni vengono visualizzate in una mappa e uno script che riproduce questa mappa viene aggiunto alla tabella dati. A seconda dell'area su cui sono distribuiti i tuoi punti, la mappa di sfondo è Mappa stradale o Terra semplice.
In quella tabella di dati, ho diviso la stringa dell'indirizzo nei suoi singoli componenti (è facile se usi Cols à Utilità à Testo in colonna...) e ho richiesto le coordinate utilizzando i ruoli “Campi indirizzo separati”.

Non è necessario compilare tutti i campi del ruolo in questa sezione. Il paese è un requisito minimo. Più informazioni fornisci, migliore sarà il tasso di successo. I risultati di entrambi i metodi per la richiesta delle coordinate non sono completamente identici. Le coordinate stesse potrebbero differire leggermente e per la richiesta dettagliata potrebbero essere fornite ulteriori informazioni (come il distretto). Anche la valutazione della qualità può variare.
Per motivi di prestazioni, i campi indirizzo singolo vengono concatenati in una stringa e le richieste di stringa singola vengono inviate a MapQuest se sono presenti più di 200 indirizzi nella tabella dati.
Se scegli la combinazione di “Routing” e “Solo distanze/tempo”, otterrai le stesse informazioni della geocodifica, più tre colonne aggiuntive. Di tanto in tanto potresti ricevere messaggi di errore:
Punto d'interesse
|
GC#Messaggio di ritorno
|
GC#Distanza (km)
|
GC#Tempo (Bicicletta)
|
GC#Gambe
|
Neandertal
|
|
.
|
.
|
0
|
Ferrovia Wuppertaler Schwebe
|
Impossibile calcolare il percorso.
|
19.1287
|
:0:00:52:39
|
1
|
Museo tedesco Klingen
|
Impossibile calcolare il percorso.
|
0
|
:0:00:00:00
|
2
|
Gräfrather Klosterkirche
|
|
0
|
:0:00:00:00
|
3
|
Müngstner Brücke
|
|
9.92
|
:0:00:26:26
|
4
|
Castello Burg
|
|
5.0163
|
:0:00:13:55
|
5
|
Righe consecutive costruiscono una tappa del percorso totale. La riga di destinazione contiene le informazioni della gamba. Nell'esempio la prima tratta è da Neandertal a Wuppertaler Schwebebahn. La distanza per un percorso ciclabile è di circa 19 chilometri e il tempo di percorrenza stimato è di 52 minuti.
Per qualche motivo non è stato possibile trovare percorsi ciclabili verso il Deutsches Klingenmuseum o la Gräfrather Klosterkirche. Pertanto, le tratte due e tre non contengono informazioni sul viaggio, mentre le tratte quattro e cinque forniscono nuovamente le rispettive informazioni.
Questa combinazione di opzioni richiede i dettagli di un percorso tra due righe consecutive nella tabella dati con le distanze indicate in miglia:
La tua tabella dati verrà estesa dalle colonne sopra descritte per la geocodifica. Per il routing viene creata una tabella aggiuntiva con una copia di ogni riga della tabella dati; tra queste righe vengono inserite nuove linee, una per ogni punto significativo del percorso. L'ultimo segmento del tour di Solingen si presenta così:

La riga 49 contiene il penultimo indirizzo nella tabella dati, che è dove termina la gamba 4. Il percorso che porta dal luogo precedente a questo punto era lungo 9,3 miglia e ha un tempo di percorrenza stimato di 15 minuti in auto. È un "punto di interesse". La riga successiva è la fine del primo segmento della tappa 5 dopo +/- 300 piedi e cinque secondi di guida. È il primo punto di passaggio di una serie di sette, prima che venga raggiunto il successivo (e ultimo) punto di interesse. Le mappe mostrano i risultati e anche i loro script sono nelle tabelle.
La tabella dati fa parte del componente aggiuntivo e può essere aperta utilizzando il pulsante "Aiuto". Puoi usarlo per iniziare a giocare e guardare le foto delle attrazioni che ho incluso.
E se tu Se mai dovessi venire in questa zona e visitare alcuni dei posti, non dimenticare di cercare un ristorante che serva Bergische Kaffeetafel , una ricchissima combinazione di specialità locali tra cui pane, salsicce, riso dolce, waffle e altro ancora. È molto conosciuto in tutta la zona e l'ho scelto come dimostrazione, quindi dovresti trovarlo in molti ristoranti.

Alla prima corsa
MapQuest richiede che tu abbia una chiave API personale. Lo capisci da loro sito web dello sviluppatore gratuito. Il componente aggiuntivo richiede questa chiave e fornisce un campo in cui incollarla.

Il componente aggiuntivo memorizza la chiave nella directory appdata dell'utente per SAS\JMP. Prima di ogni esecuzione, tenta di leggere la chiave e la utilizzerà finché sarà lì.
Righe escluse/percorso non possibile

L'add-in assegna simboli, colori ed etichette alle righe, ma rispetta anche lo stato della riga "esclusa", che ha conseguenze specifiche per l'applicazione di routing. Se una riga viene esclusa o non è possibile il routing al suo indirizzo, questa riga viene ignorata e viene cercato un percorso verso l'indirizzo successivo.
In questa situazione verranno cercati gli itinerari tra Neandertal e Wuppertaler Schwebebahn, tra Wuppertaler Schwebebahn e Müngstner Brücke e tra Müngstner Brücke e Schloss Burg.
Allo stesso modo, le posizioni verranno saltate se il percorso verso di esse non è possibile.
Dettagli tecnici
L'osservatore attento potrebbe aver notato che la finestra di dialogo principale è contenuta in una scheda. Le schede sono inutili se stanno da sole. Questa scheda riflette l'idea che le posizioni dei percorsi possono apparire in formati diversi. Se dovessero esserci richieste per modi alternativi di fornire posizioni per il routing, quella scheda potrebbe avere dei fratelli.
Sono stato motivato a scrivere questo componente aggiuntivo come risultato del mio interesse combinato per le mappe in generale e la tecnica dell'API REST. Per rendere quest'ultimo più trasparente e forse anche più diffuso, ho inserito tre file nel ricettario JSL. Stanno definendo funzioni che possono essere chiamate da altri programmi. Una è la chiamata REST a MapQuest. Descrivo il contenuto e una descrizione dell'interfaccia in un post sul blog su rozza chiamata MapQuest . Gli altri script sono buste per la chiamata REST. Prendono gli elenchi JMP come input e creano le strutture JSON necessarie per il file geocodificazione O instradamento chiamata. Se ci sono molti indirizzi da codificare, li impacchetta in blocchi di 50 per una migliore affidabilità e prestazioni. Nei post del mio blog su geocodificazione e il instradamento subroutine, descriverò questi pezzi di codice in maggior dettaglio.
Come accennato in precedenza, i programmatori JMP hanno fatto un ottimo lavoro nel fornire funzioni JSL che si traducono in entrambe le direzioni tra le strutture dati JMP e JSON. In termini JSL, sono coinvolti elenchi e array associativi. Questi elementi possono essere impilati. Potresti avere un array associativo che contiene un elenco di array associativi che contiene... . Una singola chiamata MapQuest fornisce un ricco insieme di dati di cui avevo bisogno solo di alcuni elementi. A volte questi erano due livelli di profondità nello stack; altre volte, molti livelli di profondità. Quindi, ho trovato utile scrivere a piccola sceneggiatura che itera attraverso questa struttura. E non sarei un rispettabile JMPer se non cercassi una visualizzazione del risultato. Ho trovato il modo perfetto nel diagramma di Ishikawa. Programmarlo mi ha ricordato il potere della ricorsione, che è la tecnica migliore per scendere da uno stack profondo e tornare in sicurezza. Ho pensato che avrebbe potuto aiutare o ispirare anche altri programmatori. Ho inserito la sceneggiatura nel ricettario e, naturalmente, io ha scritto un post sulla ricorsione e disegnare strutture gerarchiche.
Per lo sviluppo ho utilizzato JMP 15, utilizzando un progetto JMP. Non direi che il mio piccolo progetto non avrebbe potuto realizzarsi senza Projects, ma Projects lo ha reso molto più semplice.