Einführung
Postanschriften sind in der Regel lang und manchmal schwer zu merken. Es gibt eine Reihe von Szenarien, in denen eine kürzere Adresse wünschenswert wäre. Die Möglichkeit, eine kurze Adresse zu senden, die nur aus wenigen Zeichen besteht, könnte beispielsweise eine schnellere Zustellung von Rettungsdiensten gewährleisten. Pieter Geelen und Harold Goddijn haben dieMapcode system im Jahr 2001 entwickelt, um die Erstellung einer Kurzadresse für jede physikalische Adresse auf der Welt zu vereinfachen.
In diesem Lernprogramm entwickeln Sie eine Web-App, die mithilfe der Google Maps-API eine kurze digitale Adresse für eine beliebige Adresse Ihrer Wahl generiert. Sie tun dies, indem Sie den Basiscode für diese App von GitHub klonen und dann Code hinzufügen, der sie voll funktionsfähig macht. Diese App kann auch die ursprüngliche physikalische Adresse von einem bestimmten Kartencode abrufen.
Voraussetzungen
Um dieses Tutorial abzuschließen, benötigen Sie Folgendes:
-
Zugriff auf einen Ubuntu 18.04 Server. Dieser Server sollte einen Nicht-root-Benutzer mit
sudo
-Berechtigungen und eine konfigurierte Firewall haben. Um dies einzurichten, können Sie unserenInitial Server Setup Guide for Ubuntu 18.04 folgen. -
Ein LAMP-Stack ist auf Ihrem Computer installiert. Dies ist erforderlich, da die Anwendung, die Sie in diesem Lernprogramm entwickeln, AngularJS und PHP verwendet und die von der Anwendung generierte digitale Adresse in einer MySQL-Datenbank gespeichert wird. Befolgen Sie unsere Anleitung zuHow To Install Linux, Apache, MySQL, PHP (LAMP) stack on Ubuntu 18.04, um dies einzurichten.
-
Git auf Ihrem Server installiert. Sie können dem TutorialContributing to Open Source: Getting Started with Git folgen, um Git zu installieren und einzurichten.
[[Schritt 1 - Abrufen eines Google-API-Schlüssels]] == Schritt 1 - Abrufen eines Google API-Schlüssels
In diesem Tutorial verwenden Sie JavaScript, um eine Schnittstelle zu Google Maps zu erstellen. Google weist API-Schlüssel zu, um Entwicklern die Verwendung der JavaScript-API in Google Maps zu ermöglichen, die Sie benötigen, um den Code Ihrer Webanwendung abzurufen und zu ergänzen.
Um Ihren eigenen API-Schlüssel zu erhalten, gehen Sie zu“Get API Key” pagevon Google. Klicken Sie in Schritt 1 auf die SchaltflächeGET STARTED. Ein Popup wird geöffnet, wie in der folgenden Abbildung dargestellt:
Wählen SieMaps aus, indem Sie auf das Kontrollkästchen klicken undCONTINUE drücken. Wenn Sie noch nicht in einem Google-Konto angemeldet sind, werden Sie dazu aufgefordert. Anschließend werden Sie im Fenster aufgefordert, einen Namen für das Projekt anzugeben. Dieser kann beliebig sein:
Anschließend werden Sie aufgefordert, Ihre Zahlungsinformationen einzugeben. Beachten Sie, dass Google API-Schlüssel als Teil einer kostenlosen Testversion bereitstellt. Sie müssen jedoch die Abrechnung einrichten und aktivieren, damit Sie sie abrufen können.
Nach Eingabe dieser Informationen wird Ihr API-Schlüssel auf dem Bildschirm angezeigt. Kopieren Sie es und speichern Sie es an einem Ort, an dem Sie es leicht abrufen können, da Sie es später zu Ihrem Projektcode hinzufügen müssen.
Nachdem Sie Ihren API-Schlüssel erhalten haben, können Sie mit dem Aufbau der Grundlage Ihrer Anwendung beginnen, indem Sie eine MySQL-Datenbank erstellen.
[[Schritt-2 -—- Erstellen der Datenbank]] == Schritt 2 - Erstellen der Datenbank
Die in diesem Lernprogramm beschriebene Webanwendung akzeptiert eine Adresse vom Benutzer und generiert einen Kartencode für diese Adresse sowie den Breiten- und Längengrad des angegebenen Standorts. Sie speichern diese Daten in einer MySQL-Datenbank, damit Sie sie später durch Eingabe der entsprechenden digitalen Adresse abrufen können.
Beginnen Sie, indem Sie die MySQL-Shell öffnen und sich mit Ihrem Passwort authentifizieren:
mysql -u root -p
Erstellen Sie an der Eingabeaufforderung mit dem folgenden Befehl eine Datenbank mit dem Namendigitaladdress
:
CREATE DATABASE IF NOT EXISTS `digitaladdress`;
Wählen Sie als Nächstes diese neue Datenbank aus, damit Sie darin eine Tabelle erstellen können:
USE `digitaladdress`;
Erstellen Sie nach Auswahl derdigitaladdress
-Datenbank eine Tabelle mit dem Namenlocations
, in der die physische Adresse, der Längen- und Breitengrad sowie der Mapcode gespeichert werden, den Ihre Anwendung aus diesen Daten erstellen wird. Führen Sie die folgende AnweisungCREATE TABLE
aus, um die Tabellelocations
in der Datenbank zu erstellen:
CREATE TABLE `locations` (
`digitaladdress` varchar(50) DEFAULT NULL,
`state` varchar(30) DEFAULT NULL,
`zip` varchar(30) DEFAULT NULL,
`street` varchar(30) DEFAULT NULL,
`town` varchar(30) DEFAULT NULL,
`house` varchar(30) DEFAULT NULL,
`latitude` varchar(30) DEFAULT NULL,
`longitude` varchar(30) DEFAULT NULL,
KEY `digitaladdress` (`digitaladdress`)
);
Diese Tabelle enthält acht Spalten:digitaladdress
,state
,zip
,street
,town
,house
,latitude
undlongitude
. Die erste Spalte,digitaladdress
, istindexed mit dem BefehlKEY
. Indizes in MySQL funktionieren ähnlich wie in einer Enzyklopädie oder einem anderen Nachschlagewerk. Jedes Mal, wenn Sie oder Ihre Anwendung eine Abfrage mit einerWHERE
-Anweisung ausgeben, liest MySQL jeden Eintrag in jeder Spalte zeilenweise. Dies kann zu einem äußerst ressourcenintensiven Prozess werden, da Ihre Tabelle immer mehr Einträge ansammelt. Indizieren einer solchen Spalte nimmt die Daten aus der Spalte und speichert sie alphabetisch an einem separaten Ort, was bedeutet, dass MySQL nicht jede Zeile in der Tabelle durchsuchen muss. Es muss nur die Daten finden, nach denen Sie suchen, und dann zur entsprechenden Zeile in der Tabelle springen.
Beenden Sie nach dem Hinzufügen dieser Tabelle die MySQL-Eingabeaufforderung:
exit
Wenn Sie Ihre Datenbank und Tabelle eingerichtet und Ihren Google Maps-API-Schlüssel zur Hand haben, können Sie das Projekt selbst erstellen.
[[Schritt-3 - Erstellen des Projekts]] == Schritt 3 - Erstellen des Projekts
Wie in der Einführung erwähnt, klonen wir den Basiscode für dieses Projekt von GitHub und fügen dann zusätzlichen Code hinzu, um die Anwendung funktionsfähig zu machen. Der Grund dafür ist, anstatt Sie durch den Prozess des Erstellens jeder Datei und des Hinzufügens des gesamten Codes selbst zu führen, den Prozess des Ausführens der App zu beschleunigen. Außerdem können wir uns darauf konzentrieren, den Code hinzuzufügen und zu verstehen, mit dem die App sowohl mit den Google Maps- als auch mit den Mapcode-APIs kommunizieren kann.
Den Skeleton-Code für das gesamte Projekt finden Sie unterthis GitHub project page. Verwenden Sie den folgenden Befehlgit
, um das Projekt auf Ihren Server zu klonen:
git clone https://github.com/do-community/digiaddress.git
Dadurch wird ein neuer Ordner mit dem Namendigiaddress
in Ihrem Home-Verzeichnis erstellt. Verschieben Sie dieses Verzeichnis in das Webstammverzeichnis Ihres Servers. Wenn Sie das in den Voraussetzungen verknüpfte LAMP-Stack-Tutorial befolgt haben, ist dies das Verzeichnis/var/www/html
:
sudo mv digiaddress/ /var/www/html/
Dieses Projekt enthält mehrere PHP- und JS-Dateien, denen Sie später in diesem Lernprogramm Code hinzufügen. Um die Verzeichnisstruktur anzuzeigen, installieren Sie zuerst das Pakettree
mitapt
:
sudo apt install tree
Führen Sie dann den Befehltree
mit dem als Argument angegebenen Verzeichnisdigiaddress
aus:
tree /var/www/html/digiaddress/
Outputdigiaddress/
├── README.md
├── db.php
├── fetchaddress.php
├── findaddress.php
├── generateDigitalAddress.php
├── geoimplement.php
├── index.php
└── js
├── createDigitialAddressApp.js
└── findAddressApp.js
Sie können dieser Ausgabe entnehmen, dass das Projekt aus sechs PHP-Dateien und zwei JavaScript-Dateien besteht. Zusammen bilden diese Dateien die beiden Hauptfunktionen der Anwendung: Erstellen eines Kartencodes aus einer physischen Adresse und Dekodieren eines Kartencodes, um die ursprüngliche physische Adresse abzurufen. Die folgenden Dateien aktivieren die erste Funktionalität:
-
index.php
-
geoimplement.php
-
generateDigitialAddress.php
-
db.php
-
createDigitialAddressApp.js
Die Dateiindex.php
enthält den Code für die Benutzeroberfläche der Anwendung, die aus einem Formular besteht, in dem Benutzer eine physische Adresse eingeben können. Die Dateiindex.php
ruft die Dateigeoimplement.php
jedes Mal auf, wenn ein Benutzer das Formular sendet. geoimplement.php
ruft die Google Maps-API auf und gibt die Adresse an diese weiter. Der Google-Server antwortet daraufhin mit einem JSON-Code, der die angegebenen Adressinformationen einschließlich Breiten- und Längengrad enthält. Diese Informationen werden dann an die DateigenerateDigitalAddress.php
übergeben, die die Mapcode-API aufruft, um einen Mapcode für den angegebenen Standort zu erhalten, der durch seinen Breiten- und Längengrad angegeben wird. Der resultierende Kartencode wird zusammen mit dem Breitengrad, dem Längengrad und der physischen Adresse in der Datenbank gespeichert, die Sie in Schritt 2 erstellt haben. db.php
fungiert als Helfer für diese Operation. Die DateicreateDigitalAddressApp.js
führt eine Reihe von Vorgängen aus, die die in der App angezeigten UX-Elemente steuern, einschließlich des Festlegens eines Markers und eines Begrenzungsrechtecks auf der Google Maps-Oberfläche.
Die verbleibenden drei Dateien ermöglichen die zweite Funktion der Anwendung - das Abrufen einer physischen Adresse von einem bestimmten Kartencode:
-
findaddress.php
-
fetchaddress.php
-
findAddressApp.js
Die Dateifindaddress.php
definiert die Benutzeroberfläche der Anwendung, die sich von der inindex.php
definierten unterscheidet. Die Anwendung akzeptiert einen zuvor generierten Kartencode als Eingabe und zeigt die entsprechende physikalische Adresse an, die in der Datenbank gespeichert ist. Immer wenn ein Benutzer dieses Formular sendet, sendetfindaddress.php
einen Anruf anfetchaddress.php
, der dann den entsprechenden Kartencode aus der Datenbank abruft. Die DateifindAddressApp.js
enthält den Hilfecode zum Festlegen einer Markierung und eines Begrenzungsrechtecks auf der Google Maps-Oberfläche.
Testen Sie die Installation, indem Siehttp://your_server_ip/digiaddress
in Ihrem Browser aufrufen und sicherstellen, dassyour_server_ip
geändert wird, um die IP-Adresse Ihres Servers wiederzugeben.
[.Hinweis]##
Note: Wenn Sie die IP-Adresse Ihres Servers nicht kennen, können Sie den folgenden Befehlcurl
ausführen. Dieser Befehl druckt den Seiteninhalt vonicanhazip.com
, einer Website, auf der die IP-Adresse des Computers angezeigt wird, der darauf zugreift:
curl http://icanhazip.com
Dort angekommen, sehen Sie diese Überschrift oben in Ihrem Browserfenster:
Generate Digital Address
Dies bestätigt, dass Sie die Projektdateien korrekt heruntergeladen haben. Fahren wir mit der Entwicklung der Hauptfunktion der App fort: Generieren eines Kartencodes.
[[Schritt-4 -—- Entwickeln der Anwendung-39-s-ui]] == Schritt 4 - Entwickeln der Benutzeroberfläche der Anwendung
Die Dateien, die Sie im vorherigen Schritt heruntergeladen haben, enthalten den Code für die Programmoberfläche. Sie müssen jedoch noch einige Änderungen und Ergänzungen an einigen dieser Dateien vornehmen, damit die Anwendung für die Benutzer funktionsfähig und ansprechend ist. Wir werden mit der Aktualisierung des Codes beginnen, um die Benutzeroberfläche der Anwendung zu entwickeln.
Öffnen Sie dieindex.php
-Datei mit Ihrem bevorzugten Editor. Hier verwenden wirnano
:
nano /var/www/html/digiaddress/index.php
Suchen Sie nach der folgenden Codezeile:
/var/www/html/digiaddress/index.php
. . .
. . .
Ersetzen Sie<YOUR KEY>
durch den Google API-Schlüssel, den Sie in Schritt 1 erhalten haben. Nach dem Hinzufügen Ihres API-Schlüssels sollte die Zeile folgendermaßen aussehen:
/var/www/html/digiaddress/index.php
. . .
. . .
Suchen Sie als Nächstes den folgenden Kommentar in der Dateiindex.php
:
/var/www/html/digiaddress/index.php
. . .
. . .
Unterhalb dieses Kommentars werden einige Dutzend Codezeilen eingefügt, wodurch ein Formular erstellt wird, in dem Benutzer die Adresse eines physischen Standorts eingeben können, anhand dessen die Anwendung einen Kartencode generiert. Fügen Sie unter diesem Kommentar den folgenden hervorgehobenen Code hinzu, der oben im Formular einen Titel mit dem NamenEnter Address erstellt:
/var/www/html/digiaddress/index.php
. . .
Enter Address
. . .
Fügen Sie darunter den folgenden HTML-Code ein. Dadurch wird ein Formular mit fünf Textfeldern (zusammen mit den entsprechenden Bezeichnungen) erstellt, in das Benutzer ihre Informationen eingeben können:
/var/www/html/digiaddress/index.php
. . .
Fügen Sie unter dem Formularcode die folgenden Zeilen hinzu. Diese erstellen zwei verborgene Steuerelemente, die die Längen- und Breitengradinformationen weiterleiten, die von einer über das Formular übermittelten Adresse abgeleitet sind:
/var/www/html/digiaddress/index.php
. . .
. . .
Schließen Sie diesen Abschnitt abschließend, indem Sie den folgenden Code hinzufügen. Dadurch wird eineGenerate-Schaltfläche erstellt, mit der Benutzer das Formular senden können:
/var/www/html/digiaddress/index.php
. . .
. . .
Nach dem Hinzufügen dieser Elemente sollte dieser Abschnitt der Datei mit folgendem übereinstimmen:
/var/www/html/digiaddress/index.php
. . .
Enter Address
Speichern Sie die Datei, indem SieCTRL+O
und dannENTER
drücken, und rufen Sie die Anwendung in Ihrem Browser erneut auf:
http://your_server_ip/digiaddress
Sie sehen die neu hinzugefügten Formularfelder und die SchaltflächeGenerate, und die Anwendung sollte folgendermaßen aussehen:
Wenn Sie zu diesem Zeitpunkt Adressinformationen in das Formular eingeben und versuchen, auf die SchaltflächeGenerate zu klicken, geschieht nichts. Wir werden die Funktionalität zur Kartencode-Generierung später hinzufügen, konzentrieren uns jedoch zunächst darauf, diese Seite optisch ansprechender zu gestalten, indem wir eine Karte hinzufügen, mit der Benutzer interagieren können.
[[Schritt-5 - Hinzufügen von Google Maps-Steuerelementen]] == Schritt 5 - Hinzufügen von Google Maps-Steuerelementen
Wenn Karten auf einer Website über die JavaScript-API von Google Maps angezeigt werden, enthalten sie Funktionen der Benutzeroberfläche, mit denen Besucher mit der angezeigten Karte interagieren können. Diese Merkmale werden alscontrols bezeichnet. Wir werden dieindex.php
-Datei weiter bearbeiten, um dieser App Google Maps-Steuerelemente hinzuzufügen. Wenn Sie fertig sind, können Benutzer eine Karte neben dem Eingabeformular anzeigen und sie verschieben, um verschiedene Positionen anzuzeigen, zu vergrößern und zu verkleinern und wechseln Sie zwischen Karten-, Satelliten- und Straßenansichten von Google.
Suchen Sie den folgenden Kommentar in der Dateiindex.php
:
/var/www/html/digiaddress/index.php
. . .
. . .
Fügen Sie unter diesem Kommentar den folgenden hervorgehobenen Code ein:
/var/www/html/digiaddress/index.php
. . .
Speichern Sie die Datei und rufen Sie die Anwendung in Ihrem Browser erneut auf. Sie werden folgendes sehen:
Wie Sie sehen, haben wir der Anwendung erfolgreich eine Karte hinzugefügt. Sie können die Karte verschieben, um sich auf verschiedene Orte zu konzentrieren, sie zu vergrößern und zu verkleinern und zwischen der Karten-, Satelliten- und Straßenansicht zu wechseln. Wenn Sie sich den soeben hinzugefügten Code noch einmal ansehen, bemerken Sie, dass wir auch zwei Beschriftungssteuerelemente hinzugefügt haben, die die Geokoordinaten und die physikalische Adresse anzeigen, die im Formular eingegeben wurden:
/var/www/html/digiaddress/index.php
. . .
. . .
Rufen Sie die Anwendung in Ihrem Browser erneut auf und geben Sie den Namen eines Staates in das erste Feld ein. Wenn Sie den Textcursor in das nächste Feld bewegen, werden die Bezeichnungen für Breite und Länge nicht angezeigt, und der auf der Karte angezeigte Ort ändert sich nicht, um die von Ihnen eingegebenen Informationen widerzuspiegeln. Aktivieren wir dieses Verhalten.
[[Schritt-6 - Hinzufügen von Ereignis-Listenern]] == Schritt 6 - Hinzufügen von Ereignis-Listenern
Das Hinzufügen interaktiver Elemente zu einer Anwendung kann dazu beitragen, die Benutzer zu beschäftigen. Wir werden einige interaktive Verhaltensweisen in dieser Anwendung mithilfe vonevent listeners implementieren.
Einevent ist eine Aktion, die auf einer Webseite ausgeführt wird. Ereignisse können von einem Benutzer oder vom Browser selbst ausgeführt werden. Beispiele für häufige Ereignisse sind:
-
Klicken auf eine HTML-Schaltfläche
-
Ändern des Inhalts eines Eingabefelds
-
Ändern des Fokus von einem Seitenelement zu einem anderen
Einevent listener ist eine Anweisung, die ein Programm anweist, eine bestimmte Aktion auszuführen, wenn ein bestimmtes Ereignis stattfindet. In AngularJS werden Ereignis-Listener mit Anweisungen definiert, die im Allgemeinen dem folgenden Format entsprechen:
ng-event_type=expression
In diesem Schritt fügen wir einen Ereignis-Listener hinzu, mit dessen Hilfe die von Benutzern eingegebenen Informationen bei jedem Absenden des Formulars in einen Kartencode umgewandelt werden. Wir werden auch ein paar weitere Event-Listener hinzufügen, die die Anwendung interaktiver machen. Insbesondere verwenden wir diese Listener, um die in der Anwendungsübersicht angezeigte Position zu ändern, eine Markierung zu platzieren und ein Rechteck um die Position zu zeichnen, während Benutzer Informationen in das Formular eingeben. Wir werden diese Ereignis-Listener zuindex.php
hinzufügen. Öffnen Sie diese Datei also erneut, wenn Sie sie geschlossen haben:
nano /var/www/html/digiaddress/index.php
Scrollen Sie nach unten zum ersten Code-Stapel, den wir hinzugefügt haben, und suchen Sie den Block, der mit<form>
beginnt. Es wird so aussehen:
/var/www/html/digiaddress/index.php
. . .
. . .
Fügen Sie zunächst den folgenden markierten Ereignis-Listener zum öffnenden<form>
-Tag hinzu. Dieser Code weist die App an, die FunktionprocessForm
aufzurufen, wenn ein Benutzer Informationen über das Formular übermittelt. processForm
ist in der DateicreateDigitalAddressApp.js
definiert und dient als Hilfsfunktion, die die von Benutzern übermittelten Informationen an die entsprechenden Dateien sendet, die sie dann zu einem Mapcode verarbeiten. Wir werden uns diese Funktion in Schritt 7 genauer ansehen:
/var/www/html/digiaddress/index.php
. . .
Bearbeiten Sie diesen Block als Nächstes, indem Sie einigeblur
Ereignis-Listener hinzufügen. Das Ereignisblur
tritt auf, wenn ein bestimmtes Seitenelement den Fokus verliert. Fügen Sie die folgenden hervorgehobenen Zeilen zu deninput
-Tags desform
-Blocks hinzu. Diese Zeilen weisen die Anwendung an, diegeocodeAddress
-Funktion aufzurufen, wenn sich der Fokus eines Benutzers von den jeweiligen Formularfeldern entfernt, die wir in Schritt 4 erstellt haben. Beachten Sie, dass Sie auch die Schrägstriche und Zeichen größer als (/>
) löschen müssen, die jedesinput
-Tag schließen. Andernfalls kann die App die Ereignisse vonblur
nicht korrekt registrieren:
/var/www/html/digiaddress/index.php
. . .
Die erste dieser neuen Zeilen -ng-blur="geocodeAddress(address,'state')" required=""/>
- bedeutet "Wenn sich der Fokus des Benutzers vom Feld" Status "entfernt, rufen Sie die FunktiongeocodeAddress
auf." Die anderen neuen Zeilen nennen ebenfallsgeocodeAddress
, wenn sich der Fokus des Benutzers von seinen jeweiligen Feldern entfernt.
Wie bei derprocessForm
-Funktion wirdgeocodeAddress
in dercreateDigitalAddressApp.js
-Datei deklariert, aber in dieser Datei befindet sich noch kein Code, der sie definiert. Wir werden diese Funktion so ausführen, dass sie eine Markierung platziert und ein Rechteck auf der Anwendungszuordnung zeichnet, nachdem dieseblur
-Ereignisse aufgetreten sind, um die in das Formular eingegebenen Informationen wiederzugeben. Außerdem fügen wir einen Code hinzu, der die Adressinformationen in einen Kartencode umwandelt.
Speichern und schließen Sie die Dateiindex.php
(drücken SieCTRL+X
,Y
, dannENTER
) und öffnen Sie dann die Datei`createDigitalAddressApp.js`:
nano /var/www/html/digiaddress/js/createDigitalAddressApp.js
Suchen Sie in dieser Datei die folgende Zeile:
/var/www/html/digiaddress/js/createDigitalAddressApp.js
. . .
$scope.geocodeAddress = function (address, field) {
. . .
In dieser Zeile deklarieren wir die FunktiongeocodeAddress
. Einige Zeilen darunter deklarieren wir eine Variable mit dem NamenfullAddress
, die aus den von einem Benutzer in die Formularfelder der Anwendung eingegebenen Informationen eine für Menschen lesbare Postanschrift erstellt. Dies geschieht durch eine Reihe vonif
-Anweisungen:
/var/www/html/digiaddress/js/createDigitalAddressApp.js
. . .
var fullAddress = "";
if (address ['house']) {
angular.element(document.getElementById('generate'))[0].disabled = false;
fullAddress = address ['house'] + ",";
}
if (address ['town']) {
angular.element(document.getElementById('street'))[0].disabled = false;
fullAddress = fullAddress + address ['town'] + ",";
}
if (address ['street']) {
angular.element(document.getElementById('house'))[0].disabled = false;
fullAddress = fullAddress + address ['street'] + ",";
}
if (address ['state']) {
angular.element(document.getElementById('zip'))[0].disabled = false;
fullAddress = fullAddress + address ['state'] + " ";
}
if (address ['zip']) {
angular.element(document.getElementById('town'))[0].disabled = false;
fullAddress = fullAddress + address ['zip'];
}
. . .
Direkt hinter diesen Zeilen steht der folgende Kommentar:
/var/www/html/digiaddress/js/createDigitalAddressApp.js
. . .
// add code for locating the address on Google maps
. . .
Fügen Sie unter diesem Kommentar die folgende Zeile hinzu, in der überprüft wird, obfullAddress
ein anderer Wert als null ist:
/var/www/html/digiaddress/js/createDigitalAddressApp.js
. . .
if (fullAddress !== "") {
. . .
Fügen Sie unter dieser Zeile den folgenden Code ein. Dieser Code sendet die in das Formular eingegebenen Informationen mitHTTP POST method an die Dateigeoimplement.php
, wennfullAddress
nicht null ist:
/var/www/html/digiaddress/js/createDigitalAddressApp.js
. . .
$http({
method: 'POST',
url: 'geoimplement.php',
data: {address: fullAddress},
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
}).then(function successCallback(results) {
. . .
Fügen Sie als nächstes die folgende Zeile hinzu, die prüft, ob der PHP-Aufruf erfolgreich zurückgegeben wurde:
/var/www/html/digiaddress/js/createDigitalAddressApp.js
. . .
if (results.data !== "false") {
. . .
Wenn der PHP-Aufruf erfolgreich zurückgegeben wurde, können wir das Ergebnis verarbeiten. Fügen Sie die folgende Zeile hinzu, die alle zuvor auf der Karte gezeichneten Begrenzungsrechtecke entfernt, indem Sie die FunktionremoveRectangle
aufrufen, die oben in der DateicreateDigitalAddressApp.js
definiert ist:
/var/www/html/digiaddress/js/createDigitalAddressApp.js
. . .
removeRectangle();
. . .
Fügen Sie unter der ZeileremoveRectangle();
die folgenden vier Zeilen hinzu, wodurch eine Markierung erstellt wird, die auf die neue Position im Kartensteuerelement zeigt:
/var/www/html/digiaddress/js/createDigitalAddressApp.js
. . .
new google.maps.Marker({
map: locationMap,
position: results.data.geometry.location
});
. . .
Fügen Sie dann den folgenden Code hinzu, der die Breiten- und Längengradinformationen aus dem Ergebnis abruft und mit den beiden HTML-Beschriftungen anzeigt, die wir in Schritt 5 in der Dateiindex.php
erstellt haben:
/var/www/html/digiaddress/js/createDigitalAddressApp.js
. . .
lat = results.data.geometry.location.lat;
lng = results.data.geometry.location.lng;
$scope.address.lat = lat;
$scope.address.lng = lng;
geoCoordLabel = angular.element(document.querySelector('#geocoordinates'));
geoCoordLabel.html("Geo Coordinate: " + lat + "," + lng);
geoAddressLabel = angular.element(document.querySelector('#geoaddress'));
geoAddressLabel.html("Geo Address: " + fullAddress);
$scope.latlng = true;
. . .
Fügen Sie zuletzt unter diesen Zeilen den folgenden Inhalt hinzu. Dieser Code erstellt ein Ansichtsfenster, das ein neues Begrenzungsrechteck auf der Karte markiert:
/var/www/html/digiaddress/js/createDigitalAddressApp.js
. . .
if (results.data.geometry.viewport) {
rectangle = new google.maps.Rectangle({
strokeColor: '#FF0000',
strokeOpacity: 0.8,
strokeWeight: 0.5,
fillColor: '#FF0000',
fillOpacity: 0.35,
map: locationMap,
bounds: {
north: results.data.geometry.viewport.northeast.lat,
south: results.data.geometry.viewport.southwest.lat,
east: results.data.geometry.viewport.northeast.lng,
west: results.data.geometry.viewport.southwest.lng
}
});
var googleBounds = new google.maps.LatLngBounds(results.data.geometry.viewport.southwest, results.data.geometry.viewport.northeast);
locationMap.setCenter(new google.maps.LatLng(lat, lng));
locationMap.fitBounds(googleBounds);
}
} else {
errorLabel = angular.element(document.querySelector('#lt'));
errorLabel.html("Place not found.");
$scope.latlng = true;
removeRectangle();
}
}, function errorCallback(results) {
console.log(results);
});
}
. . .
Nach dem Hinzufügen dieses Inhalts sieht dieser Abschnitt der Datei folgendermaßen aus:
/var/www/html/digiaddress/js/createDigitalAddressApp.js
. . .
// add code for locating the address on Google maps
if (fullAddress !== "") {
$http({
method: 'POST',
url: 'geoimplement.php',
data: {address: fullAddress},
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
}).then(function successCallback(results) {
if (results.data !== "false") {
removeRectangle();
new google.maps.Marker({
map: locationMap,
position: results.data.geometry.location
});
lat = results.data.geometry.location.lat;
lng = results.data.geometry.location.lng;
$scope.address.lat = lat;
$scope.address.lng = lng;
geoCoordLabel = angular.element(document.querySelector('#geocoordinates'));
geoCoordLabel.html("Geo Coordinate: " + lat + "," + lng);
geoAddressLabel = angular.element(document.querySelector('#geoaddress'));
geoAddressLabel.html("Geo Address: " + fullAddress);
$scope.latlng = true;
if (results.data.geometry.viewport) {
rectangle = new google.maps.Rectangle({
strokeColor: '#FF0000',
strokeOpacity: 0.8,
strokeWeight: 0.5,
fillColor: '#FF0000',
fillOpacity: 0.35,
map: locationMap,
bounds: {
north: results.data.geometry.viewport.northeast.lat,
south: results.data.geometry.viewport.southwest.lat,
east: results.data.geometry.viewport.northeast.lng,
west: results.data.geometry.viewport.southwest.lng
}
});
var googleBounds = new google.maps.LatLngBounds(results.data.geometry.viewport.southwest, results.data.geometry.viewport.northeast);
locationMap.setCenter(new google.maps.LatLng(lat, lng));
locationMap.fitBounds(googleBounds);
}
} else {
errorLabel = angular.element(document.querySelector('#lt'));
errorLabel.html("Place not found.");
$scope.latlng = true;
removeRectangle();
}
}, function errorCallback(results) {
console.log(results);
});
}
. . .
Speichern Sie die Datei, aber lassen Sie sie vorerst geöffnet. Wenn Sie die Anwendung in Ihrem Browser erneut aufrufen, werden keine neuen Änderungen an der Darstellung oder am Verhalten angezeigt. Wenn Sie eine Adresse eingeben und auf die SchaltflächeGenerate klicken, generiert die Anwendung ebenfalls keinen Mapcode oder zeigt diesen an. Dies liegt daran, dass wir noch einige Dateien bearbeiten müssen, bevor die Mapcode-Funktionalität funktioniert. Nehmen wir diese Änderungen weiterhin vor und schauen wir uns auch genauer an, wie diese Kartencodes generiert werden.
[[Schritt-7 - Verständnis der Mapcode-Generierung]] == Schritt 7 - Mapcode-Generierung verstehen
Scrollen Sie, während Sie noch die DateicreateDigitalAddressApp.js
betrachten, über den Codeabschnitt hinaus, den Sie im vorherigen Schritt hinzugefügt haben, um den Code zu finden, der die über das Formular übermittelten Informationen übernimmt, und verarbeiten Sie ihn zu einem eindeutigen Mapcode. Wenn ein Benutzer auf die SchaltflächeGenerate klickt, sendet der Code in der Dateiindex.php
das Formular und ruft die FunktionprocessForm
auf, die hier increateDigitalAddressApp.js
definiert ist:
/var/www/html/digiaddress/js/createDigitalAddressApp.js
. . .
$scope.processForm = function () {
. . .
processForm
erstellt dann einen HTTP-POST für die DateigenerateDigitalAddress.php
:
/var/www/html/digiaddress/js/createDigitalAddressApp.js
. . .
$http({
method: 'POST',
url: 'generateDigitalAddress.php',
data: $scope.address,
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
}).then(function (response) {
. . .
Stichting Mapcode Foundation stellt die API bereit, die Mapcodes aus physischen Adressen als kostenlosen Webdienst generiert. Um zu verstehen, wie dieser Aufruf des Mapcode-Webdienstes funktioniert, schließen SiecreateDigitalAddressApp.js
und öffnen Sie die DateigenerateDigitialAddress.php
:
nano /var/www/html/digiaddress/generateDigitalAddress.php
Oben in der Datei wird Folgendes angezeigt:
/var/www/html/digiaddress/generateDigitalAddress.php
Die Zeileinclude("db.php");
teilt PHP mit, dassinclude den gesamten Text, Code und das Markup aus der Dateidb.php
in der DateigenerateDigitalAddress.php
enthält. db.php
enthält die Anmeldeinformationen für die MySQL-Datenbank, die Sie in Schritt 2 erstellt haben. Durch Einfügen ingenerateDigitalAddress.php
können wir alle über das Formular übermittelten Adressinformationen zur Datenbank hinzufügen.
Unterhalb dieserinclude
-Anweisung befinden sich einige weitere Zeilen, die die Breiten- und Längengradinformationen basierend auf der voncreateDigitalAddressApp.js
übermittelten Anforderung erhalten:
/var/www/html/digiaddress/generateDigitalAddress.php
. . .
$data = json_decode(file_get_contents("php://input"));
$lat = $data->lat;
$long = $data->lng;
. . .
Suchen Sie in der DateigenerateDigitalAddress.php
nach dem folgenden Kommentar.
/var/www/html/digiaddress/generateDigitalAddress.php
. . .
// call to mapcode web service
. . .
Fügen Sie die folgende Codezeile unter diesem Kommentar ein. Dieser Code ruft die Mapcode-API auf und sendetlat
undlong
als Parameter.
/var/www/html/digiaddress/generateDigitalAddress.php
. . .
// call to mapcode web service
$digitaldata = file_get_contents("https://api.mapcode.com/mapcode/codes/".$lat.",".$long."?include=territory,alphabet&allowLog=true&client=web");
. . .
Der Webdienst gibt die JSON-Daten zurück, diedigitaldata
zugewiesen wurden, und die folgende Anweisung dekodiert diesen JSON:
/var/www/html/digiaddress/generateDigitalAddress.php
. . .
$digitalAddress["status"] = json_decode($digitaldata, TRUE)['local']['territory']." ".json_decode($digitaldata, TRUE)['local']['mapcode'];
. . .
Dies gibt einen Kartencode für den vom Benutzer angegebenen Ort zurück. In den folgenden Zeilen werden diese Informationen in der Datenbank gespeichert:
/var/www/html/digiaddress/generateDigitalAddress.php
. . .
$obj = new databaseConnection();
$conn = $obj->dbConnect();
$obj->insertLocation($conn, $digitalAddress["status"],$data->state,$data->zip,$data->street,$data->town,$data->house,$lat,$long);
. . .
Anschließend gibt die letzte Zeile den Kartencode an die Anruferfunktion zurück:
/var/www/html/digiaddress/generateDigitalAddress.php
. . .
echo json_encode($digitalAddress);
Speichern und schließen Sie diese Datei und öffnen SiecreateDigitalAddressApp.js
erneut:
nano /var/www/html/digiaddress/js/createDigitalAddressApp.js
Wenn ein Mapcode erfolgreich abgerufen wurde, wird er dem Benutzer in den folgenden Zeilen in der DateicreateDigitalAddressApp.js
in einem Dialogfeld angezeigt:
/var/www/html/digiaddress/js/createDigitalAddressApp.js
. . .
digiAddress = response.data.status;
. . .
$('#digitalAddressDialog').modal('show');
. . .
Obwohl SiegenerateDigitalAddress.php
eine neue Codezeile hinzugefügt haben, werden beim Besuch und bei der Interaktion mit der App in Ihrem Browser keine funktionalen Änderungen angezeigt. Dies liegt daran, dass Sie Ihren Google-API-Schlüssel noch nicht zurgeoimplement.php
-Datei hinzugefügt haben, wodurch die Google Maps-API tatsächlich aufgerufen wird.
[[Schritt-8 - Aktivieren von Anrufen an die Google Maps-API]] == Schritt 8 - Aktivieren von Anrufen an die Google Maps-API
Diese Anwendung hängt von der Google Maps-API ab, um eine physikalische Adresse in die entsprechenden Breiten- und Längengradkoordinaten zu übersetzen. Diese werden dann an die Mapcode-API weitergeleitet, die daraus einen Mapcode generiert. Wenn die Anwendung nicht in der Lage ist, mit der Google Maps-API zu kommunizieren, um den Längen- und Breitengrad des Standorts zu ermitteln, schlägt daher jeder Versuch fehl, einen Kartencode zu erstellen.
Wir erinnern uns an Schritt 6, in dem wir nach dem Erstellen deraddress
-Daten das Ergebnis über eine HTTP-POST-Anforderung in dercreateDigitalAddressApp.js
-Datei weitergeleitet haben:
/var/www/html/digiaddress/js/createDigitalAddressApp.js
$http({
method: 'POST',
url: 'geoimplement.php',
data: {address: fullAddress},
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
}).then(function successCallback(results) {
Dieser Codeblock sendet die von einem Benutzer eingegebenen Adressdaten an die Dateigeoimplement.php
, die den Code enthält, der die Google Maps-API aufruft. Gehen Sie vor und öffnen Sie diese Datei:
nano /var/www/html/digiaddress/geoimplement.php
Sie werden sehen, dass zuerst dieaddress
dekodiert werden, die über die POST-Anforderung empfangen wurden:
/var/www/html/digiaddress/geoimplement.php
. . .
$data=json_decode(file_get_contents("php://input"));
. . .
Anschließend wird das Feldaddress
der Eingabedaten an eine Funktiongeocode
übergeben, die die geografischen Informationen zur Adresse zurückgibt:
/var/www/html/digiaddress/geoimplement.php
. . .
$result = geocode($data->address);
. . .
Das Ergebnis wird dann an den Anrufer zurückgesendet:
/var/www/html/digiaddress/geoimplement.php
. . .
echo json_encode($result);
. . .
Die Funktiongeocode
codiert dieaddress
und leitet sie zusammen mit Ihrem Anwendungsschlüssel an die Google Maps-API weiter:
/var/www/html/digiaddress/geoimplement.php
. . .
// url encode the address
$address = urlencode($address);
// google map geocode api url
$url = "https://maps.googleapis.com/maps/api/geocode/json?address={$address}&key=";
. . .
Fügen Sie vor dem Scrollen Ihren API-Schlüssel zur Zeile unter dem Kommentar von// google map geocode api url
hinzu:
/var/www/html/digiaddress/geoimplement.php
. . .
// google map geocode api url
$url = "https://maps.googleapis.com/maps/api/geocode/json?address={$address}&key=ExampleAPIKeyH2vITfv1eIHbfka9ym634Esw7u";
. . .
Nach dem Senden des Aufrufs an die Google Maps-API wird die Antwort dekodiert und ihr Wert von der Funktion zurückgegeben:
/var/www/html/digiaddress/geoimplement.php
. . .
// get the json response
$resp_json = file_get_contents($url);
// decode the json
$resp = json_decode($resp_json, true);
if ($resp['status'] == 'OK') {
return $resp['results'][0];
} else {
return false;
}
. . .
Speichern Sie diese Datei und rufen Sie Ihre Anwendung erneut auf. Geben SieUS-NY
in das Statusfeld ein und drücken Sie dannTAB
, um den Eingabefokus auf das nächste Feld zu ändern. Sie werden die folgende Ausgabe sehen:
Beachten Sie, dass die Geokoordinaten und die physikalische Adresse, die Sie in das Formular eingegeben haben, unter der Karte angezeigt werden. Dadurch fühlt sich die Anwendung viel ansprechender und interaktiver an.
[.Hinweis]##
Note: Bei den Abkürzungen für Ortsnamen verwendet Mapcode die Norm ISO 3166. Dies bedeutet, dass einige häufig verwendete Abkürzungen möglicherweise nicht wie erwartet interpretiert werden. Wenn Sie beispielsweise einen Mapcode für eine Adresse in Louisiana generieren möchten undLA
eingeben, springt die Karte nach Los Angeles, Kalifornien (und nicht in den Bundesstaat Louisiana).
Sie können Verwechslungen mit US-Postabkürzungen vermeiden, indem Sie ihnenUS-
voranstellen. Im Kontext dieses Louisiana-Beispiels würden SieUS-LA
eingeben.
Weitere Informationen zur Verwendung dieses Standards durch Mapcode finden Sie unterTerritories and standard codes reference page.
Trotz dieser Verbesserung der Anzeige von Standorten auf der Karte ist die App noch nicht voll funktionsfähig. Der letzte Schritt, den Sie ausführen müssen, bevor Sie einen Mapcode generieren können, besteht darin, die Dateidb.php
zu bearbeiten, damit die Anwendung auf Ihre Datenbank zugreifen kann.
[[Schritt 9 - Hinzufügen von Datenbankanmeldeinformationen und Testen der Mapcode-Generierung] == Schritt 9 - Hinzufügen von Datenbankanmeldeinformationen und Testen der Mapcode-Generierung
Denken Sie daran, dass diese Anwendung jede Adresse, die in das Formular eingegeben wurde, zusammen mit Breite, Länge und Kartencode in der Datenbank speichert, die Sie in Schritt 2 erstellt haben. Dies wird durch den Code in der Dateidb.php
ermöglicht, in dem Ihre Datenbankanmeldeinformationen gespeichert sind und die Anwendung auf die darin enthaltene Tabellelocations
zugreifen kann.
Öffnen Sie als letzten Schritt zum Aktivieren der Mapcode-Generierungsfunktion die Dateidb.php
zur Bearbeitung:
nano /var/www/html/digiaddress/db.php
Suchen Sie oben in dieser Datei die Zeile, die mit$pass
beginnt. Diese Zeile übermittelt Ihre MySQL-Anmeldeinformationen, damit die Anwendung auf Ihre Datenbank zugreifen kann. Ersetzen Sieyour_password
durch das MySQL-Benutzerpasswort Ihresroot:
/var/www/html/digiaddress/db.php
. . .
$username = "root";
$pass = "your_password";
. . .
Dies ist die letzte Änderung, die Sie vornehmen müssen, um einen Kartencode aus einer physischen Adresse zu generieren. Speichern und schließen Sie die Datei, und aktualisieren Sie die Anwendung in Ihrem Browser erneut. Geben Sie eine Adresse Ihrer Wahl ein und klicken Sie auf die SchaltflächeGenerate. Die Ausgabe sieht ungefähr so aus:
In diesem Stadium haben Sie Ihre Bewerbung abgeschlossen und können nun eine kurze digitale Adresse für jeden physischen Ort auf der Welt generieren. Sie können auch mit verschiedenen Adressen experimentieren und beachten, dass die von Ihnen eingegebene Adresse nicht unbedingt in den USA sein muss.
Ihre letzte Aufgabe besteht darin, die zweite Funktion dieser App zu aktivieren: das Abrufen einer Adresse aus der Datenbank mithilfe des entsprechenden Kartencodes.
[[Schritt 10 - Abrufen einer physischen Adresse]] == Schritt 10 - Abrufen einer physischen Adresse
Nachdem Sie nun in der Lage sind, einen Kartencode aus einer bestimmten physischen Adresse zu generieren, besteht Ihr letzter Schritt darin, die ursprüngliche physische Adresse abzurufen, die aus dem Kartencode abgeleitet wurde. Um dies zu erreichen, werden wir eine PHP-Benutzeroberfläche entwickeln, die hier gezeigt wird:
Der Code für diese Benutzeroberfläche ist in der Dateifindaddress.php
verfügbar. Da die in dieser Datei definierte Benutzeroberfläche der Benutzeroberfläche, die wir zuvor in Schritt 4 behandelt haben, ziemlich ähnlich ist, werden wir uns die Details der Funktionsweise nicht allzu genau ansehen. Wir werden diese drei Dateien jedoch durchgehen, um allgemein zu erklären, wie sie funktionieren.
Um die Funktion zum Abrufen von Adressen zu aktivieren, müssen Sie Ihren Google API-Schlüssel zurfindaddress.php
-Datei hinzufügen. Öffnen Sie ihn daher mit Ihrem bevorzugten Editor:
nano /var/www/html/digiaddress/findaddress.php
Suchen Sie am Ende der Datei die Zeile, die mit<script async defer src=
beginnt. Es wird so aussehen:
/var/www/html/digiaddress/findaddress.php
Ersetzen Sie<YOUR KEY>
durch Ihren Google API-Schlüssel, wie Sie es in den vorherigen Schritten getan haben, und speichern Sie die Datei. Bevor Sie es jedoch schließen, schauen wir uns kurz an, wie diese Dateien zusammenarbeiten.
Wenn ein Benutzer das Formular sendet, löst er das Ereignissubmit
aus, und ein Ereignis-Listener ruft die Funktionfetchadd
auf:
/var/www/html/digiaddress/findaddress.php
. . .
Die Funktionfetchadd
sendet die digitale Adresse mit einer POST-Anforderung anfetchaddress.php
:
/var/www/html/digiaddress/js/findAddressApp.js
. . .
$http({
method : 'POST',
url : 'fetchaddress.php',
data : {digiaddress: $scope.digiaddress}
}).then(function(response){
. . .
Wenn der POST erfolgreich ist, gibt die Funktion eine JSON-Antwort zurück. Die folgende Zeile analysiert diese Antwort:
/var/www/html/digiaddress/js/findAddressApp.js
. . .
var jsonlatlng = JSON.parse(response.data.latlng);
. . .
Die nächsten Zeilen setzen den Marker auf der Karte:
/var/www/html/digiaddress/js/findAddressApp.js
. . .
marker = new google.maps.Marker({
position: new google.maps.LatLng(jsonlatlng.latitude, jsonlatlng.longitude),
map: locationMap
});
. . .
Und das Folgende druckt die Geokoordinaten und die physikalische Adresse:
/var/www/html/digiaddress/js/findAddressApp.js
. . .
geoCoordLabel = angular.element(document.querySelector('#geocoordinates'));
geoCoordLabel.html("Geo Coordinate: "+ jsonlatlng.latitude +","+ jsonlatlng.longitude);
geoAddressLabel = angular.element(document.querySelector('#geoaddress'));
geoAddressLabel.html("Geo Address: " + jsonlatlng.house +","+ jsonlatlng.town +","+ jsonlatlng.street +","+ jsonlatlng.state + " " + jsonlatlng.zip );
. . .
Rufen Sie diese Anwendung in Ihrem Browser auf, indem Sie auf den folgenden Link klicken:
http://your_server_ip/digiaddress/findaddress.php
Probieren Sie es aus, indem Sie den zuvor erhaltenen Kartencode eingeben. Die folgende Abbildung zeigt eine typische Ausgabe:
Damit ist Ihre Bewerbung beendet. Sie können jetzt einen eindeutigen Kartencode für jeden Ort auf der Welt erstellen und diesen Kartencode verwenden, um die physikalische Adresse des Ortes abzurufen.