Как создать короткий и уникальный цифровой адрес для любого местоположения, используя AngularJS и PHP

Вступление

Почтовые адреса обычно длинные, а иногда их трудно запомнить. Есть ряд сценариев, где более короткий адрес был бы желателен. Например, возможность отправки короткого адреса, состоящего всего из пары символов, может обеспечить более быструю доставку услуг скорой помощи. Питер Гилен и Гарольд Годдин разработалиMapcode system в 2001 году, чтобы упростить создание краткого адреса для любого физического адреса в мире.

В этом руководстве вы разработаете веб-приложение, которое использует API Карт Google для создания короткого цифрового адреса для любого адреса по вашему выбору. Это можно сделать путем клонирования базового кода для этого приложения из GitHub, а затем добавления к нему кода, который сделает его полностью функциональным. Это приложение также сможет извлечь исходный физический адрес из заданного кода карты.

Предпосылки

Для завершения этого урока вам понадобится следующее:

  • Доступ к серверу Ubuntu 18.04. На этом сервере должен быть пользователь, отличный отroot, с привилегиямиsudo и настроенным брандмауэром. Чтобы настроить это, вы можете следить за нашим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. Получение ключа Google API

В этом руководстве вы будете использовать JavaScript для создания интерфейса к Google Maps. Google назначает ключи API, чтобы позволить разработчикам использовать JavaScript API на Картах Google, которые вам нужно будет получить и добавить в код своего веб-приложения.

Чтобы получить собственный ключ API, зайдите в“Get API Key” page Google. Нажмите кнопкуGET STARTED на шаге 1, и откроется всплывающее окно, как показано на следующем изображении:

image

ВыберитеMaps, установив флажок и нажавCONTINUE. Если вы еще не вошли в учетную запись Google, вам будет предложено сделать это. Затем в окне вас попросят указать название проекта, которое может быть любым:

image

После этого вам будет предложено ввести платежную информацию. Обратите внимание, что Google предоставляет ключи API как часть бесплатной пробной версии, но для этого необходимо настроить и включить выставление счетов для их получения.

image

После ввода этой информации ваш ключ API появится на экране. Скопируйте и сохраните его в том месте, где вы можете легко получить его, так как позже вам потребуется добавить его в код проекта.

Получив ключ API, вы можете приступить к созданию основы вашего приложения, создав базу данных MySQL.

[[step-2 -—- Creating-the-database]] == Шаг 2 - Создание базы данных

Веб-приложение, описанное в этом руководстве, принимает адрес пользователя и генерирует для него код карты, а также широту и долготу указанного местоположения. Вы будете хранить эти данные в базе данных 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`)
);

В этой таблице восемь столбцов:digitaladdress,state,zip,street,town,house,latitude иlongitudeс. Первый столбецdigitaladdress представляет собойindexed с использованием командыKEY. Индексы в MySQL работают аналогично тому, как они работают в энциклопедии или другой справочной работе. Каждый раз, когда вы или ваше приложение выдает запрос, содержащий операторWHERE, MySQL считывает каждую запись в каждом столбце, строка за строкой, что может стать чрезвычайно ресурсоемким процессом, поскольку ваша таблица накапливает все больше и больше записей. Индексирование столбца, подобного этому, берет данные из столбца и сохраняет их в алфавитном порядке в отдельном месте, что означает, что MySQL не придется просматривать каждую строку в таблице. Нужно только найти искомые данные в индексе и затем перейти к соответствующей строке в таблице.

После добавления этой таблицы выйдите из командной строки MySQL:

exit

После настройки базы данных и таблицы, а также ключа API Карт Google вы готовы создать сам проект.

[[step-3 -—- create-the-project]] == Шаг 3 - Создание проекта

Как упоминалось во введении, мы будем клонировать базовый код для этого проекта из GitHub, а затем добавим дополнительный код, чтобы сделать приложение функциональным. Причина того, что вместо того, чтобы проводить процесс создания каждого файла и добавления всего кода самостоятельно, заключается в том, чтобы ускорить процесс запуска приложения. Это также позволит нам сосредоточиться на добавлении и понимании кода, который позволяет приложению взаимодействовать как с Google Maps, так и с API-интерфейсами Mapcode.

Вы можете найти скелетный код всего проекта наthis GitHub project page. Используйте следующую командуgit, чтобы клонировать проект на свой сервер:

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

Это создаст новую папку с именемdigiaddress в вашем домашнем каталоге. Переместите этот каталог в корневой каталог вашего сервера. Если вы следовали руководству по стеку LAMP, указанному в предварительных требованиях, это будет каталог/var/www/html:

sudo mv digiaddress/ /var/www/html/

Этот проект содержит несколько файлов PHP и JS, к которым вы добавите код позже в этом руководстве. Чтобы просмотреть структуру каталогов, сначала установите пакетtree, используяapt:

sudo apt install tree

Затем запустите командуtree с каталогомdigiaddress в качестве аргумента:

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

Из этого вывода видно, что проект состоит из шести файлов PHP и двух файлов JavaScript. Вместе эти файлы создают две основные функции приложения: создание кода карты по физическому адресу и декодирование кода карты для получения исходного физического адреса. Следующие файлы включают первую функциональность:

  • index.php

  • geoimplement.php

  • generateDigitialAddress.php

  • db.php

  • createDigitialAddressApp.js

Файлindex.php содержит код для пользовательского интерфейса (UI) приложения, который состоит из формы, в которой пользователи могут вводить физический адрес. Файлindex.php вызывает файлgeoimplement.php каждый раз, когда пользователь отправляет форму. geoimplement.php вызывает API Карт Google и передает ему адрес. Затем сервер Google отвечает JSON, содержащим информацию об указанном адресе, включая его широту и долготу. Затем эта информация передается в файлgenerateDigitalAddress.php, который вызывает API-интерфейс Mapcode для получения кода карты для данного местоположения в соответствии с его широтой и долготой. Полученный код карты вместе с широтой, долготой и физическим адресом затем сохраняются в базе данных, созданной на шаге 2. db.php действует как помощник для этой операции. ФайлcreateDigitalAddressApp.js выполняет ряд операций, которые управляют элементами UX, отображаемыми в приложении, включая установку маркера и прямоугольника границы в интерфейсе Google Maps.

Оставшиеся три файла включают вторую функцию приложения, то есть получение физического адреса из заданного кода карты:

  • findaddress.php

  • fetchaddress.php

  • findAddressApp.js

Файлfindaddress.php определяет пользовательский интерфейс приложения, который отличается от того, который определен вindex.php. Приложение принимает ранее сгенерированный код карты в качестве входных данных и отображает соответствующий физический адрес, хранящийся в базе данных. Когда пользователь отправляет эту форму,findaddress.php отправляет вызовfetchaddress.php, который затем извлекает соответствующий код карты из базы данных. ФайлfindAddressApp.js содержит вспомогательный код для установки маркера и ограничивающего прямоугольника в интерфейсе Google Maps.

Проверьте установку, посетивhttp://your_server_ip/digiaddress в своем браузере, не забудьте изменитьyour_server_ip, чтобы он отражал IP-адрес вашего сервера.

[.Примечание]##

Note: Если вы не знаете IP-адрес своего сервера, вы можете выполнить следующую командуcurl. Эта команда распечатает содержимое страницыicanhazip.com, веб-сайта, который показывает IP-адрес машины, обращающейся к нему:

curl http://icanhazip.com

Оказавшись там, вы увидите этот заголовок в верхней части окна вашего браузера:

Generate Digital Address

Это подтверждает, что вы правильно загрузили файлы проекта. После этого давайте приступим к разработке основной функции приложения: генерации кода карты.

[[step-4 -—- development-the-application-39-s-ui]] == Шаг 4. Разработка пользовательского интерфейса приложения

Несмотря на то, что стандартный код для интерфейса приложения включен в файлы, загруженные на предыдущем шаге, вам все же необходимо внести несколько изменений и дополнений в некоторые из этих файлов, чтобы сделать приложение функциональным и привлекательным для пользователей. Мы начнем с обновления кода для разработки пользовательского интерфейса приложения.

Откройте файлindex.php с помощью предпочитаемого вами редактора. Здесь мы будем использоватьnano:

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

Найдите следующую строку кода:

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

. . .

. . .

Замените<YOUR KEY> ключом Google API, полученным на шаге 1. После добавления вашего ключа 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-код. Это создает форму с пятью текстовыми полями (вместе с соответствующими ярлыками), куда пользователи будут вводить свою информацию:

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

                . . .
                
. . .

Ниже кода формы добавьте следующие строки. Они создают два скрытых элемента управления, которые передают информацию о широте и долготе, полученную из любого адреса, отправленного через форму:

/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 -—- add-google-maps-controls]] == Шаг 5. Добавление элементов управления Google Maps

Когда карты отображаются на веб-сайте через JavaScript API Google Карт, они содержат функции пользовательского интерфейса, которые позволяют посетителям взаимодействовать с картой, которую они видят. Эти функции известны какcontrols. Мы продолжим редактировать файлindex.php, чтобы добавить элементы управления Google Maps в это приложение, и, когда закончите, пользователи смогут просматривать карту рядом с формой ввода, перетаскивать ее, чтобы просмотреть различные местоположения, увеличивать и уменьшать масштаб , а также переключаться между видами карты Google, спутниковым и уличным.

Найдите следующий комментарий в файлеindex.php:

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

. . .

. . .

Добавьте следующий выделенный код ниже этого комментария:

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

. . .
        

        

. . .

Сохраните файл, затем снова откройте приложение в браузере. Вы увидите следующее:

image

Как видите, мы успешно добавили карту в приложение. Вы можете перетащить карту, чтобы сфокусироваться на разных местах, увеличивать и уменьшать масштаб и переключаться между картой, спутником и улицей. Оглядываясь на только что добавленный код, обратите внимание, что мы также добавили два элемента управления метками, которые будут отображать геокоординаты и физический адрес, которые были введены в форму:

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

            . . .
            
. . .

Зайдите в приложение снова в вашем браузере и введите название штата в первое поле. Когда вы перемещаете текстовый курсор в следующее поле, метки широты и долготы не отображаются, а местоположение, отображаемое на карте, не меняется, отражая введенную вами информацию. Давайте включим это поведение.

[[step-6 -—- add-event-listeners]] == Шаг 6. Добавление прослушивателей событий

Добавление интерактивных элементов в приложение может помочь заинтересовать его пользователей. Мы реализуем несколько интерактивных вариантов поведения в этом приложении с помощьюevent listeners.

event - это любое действие, которое происходит на веб-странице. События могут быть сделаны пользователем или самим браузером. Примеры общих событий:

  • Нажатие кнопки 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 всякий раз, когда пользователь отправляет информацию через форму. processForm определен в файлеcreateDigitalAddressApp.js и служит вспомогательной функцией, которая отправляет информацию, представленную пользователями, в соответствующие файлы, которые затем преобразуют ее в код карты. Мы более подробно рассмотрим эту функцию на шаге 7:

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

                . . .
                    
. . .

Затем продолжите редактирование этого блока, добавив пару слушателей событийblur. Событиеblur происходит, когда данный элемент страницы теряет фокус. Добавьте следующие выделенные строки в тегиinput блокаform. Эти строки говорят приложению вызывать функциюgeocodeAddress, когда фокус пользователя смещается с соответствующих полей формы, которые мы создали на шаге 4. Обратите внимание, что вы также должны удалить косые черты и знаки «больше» (/>), закрывающие каждый тегinput. В противном случае приложение не сможет правильно зарегистрировать событияblur:

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

                . . .
                
                            
. . .

Первая из этих новых строк -ng-blur="geocodeAddress(address,'state')" required=""/> - переводится как «Когда фокус пользователя смещается с поля« состояние », вызовите функциюgeocodeAddress». Другие новые строки также вызываютgeocodeAddress, хотя и когда фокус пользователя смещается с их соответствующих полей.

Как и в случае с функциейprocessForm,geocodeAddress объявлен в файлеcreateDigitalAddressApp.js, но в этом файле еще нет кода, определяющего его. Мы завершим эту функцию, чтобы она поместила маркер и нарисовала прямоугольник на карте приложения после наступления этих событийblur, чтобы отразить информацию, введенную в форму. Мы также добавим некоторый код, который берет информацию об адресе и обрабатывает ее в коде карты.

Сохраните и закройте файлindex.php (нажмитеCTRL+X,Y, затемENTER), а затем откройте файл `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 любым значением, отличным от нуля:

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

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

Добавьте следующий код ниже этой строки. Этот код отправляет информацию, введенную в форму, в файлgeoimplement.php, используяHTTP POST method, еслиfullAddress не равно нулю:

/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 был успешно возвращен, мы сможем обработать результат. Добавьте следующую строку, которая удаляет любой граничный прямоугольник, который ранее мог быть нарисован на карте, путем вызова функцииremoveRectangle, которая определена в верхней части файлаcreateDigitalAddressApp.js:

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

                            . . .
                            removeRectangle();
                            . . .

Под строкойremoveRectangle(); добавьте следующие четыре строки, которые создадут маркер, указывающий на новое местоположение на элементе управления картой:

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

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

Затем добавьте следующий код, который получает информацию о широте и долготе из результата и отображает ее с двумя метками HTML, которые мы создали в файлеindex.php на шаге 5:

/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, приложение все равно не сгенерирует или не отобразит код карты. Это потому, что мы все еще должны отредактировать несколько файлов, прежде чем функциональность mapcode будет работать. Давайте продолжим вносить эти изменения, а также подробнее рассмотрим, как генерируются эти коды карт.

[[step-7 -—-standing-mapcode-generation]] == Шаг 7. Общие сведения о создании Mapcode

Продолжая смотреть на файлcreateDigitalAddressApp.js, прокрутите раздел кода, который вы добавили на предыдущем шаге, чтобы найти код, который принимает информацию, отправленную через форму, и преобразует ее в уникальный код карты. Каждый раз, когда пользователь нажимает кнопкуGenerate, код в файлеindex.php отправляет форму и вызывает функциюprocessForm, которая определена здесь вcreateDigitalAddressApp.js:

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

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

processForm затем отправляет HTTP POST в файлgenerateDigitalAddress.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 предоставляет API, который генерирует коды карт из физических адресов в качестве бесплатной веб-службы. Чтобы понять, как работает этот вызов веб-службы Mapcode, закройтеcreateDigitalAddressApp.js и откройте файлgenerateDigitialAddress.php:

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

В верхней части файла вы увидите следующее:

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

Строкаinclude("db.php"); сообщает PHPinclude весь текст, код и разметку из файлаdb.php в файлеgenerateDigitalAddress.php. db.php содержит учетные данные для входа в базу данных MySQL, созданную на шаге 2, и, включив их в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
. . .

Добавьте следующую строку кода ниже этого комментария. Этот код вызывает API Mapcode, отправляяlat иlong в качестве параметров.

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

Веб-служба возвращает данные JSON, которые были назначеныdigitaldata, и следующий оператор декодирует этот 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, вы по-прежнему не увидите никаких функциональных изменений, когда вы посещаете приложение и взаимодействуете с ним в браузере. Это связано с тем, что вы еще не добавили свой ключ API Google в файлgeoimplement.php, который выполняет фактический вызов API Карт Google.

[[step-8 -—- enable-calls-to-the-google-maps-api]] == Шаг 8. Включение вызовов к API Карт Google

Это приложение зависит от API Карт Google для перевода физического адреса в соответствующие координаты широты и долготы. Затем они передаются в API Mapcode, который использует их для генерации кода карты. Следовательно, если приложение не может связаться с API Карт Google для создания широты и долготы местоположения, любая попытка сгенерировать код карты потерпит неудачу.

Вспомните шаг 6, где после построения данныхaddress мы передали результат через HTTP-запрос POST в файлеcreateDigitalAddressApp.js:

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

Этот блок кода отправляет адресные данные, введенные пользователем, в файлgeoimplement.php, содержащий код, вызывающий API Карт Google. Идите и откройте этот файл:

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

Вы увидите, что сначала он декодируетaddress, полученный через запрос POST:

/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 и передает его в API Карт Google вместе с ключом вашего приложения:

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

Перед тем, как прокручивать, добавьте свой ключ API в строку под комментарием// google map geocode api url:

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

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

После отправки вызова в API Карт Google ответ декодируется, и его значение возвращается функцией:

/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 использует стандарт ISO 3166. Это означает, что он может не интерпретировать некоторые часто используемые сокращения, как ожидалось. Например, если вы хотите сгенерировать Mapcode для адреса в Луизиане и ввестиLA, карта переместится в Лос-Анджелес, Калифорния (а не в штат Луизиана).

Вы можете избежать путаницы с почтовыми аббревиатурами США, поставив перед нимиUS-. В контексте этого примера Луизианы вы должны ввестиUS-LA.

Чтобы узнать больше о том, как Mapcode использует этот стандарт, ознакомьтесь сTerritories and standard codes reference page.

Несмотря на это улучшение того, как приложение отображает местоположения на карте, приложение все еще не полностью функционально. Последний шаг, который вам нужно сделать, прежде чем вы сможете сгенерировать код карты, - это отредактировать файлdb.php, чтобы приложение могло получить доступ к вашей базе данных.

[[step-9 -—- add-database-credentials-and-testing-mapcode-generation]] == Шаг 9 - Добавление учетных данных для базы данных и тестирование генерации Mapcode

Напомним, что это приложение сохраняет каждый адрес, введенный в форму, а также его широту, долготу и код карты, в базе данных, созданной на шаге 2. Это стало возможным благодаря коду в файлеdb.php, в котором хранятся учетные данные вашей базы данных и который позволяет приложению получить доступ к таблицеlocations в нем.

В качестве последнего шага для включения функции генерации кода карты откройте файлdb.php для редактирования:

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

В верхней части этого файла найдите строку, которая начинается с$pass. Эта строка отправляет ваши учетные данные для входа в MySQL, чтобы приложение могло получить доступ к вашей базе данных. Заменитеyour_password своим паролем пользователя MySQLroot:

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

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

Это последнее изменение, которое вам нужно сделать, чтобы сгенерировать код карты из физического адреса. Сохраните и закройте файл, затем снова обновите приложение в браузере. Введите адрес по вашему выбору и нажмите кнопкуGenerate. Вывод будет выглядеть примерно так:

image

На этом этапе вы заполнили заявку и теперь можете создать короткий цифровой адрес для любого физического местоположения в мире. Не стесняйтесь экспериментировать с разными адресами и учтите, что введенный вами адрес не обязательно должен находиться в Соединенных Штатах.

Ваша последняя задача - включить вторую функцию этого приложения: получение адреса из базы данных с использованием соответствующего кода карты.

[[step-10 -—- retrieving-a-physical-address]] == Шаг 10 - Получение физического адреса

Теперь, когда вы можете сгенерировать код карты по заданному физическому адресу, ваш последний шаг - получить исходный физический адрес, полученный из кода карты. Для этого мы разработаем пользовательский интерфейс PHP, показанный здесь:

image

Код для этого пользовательского интерфейса доступен в файлеfindaddress.php. Поскольку пользовательский интерфейс, определенный в этом файле, довольно похож на пользовательский интерфейс, который мы рассмотрели ранее на шаге 4, мы не будем слишком подробно рассматривать все детали его работы. Мы, однако, рассмотрим эти три файла, чтобы в общих чертах объяснить, как они функционируют.

Чтобы включить функцию получения адреса, вам необходимо добавить ключ 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 отправляет цифровой адрес наfetchaddress.php с запросом POST:

/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

На этом ваше заявление закончено. Теперь вы можете создать уникальный код карты для любого местоположения в мире, а затем использовать этот код карты для получения физического адреса местоположения.

Заключение

В этом руководстве вы использовали API Карт Google для закрепления местоположения и получения информации о его долготе и широте. Эта информация используется для генерации уникального и короткого цифрового адреса с использованием Mapcode API. Существует несколько случаев практического использования картографических кодов, от аварийных служб до археологических исследований. The Stichting Mapcode Foundation перечисляет несколько таких вариантов использования.

Подтверждения

Большое спасибоDinesh Karpe иSayli Patil за разработку всего кода проекта.

Related