So generieren Sie mit AngularJS und PHP eine kurze und eindeutige digitale Adresse für jeden Standort

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:

[[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:

image

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:

image

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.

image

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.phpenthä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.phpjedes 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 Befehlcurlausfü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:

image

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:

image

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 FunktionprocessFormaufzurufen, 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 Ereignisblurtritt 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 vonblurnicht 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 FunktiongeocodeAddressauf." 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.jsdefiniert 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.phperstellt 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.phpnach 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.jsin 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 urlhinzu:

/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:

image

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.phpzu 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.phpermöglicht, in dem Ihre Datenbankanmeldeinformationen gespeichert sind und die Anwendung auf die darin enthaltene Tabellelocationszugreifen kann.

Öffnen Sie als letzten Schritt zum Aktivieren der Mapcode-Generierungsfunktion die Dateidb.phpzur 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:

image

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:

image

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 Ereignissubmitaus, und ein Ereignis-Listener ruft die Funktionfetchaddauf:

/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:

image

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.

Fazit

In diesem Lernprogramm haben Sie die Google Maps-API verwendet, um einen Standort festzulegen und dessen Längen- und Breitengradinformationen abzurufen. Diese Informationen werden verwendet, um mithilfe der Mapcode-API eine eindeutige und kurze digitale Adresse zu generieren. Es gibt eine Reihe praktischer Anwendungsfälle für Kartencodes, die vom Rettungsdienst bis zur archäologischen Vermessung reichen. The Stichting Mapcode Foundation listet mehrere solcher Anwendungsfälle auf.

Danksagung

Vielen Dank anDinesh Karpe undSayli Patil für die Entwicklung des gesamten Projektcodes.