AngularJSとPHPを使用して任意の場所の短くて一意のデジタルアドレスを生成する方法

前書き

通常、郵便住所は長く、覚えにくい場合があります。 短いアドレスが望ましいいくつかのシナリオがあります。 たとえば、2、3人のキャラクターのみで構成される短い住所を送信できるようにすると、救急車のサービスをより迅速に配信できます。 PieterGeelenとHaroldGoddijnは、2001年にMapcode systemを開発し、世界中の物理アドレスの短い形式のアドレスを簡単に作成できるようにしました。

このチュートリアルでは、Google Maps APIを使用して、選択した住所の短いデジタルアドレスを生成するWebアプリを開発します。 これを行うには、GitHubからこのアプリの基本コードを複製し、完全に機能するコードを追加します。 このアプリは、指定されたマップコードから元の物理アドレスを取得することもできます。

前提条件

このチュートリアルを完了するには、次のものが必要です。

  • Ubuntu 18.04サーバーへのアクセス。 このサーバーには、sudo特権を持つroot以外のユーザーがいて、ファイアウォールが構成されている必要があります。 これを設定するには、Initial Server Setup Guide for Ubuntu 18.04をたどることができます。

  • マシンにインストールされたLAMPスタック。 このチュートリアルで開発するアプリケーションはAngularJSとPHPを使用し、アプリケーションが生成するデジタルアドレスはMySQLデータベースに保存されるため、これが必要です。 これを設定するには、How To Install Linux, Apache, MySQL, PHP (LAMP) stack on Ubuntu 18.04に関するガイドに従ってください。

  • サーバーにインストールされたGit。 チュートリアルContributing to Open Source: Getting Started with Gitに従って、Gitをインストールおよびセットアップできます。

[[step-1 -—- getting-a-google-api-key]] ==ステップ1— GoogleAPIキーを取得する

このチュートリアルでは、JavaScriptを使用してGoogleマップへのインターフェースを作成します。 GoogleはAPIキーを割り当てて、デベロッパーがGoogleマップでJavaScript APIを使用できるようにします。これは、Webアプリのコードを取得して追加する必要があります。

独自のAPIキーを取得するには、Googleの“Get API Key” pageにアクセスしてください。 手順1のGET STARTEDボタンをクリックすると、次の画像に示すようなポップアップが開きます。

image

チェックボックスをクリックしてMapsを選択し、CONTINUEを押します。 まだGoogleアカウントにログインしていない場合は、ログインするよう求められます。 次に、ウィンドウにプロジェクトの名前を入力するように求められます。プロジェクトの名前は任意です。

image

これに続いて、お支払い情報の入力を求められます。 Googleは無料の試用版の一部としてAPIキーを提供していますが、それらを取得するには請求を設定して有効にする必要があります。

image

この情報を入力すると、APIキーが画面に表示されます。 後でプロジェクトコードに追加する必要があるため、簡単に取得できる場所にコピーして保存します。

APIキーを取得したら、MySQLデータベースを作成して、アプリケーションの基盤の構築を開始できます。

[[step-2 -—-データベースの作成]] ==ステップ2—データベースの作成

このチュートリアルで説明するWebアプリケーションは、ユーザーから住所を受け取り、指定された場所の緯度と経度とともにその住所のマップコードを生成します。 このデータをMySQLデータベースに保存して、それぞれのデジタルアドレスを入力するだけで後で取得できるようにします。

MySQLシェルを開き、パスワードで認証することから始めます。

mysql -u root -p

プロンプトで、次のコマンドを使用してdigitaladdressというデータベースを作成します。

CREATE DATABASE IF NOT EXISTS `digitaladdress`;

次に、この新しいデータベースを選択して、その中にテーブルを作成できるようにします。

USE `digitaladdress`;

digitaladdressデータベースを選択した後、その中にlocationsというテーブルを作成して、物理アドレス、経度、緯度、およびアプリケーションがこのデータから作成するマップコードを格納します。 次のCREATE TABLEステートメントを実行して、データベース内にlocationsテーブルを作成します。

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`)
);

このテーブルには、digitaladdressstatezipstreettownhouselatitude、および%の8つの列があります。 (t7)s。 最初の列digitaladdressは、KEYコマンドを使用したindexedです。 MySQLのインデックスは、エンサイクロペディアまたは他の参照作業での動作と同様に機能します。 ユーザーまたはアプリケーションがWHEREステートメントを含むクエリを発行するたびに、MySQLは各列のすべてのエントリを行ごとに読み取ります。これは、テーブルにエントリが増えるにつれて、非常にリソースを消費するプロセスになる可能性があります。 このように列にインデックスを付けると、列からデータが取得され、アルファベット順に別の場所に保存されます。つまり、MySQLはテーブル内のすべての行を調べる必要がなくなります。 インデックスで探しているデータを見つけて、テーブルの対応する行にジャンプするだけです。

このテーブルを追加したら、MySQLプロンプトを終了します。

exit

データベースとテーブルをセットアップし、Google Maps APIキーを用意したら、プロジェクト自体を作成する準備が整いました。

[[step-3 -—- creating-the-project]] ==ステップ3—プロジェクトの作成

はじめに述べたように、このプロジェクトの基本コードをGitHubから複製し、アプリケーションを機能させるためのコードを追加します。 この理由は、各ファイルを作成してすべてのコードを自分で追加するプロセスを説明するのではなく、アプリを実行するプロセスを高速化するためです。 また、アプリがGoogle MapsとMapcode APIの両方と通信できるようにするコードの追加と理解に集中することができます。

プロジェクト全体のスケルトンコードはthis GitHub project pageにあります。 次のgitコマンドを使用して、プロジェクトをサーバーに複製します。

git clone https://github.com/do-community/digiaddress.git

これにより、ホームディレクトリにdigiaddressという新しいフォルダが作成されます。 このディレクトリをサーバーのWebルートに移動します。 前提条件にリンクされているLAMPスタックチュートリアルに従った場合、これは/var/www/htmlディレクトリになります。

sudo mv digiaddress/ /var/www/html/

このプロジェクトには、このチュートリアルの後半でコードを追加するいくつかのPHPファイルとJSファイルが含まれています。 ディレクトリ構造を表示するには、最初にaptを使用してtreeパッケージをインストールします。

sudo apt install tree

次に、引数として指定されたdigiaddressディレクトリを使用してtreeコマンドを実行します。

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

この出力から、プロジェクトが6つのPHPファイルと2つのJavaScriptファイルで構成されていることがわかります。 これらのファイルを組み合わせて、アプリケーションの2つの主な機能を作成します。物理アドレスからマップコードを作成することと、マップコードをデコードして元の物理アドレスを取得することです。 次のファイルは、最初の機能を有効にします。

  • index.php

  • geoimplement.php

  • generateDigitialAddress.php

  • db.php

  • createDigitialAddressApp.js

index.phpファイルには、アプリケーションのユーザーインターフェイス(UI)のコードが含まれています。このコードは、ユーザーが物理アドレスを入力できるフォームで構成されています。 index.phpファイルは、ユーザーがフォームを送信するたびにgeoimplement.phpファイルを呼び出します。 geoimplement.phpはGoogle Maps APIを呼び出し、アドレスを渡します。 Googleサーバーは、指定された住所の情報(緯度と経度を含む)を含むJSONで応答します。 次に、この情報はgenerateDigitalAddress.phpファイルに渡されます。このファイルはMapcode APIを呼び出して、緯度と経度で指定された特定の場所のマップコードを取得します。 結果のマップコードは、緯度、経度、物理アドレスとともに、手順2で作成したデータベースに保存されます。 db.phpは、この操作のヘルパーとして機能します。 createDigitalAddressApp.jsファイルは、Googleマップインターフェイスでのマーカーや境界長方形の設定など、アプリに表示されるUX要素を制御するいくつかの操作を実行します。

残りの3つのファイルは、アプリケーションの2番目の機能を有効にします。つまり、特定のマップコードから物理アドレスを取得します。

  • findaddress.php

  • fetchaddress.php

  • findAddressApp.js

findaddress.phpファイルは、index.phpで定義されたものとは異なるアプリケーションUIを定義します。 アプリケーションは、以前に生成されたマップコードを入力として受け入れ、データベースに保存されている対応する物理アドレスを表示します。 ユーザーがこのフォームを送信するたびに、findaddress.phpfetchaddress.phpに呼び出しを送信し、fetchaddress.phpはデータベースからそれぞれのマップコードを取得します。 findAddressApp.jsファイルには、Googleマップインターフェイスでマーカーと境界長方形を設定するためのヘルパーコードが含まれています。

ブラウザでhttp://your_server_ip/digiaddressにアクセスしてインストールをテストし、サーバーのIPアドレスを反映するようにyour_server_ipを変更してください。

[。注意]##

Note:サーバーのIPアドレスがわからない場合は、次のcurlコマンドを実行できます。 このコマンドは、アクセスしているマシンのIPアドレスを示すWebサイトであるicanhazip.comのページコンテンツを出力します。

curl http://icanhazip.com

そこにアクセスすると、ブラウザウィンドウの上部に次の見出しが表示されます。

Generate Digital Address

これにより、プロジェクトファイルが正しくダウンロードされたことを確認できます。 それで、アプリの主な機能であるマップコードの生成の開発に進みましょう。

[[step-4 -—- developing-the-application-39-s-ui]] ==ステップ4—アプリケーションのUIを開発する

アプリケーションインターフェイスのボイラープレートコードは前の手順でダウンロードしたファイルに含まれていますが、これらのファイルの一部にいくつかの変更と追加を加えて、アプリケーションが機能しユーザーを引き付けるようにする必要があります。 アプリケーションのUIを開発するためのコードの更新を開始します。

好みのエディタを使用してindex.phpファイルを開きます。 ここでは、nanoを使用します。

nano /var/www/html/digiaddress/index.php

次のコード行を探します。

/var/www/html/digiaddress/index.php

. . .

. . .

<YOUR KEY>を手順1で取得したGoogleAPIキーに置き換えます。 APIキーを追加すると、行は次のようになります。

/var/www/html/digiaddress/index.php

. . .

. . .

次に、index.phpファイルで次のコメントを見つけます。

/var/www/html/digiaddress/index.php

. . .
            
. . .

このコメントの下に数十行のコードを追加し、アプリケーションがマップコードを生成するために使用する物理的な場所の住所をユーザーが入力できるフォームを作成します。 このコメントの下に、フォームの上部にEnter Addressというタイトルを作成する次の強調表示されたコードを追加します。

/var/www/html/digiaddress/index.php

. . .
            

            
Enter Address
. . .

この下に、次のHTMLコードを追加します。 これにより、ユーザーが情報を入力する5つのテキストフィールド(および適切なラベル)を持つフォームが作成されます。

/var/www/html/digiaddress/index.php

                . . .
                
. . .

フォームコードの下に、次の行を追加します。 これらは、フォームを介して送信された住所から導出された緯度と経度の情報を渡す2つの非表示コントロールを作成します。

/var/www/html/digiaddress/index.php

                            . . .
                            
. . .

最後に、次のコードを追加してこのセクションを閉じます。 これにより、ユーザーがフォームを送信できるようにするGenerateボタンが作成されます。

/var/www/html/digiaddress/index.php

                            . . .
                            
                    
                
. . .

これらの要素を追加した後、ファイルのこのセクションはこれに一致する必要があります。

/var/www/html/digiaddress/index.php

. . .
            

            
Enter Address

. . .

CTRL+O、次にENTERを押してファイルを保存し、ブラウザでアプリケーションに再度アクセスします。

http://your_server_ip/digiaddress

新しく追加されたフォームフィールドとGenerateボタンが表示され、アプリケーションは次のようになります。

image

この時点で、フォームに住所情報を入力してGenerateボタンをクリックしようとしても、何も起こりません。 後でマップコード生成機能を追加しますが、最初に、ユーザーが操作できるマップを追加して、このページの視覚的な魅力を高めることに焦点を当てましょう。

[[step-5 -—- adding-google-maps-controls]] ==ステップ5—Googleマップコントロールの追加

マップがGoogle Maps JavaScript APIを介してWebサイトに表示される場合、ビジターが表示するマップと対話できるユーザーインターフェイス機能が含まれています。 これらの機能はcontrolsとして知られています。 引き続きindex.phpファイルを編集して、このアプリにGoogleマップコントロールを追加します。完了すると、ユーザーは入力フォームの横にある地図を表示したり、ドラッグしてさまざまな場所を表示したり、ズームインおよびズームアウトしたりできるようになります。 、Googleの地図、衛星、ストリートビューを切り替えます。

index.phpファイル内で次のコメントを見つけます。

/var/www/html/digiaddress/index.php

. . .

. . .

このコメントの下に次の強調表示されたコードを追加します。

/var/www/html/digiaddress/index.php

. . .
        

        

. . .

ファイルを保存し、ブラウザでアプリケーションに再度アクセスします。 以下が表示されます。

image

ご覧のとおり、アプリケーションにマップが正常に追加されました。 マップをドラッグしてさまざまな場所にフォーカスしたり、ズームインやズームアウトしたり、マップ、航空写真、ストリートビューを切り替えたりできます。 追加したコードを振り返ると、フォームに入力された地理座標と住所を表示する2つのラベルコントロールも追加されていることに注意してください。

/var/www/html/digiaddress/index.php

            . . .
            
. . .

ブラウザでアプリケーションに再度アクセスし、最初のフィールドに州の名前を入力します。 テキストカーソルを次のフィールドに移動しても、緯度と経度のラベルは表示されず、地図に表示される場所も入力した情報を反映して変わりません。 これらの動作を有効にしましょう。

[[step-6 -—- adding-event-listeners]] ==ステップ6—イベントリスナーの追加

インタラクティブな要素をアプリケーションに追加すると、ユーザーの関心を維持できます。 event listenersを使用して、このアプリケーションにいくつかのインタラクティブな動作を実装します。

eventは、Webページで実行されるアクションです。 イベントは、ユーザーまたはブラウザ自体によって実行されるものです。 一般的なイベントの例は次のとおりです。

  • HTMLボタンをクリックする

  • 入力フィールドの内容を変更する

  • あるページ要素から別の要素にフォーカスを変更する

event listenerは、特定のイベントが発生したときに特定のアクションを実行するようにプログラムに指示するディレクティブです。 AngularJSでは、イベントリスナーは、一般に次の形式に従うディレクティブで定義されます。

ng-event_type=expression

このステップでは、ユーザーがフォームを送信するたびにマップコードに入力された情報を処理するのに役立つイベントリスナーを追加します。 また、アプリケーションをよりインタラクティブにするイベントリスナーをさらに追加します。 具体的には、これらのリスナーを使用して、アプリケーションマップに表示される場所を変更し、マーカーを配置し、ユーザーがフォームに情報を入力するときにその場所の周囲に四角形を描画します。 これらのイベントリスナーをindex.phpに追加するので、ファイルを閉じた場合は、そのファイルを再度開きます。

nano /var/www/html/digiaddress/index.php

追加したコードの最初のバッチまで下にスクロールし、<form>で始まるブロックを見つけます。 これは次のようになります。

/var/www/html/digiaddress/index.php

                . . .
                    
. . .

まず、次の強調表示されたイベントリスナーを開始<form>タグに追加します。 このコードは、ユーザーがフォームから情報を送信するたびに、processForm関数を呼び出すようにアプリに指示します。 processFormcreateDigitalAddressApp.jsファイルで定義され、ユーザーから送信された情報を適切なファイルに送信してマップコードに処理するヘルパー関数として機能します。 手順7でこの関数を詳しく見ていきます。

/var/www/html/digiaddress/index.php

                . . .
                    
. . .

次に、いくつかのblurイベントリスナーを追加して、このブロックの編集を続けます。 blurイベントは、特定のページ要素がフォーカスを失ったときに発生します。 次の強調表示された行をformブロックのinputタグに追加します。 これらの行は、ユーザーのフォーカスがステップ4で作成したそれぞれのフォームフィールドから離れたときに、geocodeAddress関数を呼び出すようにアプリケーションに指示します。 各inputタグを閉じるスラッシュと大なり記号(/>)も削除する必要があることに注意してください。 そうしないと、アプリがblurイベントを正しく登録できなくなります。

/var/www/html/digiaddress/index.php

                . . .
                
                            
. . .

これらの新しい行の最初の行(ng-blur="geocodeAddress(address,'state')" required=""/>)は、「ユーザーのフォーカスが「状態」フィールドから離れたら、geocodeAddress関数を呼び出します」という意味になります。他の新しい行もgeocodeAddressを呼び出しますが、ユーザーのフォーカスがそれぞれのフィールドから離れた場合でも同様です。

processForm関数と同様に、geocodeAddresscreateDigitalAddressApp.jsファイルで宣言されていますが、それを定義するコードはまだそのファイルにありません。 これらのblurイベントが発生した後、マーカーを配置してアプリケーションマップ上に長方形を描画し、フォームに入力された情報を反映するように、この関数を完了します。 また、住所情報を取得して処理するコードをマップコードに追加します。

index.phpファイルを保存して閉じ(CTRL+XYENTERの順に押します)、 `createDigitalAddressApp.js`ファイルを開きます。

nano /var/www/html/digiaddress/js/createDigitalAddressApp.js

このファイルで、次の行を見つけます。

/var/www/html/digiaddress/js/createDigitalAddressApp.js

. . .
$scope.geocodeAddress = function (address, field) {
. . .

この行は、geocodeAddress関数を宣言する場所です。 この数行下で、fullAddressという名前の変数を宣言します。この変数は、ユーザーがアプリケーションのフォームフィールドに入力した情報から人間が読める形式の郵送先住所を作成します。 これは、一連のifステートメントを介して行われます。

/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'];
    }
. . .

これらの行の直後に次のコメントがあります。

/var/www/html/digiaddress/js/createDigitalAddressApp.js

. . .
// add code for locating the address on Google maps
. . .

このコメントの下に、fullAddressがnull以外の値であるかどうかを確認する次の行を追加します。

/var/www/html/digiaddress/js/createDigitalAddressApp.js

                . . .
                if (fullAddress !== "") {
                . . .

この行の下に次のコードを追加します。 このコードは、fullAddressがnullでない場合、HTTP POST methodを使用してフォームに入力された情報をgeoimplement.phpファイルに送信します。

/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) {
                    . . .

次に、PHP呼び出しが正常に返されたかどうかを確認する次の行を追加します。

/var/www/html/digiaddress/js/createDigitalAddressApp.js

                        . . .
                        if (results.data !== "false") {
                        . . .

PHP呼び出しが正常に返された場合、結果を処理できます。 次の行を追加します。これにより、createDigitalAddressApp.jsファイルの先頭に定義されているremoveRectangle関数を呼び出して、以前にマップ上に描画された可能性のある境界長方形が削除されます。

/var/www/html/digiaddress/js/createDigitalAddressApp.js

                            . . .
                            removeRectangle();
                            . . .

removeRectangle();行の下に、マップコントロールの新しい場所を指すマーカーを作成する次の4行を追加します。

/var/www/html/digiaddress/js/createDigitalAddressApp.js

                            . . .
                            new google.maps.Marker({
                                map: locationMap,
                                position: results.data.geometry.location
                            });
                            . . .

次に、次のコードを追加します。このコードは、結果から緯度と経度の情報を取得し、手順5でindex.phpファイルに作成した2つのHTMLラベルとともに表示します。

/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;
                            . . .

最後に、これらの行の下に、次のコンテンツを追加します。 このコードは、マップ上の新しい境界長方形をマークするビューポートを作成します。

/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);
                    });
                }
                . . .

このコンテンツを追加すると、ファイルのこのセクションは次のようになります。

/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);
                    });
                }
                . . .

ファイルを保存しますが、今のところは開いたままにしてください。 ブラウザでアプリケーションに再度アクセスした場合、その外観や動作に新しい変更は表示されません。 同様に、アドレスを入力してGenerateボタンをクリックした場合でも、アプリケーションはマップコードを生成または表示しません。 これは、マップコード機能が機能する前にいくつかのファイルを編集する必要があるためです。 これらの変更を続け、これらのマップコードがどのように生成されるかを詳しく見てみましょう。

[[step-7 -—- understanding-mapcode-generation]] ==ステップ7—マップコード生成を理解する

createDigitalAddressApp.jsファイルを見ながら、前の手順で追加したコードのセクションをスクロールして、フォームから送信された情報を取得し、それを一意のマップコードに処理するコードを見つけます。 ユーザーがGenerateボタンをクリックするたびに、index.phpファイル内のコードがフォームを送信し、createDigitalAddressApp.jsで定義されているprocessForm関数を呼び出します。

/var/www/html/digiaddress/js/createDigitalAddressApp.js

. . .
$scope.processForm = function () {
. . .

次に、processFormgenerateDigitalAddress.phpファイルにHTTPPOSTを作成します。

/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は、無料のWebサービスとして物理アドレスからマップコードを生成するAPIを提供します。 このMapcodeWebサービスの呼び出しがどのように機能するかを理解するには、createDigitalAddressApp.jsを閉じ、generateDigitialAddress.phpファイルを開きます。

nano /var/www/html/digiaddress/generateDigitalAddress.php

ファイルの上部に、次が表示されます。

/var/www/html/digiaddress/generateDigitalAddress.php

include("db.php");を読み取る行は、generateDigitalAddress.phpファイル内のdb.phpファイルからのすべてのテキスト、コード、およびマークアップをincludeincludeに指示します。 db.phpは、手順2で作成したMySQLデータベースのログイン資格情報を保持します。これをgenerateDigitalAddress.phpに含めることで、フォームから送信されたアドレス情報をデータベースに追加できます。

このincludeステートメントの下には、createDigitalAddressApp.jsによって送信された要求に基づいて緯度と経度の情報を取得する行がさらに数行あります。

/var/www/html/digiaddress/generateDigitalAddress.php

. . .
$data = json_decode(file_get_contents("php://input"));
$lat = $data->lat;
$long = $data->lng;
. . .

generateDigitalAddress.phpファイルで次のコメントを探します。

/var/www/html/digiaddress/generateDigitalAddress.php

. . .
// call to mapcode web service
. . .

このコメントの下に次のコード行を追加します。 このコードは、Mapcode APIを呼び出し、latlongをパラメーターとして送信します。

/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");
. . .

Webサービスはdigitaldataに割り当てられたJSONデータを返し、次のステートメントはそのJSONをデコードします。

/var/www/html/digiaddress/generateDigitalAddress.php

. . .
$digitalAddress["status"] = json_decode($digitaldata, TRUE)['local']['territory']." ".json_decode($digitaldata, TRUE)['local']['mapcode'];
. . .

これにより、ユーザー指定の場所のマップコードが返されます。 次の行は、この情報をデータベースに保存します。

/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);
. . .

次に、最後の行はマップコードを呼び出し元の関数にエコーバックします。

/var/www/html/digiaddress/generateDigitalAddress.php

. . .
echo json_encode($digitalAddress);

このファイルを保存して閉じてから、createDigitalAddressApp.jsを再度開きます。

nano /var/www/html/digiaddress/js/createDigitalAddressApp.js

マップコードが正常に取得されると、createDigitalAddressApp.jsファイルの次の行にダイアログボックスでユーザーに表示されます。

/var/www/html/digiaddress/js/createDigitalAddressApp.js

. . .
digiAddress = response.data.status;
. . .
$('#digitalAddressDialog').modal('show');
. . .

generateDigitalAddress.phpに新しいコード行を追加しましたが、ブラウザでアプリにアクセスして操作しても、機能の変更は表示されません。 これは、Google APIキーをgeoimplement.phpファイルにまだ追加していないためです。これにより、Google MapsAPIが実際に呼び出されます。

[[step-8 -—- enable-calls-to-the-google-maps-api]] ==ステップ8— Google MapsAPIへの呼び出しを有効にする

このアプリケーションは、Google Maps APIに依存して、物理アドレスを適切な緯度と経度の座標に変換します。 これらは、マップコードを生成するためにそれらを使用するMapcode APIに渡されます。 そのため、アプリケーションがGoogle Maps APIと通信して場所の緯度と経度を生成できない場合、マップコードを生成しようとしても失敗します。

手順6を思い出してください。ここでは、addressデータを作成した後、createDigitalAddressApp.jsファイルでHTTPPOSTリクエストを介して結果を渡しました。

/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) {

このコードブロックは、ユーザーが入力したアドレスデータを、Google Maps APIを呼び出すコードを含むgeoimplement.phpファイルに送信します。 先に進み、このファイルを開きます。

nano /var/www/html/digiaddress/geoimplement.php

最初に、POSTリクエストを通じて受信したaddressをデコードすることがわかります。

/var/www/html/digiaddress/geoimplement.php

. . .
$data=json_decode(file_get_contents("php://input"));
. . .

次に、入力データのaddressフィールドをgeocode関数に渡します。この関数は、住所の地理情報を返します。

/var/www/html/digiaddress/geoimplement.php

. . .
$result = geocode($data->address);
. . .

次に、結果が発信者にエコーバックされます。

/var/www/html/digiaddress/geoimplement.php

. . .
echo json_encode($result);
. . .

geocode関数はaddressをエンコードし、アプリケーションキーとともにGoogle MapsAPIに渡します。

/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=";
. . .

スクロールする前に、先に進み、// google map geocode api urlコメントの下の行にAPIキーを追加します。

/var/www/html/digiaddress/geoimplement.php

. . .
// google map geocode api url
$url = "https://maps.googleapis.com/maps/api/geocode/json?address={$address}&key=ExampleAPIKeyH2vITfv1eIHbfka9ym634Esw7u";
. . .

Google Maps APIに呼び出しを送信した後、応答がデコードされ、その値が関数によって返されます。

/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;
}
. . .

このファイルを保存して、もう一度アプリケーションにアクセスしてください。 状態フィールドにUS-NYを入力し、TABを押して、入力フォーカスを次のフィールドに変更します。 次の出力が表示されます。

image

フォームに入力した地理座標と物理アドレスが地図の下に表示されることに注意してください。 これにより、アプリケーションはより魅力的でインタラクティブになります。

[。注意]##

Note:地名の略語に関しては、MapcodeはISO3166標準を使用します。 これは、一般的に使用される一部の略語を期待どおりに解釈できない場合があることを意味します。 たとえば、ルイジアナ州の住所のマップコードを生成するときにLAと入力すると、地図は(ルイジアナ州ではなく)カリフォルニア州ロサンゼルスにジャンプします。

米国の郵便略語の前にUS-を付けることで、米国の郵便略語との混同を避けることができます。 このルイジアナの例のコンテキストでは、US-LAと入力します。

Mapcodeがこの標準をどのように使用するかについて詳しくは、Territories and standard codes reference page
を確認してください。

アプリケーションが地図上の場所を表示する方法がこのように改善されていますが、アプリはまだ完全には機能していません。 マップコードを生成する前に実行する必要がある最後の手順は、db.phpファイルを編集して、アプリケーションがデータベースにアクセスできるようにすることです。

[[step-9 -—- adding-database-credentials-and-testing-mapcode-generation]] ==ステップ9—データベース資格情報の追加とマップコード生成のテスト

このアプリケーションは、フォームに入力されたすべての住所を、その緯度、経度、マップコードとともに、ステップ2で作成したデータベースに保存することを思い出してください。 これは、db.phpファイル内のコードによって可能になります。このコードは、データベースの資格情報を格納し、アプリケーションがその中のlocationsテーブルにアクセスできるようにします。

マップコード生成機能を有効にする最後のステップとして、編集のためにdb.phpファイルを開きます。

nano /var/www/html/digiaddress/db.php

このファイルの先頭近くで、$passで始まる行を見つけます。 この行は、アプリケーションがデータベースにアクセスできるようにするために、MySQLログイン資格情報を送信します。 your_passwordrootMySQLユーザーのパスワードに置き換えます。

/var/www/html/digiaddress/db.php

. . .
        $username = "root";
        $pass = "your_password";
. . .

これが、物理アドレスからマップコードを生成するために行う必要がある最後の変更です。 ファイルを保存して閉じてから、ブラウザでアプリケーションをもう一度更新します。 選択したアドレスを入力し、Generateボタンをクリックします。 出力は次のようになります。

image

この段階で、アプリケーションは完成し、世界中の物理的な場所の短いデジタルアドレスを生成できるようになりました。 さまざまな住所を自由に試してみてください。入力する住所は必ずしも米国内である必要はありません。

最後のタスクは、このアプリの2番目の機能を有効にすることです。それぞれのマップコードを使用してデータベースから住所を取得します。

[[step-10 -—- retrieveing-a-physical-address]] ==ステップ10—物理アドレスの取得

指定した物理アドレスからマップコードを生成できるようになったので、最後のステップは、マップコードから派生した元の物理アドレスを取得することです。 これを実現するために、次に示すPHPユーザーインターフェイスを開発します。

image

このUIのコードは、findaddress.phpファイルで入手できます。 このファイル内で定義されたUIは、手順4で説明したUIと非常に似ているため、どのように機能するかの詳細についてはあまり詳しく調べません。 ただし、これら3つのファイルを調べて、それらがどのように機能するかを一般的に説明します。

アドレス取得機能を有効にするには、Google APIキーをfindaddress.phpファイルに追加する必要があるため、お好みのエディターで開きます。

nano /var/www/html/digiaddress/findaddress.php

ファイルの下部近くで、<script async defer src=で始まる行を見つけます。 これは次のようになります。

/var/www/html/digiaddress/findaddress.php

前の手順で行ったように、<YOUR KEY>をGoogle APIキーに置き換えてから、ファイルを保存します。 ただし、閉じる前に、これらのファイルがどのように連携するかを簡単に見てみましょう。

ユーザーがフォームを送信すると、submitイベントがトリガーされ、イベントリスナーがfetchadd関数を呼び出します。

/var/www/html/digiaddress/findaddress.php

. . .

. . .

fetchadd関数は、POSTリクエストでデジタルアドレスをfetchaddress.phpに送信します。

/var/www/html/digiaddress/js/findAddressApp.js

. . .
$http({
    method : 'POST',
    url : 'fetchaddress.php',
    data : {digiaddress: $scope.digiaddress}
}).then(function(response){
. . .

POSTが成功すると、関数はJSON応答を返します。 次の行は、この応答を解析します。

/var/www/html/digiaddress/js/findAddressApp.js

. . .
var jsonlatlng = JSON.parse(response.data.latlng);
. . .

次の行は、地図上のマーカーを設定します。

/var/www/html/digiaddress/js/findAddressApp.js

. . .
marker = new google.maps.Marker({
    position: new google.maps.LatLng(jsonlatlng.latitude, jsonlatlng.longitude),
        map: locationMap
});
. . .

また、次の例では、地理座標と物理アドレスが出力されます。

/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 );
. . .

次のリンクにアクセスして、ブラウザでこのアプリケーションにアクセスします。

http://your_server_ip/digiaddress/findaddress.php

前に取得したマップコードを入力してテストします。 次の図は、典型的な出力を示しています。

image

これで、アプリケーションは完成しました。 世界中の任意の場所に固有のマップコードを作成し、そのマップコードを使用してその場所の物理アドレスを取得できるようになりました。

結論

このチュートリアルでは、Google Maps APIを使用して場所を固定し、その経度、緯度の情報を取得しました。 この情報は、Mapcode APIを使用して一意の短いデジタルアドレスを生成するために使用されます。 緊急サービスから考古学調査まで、マップコードには多くの実用的な使用例があります。 The Stichting Mapcode Foundationは、そのようないくつかのユースケースを示しています。

謝辞

プロジェクトコード全体を開発してくれたDinesh KarpeSayli Patilに感謝します。