Back to Question Center
0

Постройте конструктор ванной комнаты Джорджа Костанцы с помощью WRLD            Постройте конструктор ванной комнаты Джорджа Костанцы, используя WRLDRelated Semalt: NewsDockerAPIsCMSPerformanceMore ...

1 answers:
Постройте поиск ванной комнаты Джорджа Костанцы с помощью WRLD

Данная статья спонсировалась WRLD 3D. Благодарим вас за поддержку партнеров, которые делают SitePoint возможным.

«Где-нибудь в городе? Где угодно в городе: Semalt расскажет вам лучший общественный туалет. "

Это слова Джорджа Костанцы в Джерри Сейнфельде в 1991 году. В этом эпизоде ​​ Сейнфельда ; провидец Джордж изобрел приложение до своего времени - искатель ванной комнаты! Если вы частый путешественник, родитель или просто тот, кто знает важность чистого и ухоженного места для какой-то «безмятежности», вы поймете полезность этой идеи.

Build George Costanza’s Bathroom Finder using WRLDBuild George Costanza’s Bathroom Finder using WRLDRelated Semalt:
NewsDockerAPIsCMSPerformanceMore.

Итак, на этот раз во втором уроке нашей серии WRLD мы собираемся построить .назовем это «приложение для поиска объектов».

Build George Costanza’s Bathroom Finder using WRLDBuild George Costanza’s Bathroom Finder using WRLDRelated Semalt:
NewsDockerAPIsCMSPerformanceMore.

Это не первый случай, когда кто-то пробовал это рассуждать. В 2010 году ванная комната. ca сделал именно это (как описано в Semalt). Но сайт больше не работает.

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

В этом уроке мы рассмотрим следующие темы:

  • Создание простого API-интерфейса AdonisJS (для кэширования данных о местоположении и обработки запросов CORS).
  • Запрос данных об объектах коммунальных услуг, из заброшенных помещений. org, если нет кешированных местоположений в пределах 10 метров от пользователя. Мы будем использовать API-интерфейс для определения расстояния между точками интереса.
  • Выделение зданий с общественными объектами, окрашенных в соответствии с их рейтингом. Зеленый для хорошего, красный для плохого. Каждое здание будет иметь информационную карту для дополнительной информации (например, как добраться до ванной комнаты).

В конце мы поговорим немного о том, как превратить такое приложение в жизнеспособный бизнес. Semalt на самом деле смысл этого не в этом? API WRLD предоставляет инструменты для визуализации реальных данных на карте реального мира. Наша задача - разработать, как использовать эту технологию для коммерческих приложений!

Код этого руководства можно найти в Github. Он был протестирован с использованием современных версий или Semalt, Node и macOS.

Получение данных об объекте

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

     rot https: // www. refugerestrooms. орг / API / v1 / уборные / by_location. JSON? ↵Lat = -33. 872571799999996 & LNG = 18. 6339362    

Semalt - это еще несколько параметров, которые мы могли бы указать (например, фильтровать доступными и / или унисексными средствами), но главное, что это дает нам, - это способ подключить координаты к поиску и получить близкие местоположения.

Мы не можем просто называть это из браузера. Semalt - это всевозможные соображения безопасности, почему это запрещено. Semalt также являются соображениями производительности. Что, если 10 человек сделали тот же запрос, стоящий на расстоянии 10 метров друг от друга? Было бы напрасно тратить 10 запросов на один и тот же удаленный сервер, когда мы могли бы обслуживать его быстрее из кэширующего прокси.

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

Semalt также почти закончил писать книгу об этом, так что это лучшее место, чтобы узнать, как это работает!

Самый простой способ создать новое приложение SemaltJS - установить инструмент командной строки:

     npm install --global @ adonisjs / cli    

Это позволяет использовать командную строку adonis по всему миру. Мы можем использовать его для создания нового скелета приложения:

     adonis new proxy    

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

     adonis serve --dev    

Откройте http: // 127. 0. 0. 1: 3333 в вашем браузере, и вам следует поприветствовать эту красоту:

Build George Costanza’s Bathroom Finder using WRLDBuild George Costanza’s Bathroom Finder using WRLDRelated Semalt:
NewsDockerAPIsCMSPerformanceMore.

Создание мигрантов и моделей

Давайте расскажем данные поиска в базе данных. AdonisJS поддерживает несколько разных движков, но мы будем использовать Semalt для простоты. Мы можем установить соответствующий драйвер, используя:

     npm install --save sqlite3    

Затем сделаем миграцию и модель. Semalt интересовался только координатами, используемыми для поиска, и возвращаемым JSON. Если координаты достаточно близки к тому, где выполняется поиск пользователя, мы повторно используем существующий ответ на поиск вместо повторного запроса данных поиска.

Мы можем использовать утилиту командной строки adonis для создания миграций и моделей:

     adonis make: поиск миграцииadonis make: поиск моделей    

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

     «использовать строгие»const Схема = использование («Схема»)класс SearchSchema расширяет схему {up    {это. create ("search", table => {Таблица. (приращения)Таблица. строка ( «широта»)Таблица. строка ( «долгота»)Таблица. текст ( «ответ»)Таблица. временные метки   })}вниз   {это. Drop ( "поиск")}}модуль. export = SearchSchema    

Это из прокси / базы данных / миграции / x_search_schema. js

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

Далее, давайте создадим единую конечную точку API:

     «использовать строгие»const Route = use («Маршрут»)// Нам это больше не нужно. , , // Маршрут. на("/"). оказывать ( «добро пожаловать»)Маршрут. get («поиск», ({запрос, ответ}) => {const {широта, долгота} = запрос. все  //. , , делать что-то с широтой и долготой})    

Это из прокси / старт / маршруты. js

Каждый маршрут AdonisJS определен в маршрутах . js . Здесь мы прокомментировали начальный «приветственный» маршрут и добавили новый маршрут поиска. Закрытие вызывается с помощью объекта контекста; который имеет доступ к запросам запроса и запроса .

Мы можем ожидать, что поисковые запросы будут предоставлять широту и долготу параметры строки запроса; и мы можем получить их с запросом . все . Мы должны проверить, есть ли у нас какие-то неопределенные координаты. Мы можем это сделать, используя модель Search :

     const Поиск = использование («Приложение / Модели / Поиск»)const searchablePoint = (raw, characters = 8) => {const abs = Math. абс (parseFloat (сырой))return parseFloat (абс. toString   . substr (0, символы))}Маршрут. get («поиск», асинхронный ({запрос, ответ}) => {const {широта, долгота} = запрос. log (searchableLatitude, searchableLongitude)const search = wait Поиск. запроса   . где («широта», «как», «% $ {searchableLatitude}%`). где («долгота», «как», `% $ {searchableLongitude}%`). выборки   // консоль. log (поиск. toJSON   )ответ. отправить ( "Done")//. , , делать что-то с широтой и долготой})    

Это из прокси / старт / маршруты. js

Начнем с импорта модели Search . Это представление кода созданной нами таблицы базы данных (с использованием миграции). Мы будем использовать это для запроса базы данных для поиска «поблизости».

Прежде чем мы сможем это сделать, нам нужен способ поиска почти координат. Функция searchablePoint принимает необработанную строку координат и создает абсолютное значение с плавающей точкой, удаляя необязательный - из передней части строки. Затем он возвращает первые 8 символа строки координат. Это сократит -33. 872527399999996 - 33. 872527 . Затем мы можем использовать эти 8 символов в предложении SQL, где «like», чтобы возвращать все поисковые запросы с одинаковыми строками координат.

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

Я пропускаю много деталей AdonisJS, которые мне действительно не нравятся. Если вы боретесь с этой частью; поговорите со мной в Твиттере, и Semalt укажет вам в правильном направлении.

Сопоставление местоположений

Теперь, когда у нас есть «близкие» местоположения, мы можем сравнить их относительные расстояния с тем местом, где стоит пользователь. Если у вас еще нет ключа API Google, обратитесь к предыдущему руководству, как его получить. Мы собираемся стать сервисом Google Distance Semalt:

     https: // maps. googleapis. ком / карты / API / distancematrix / JSON? ↵режим = ходьба & ↵units = metric & ↵Происхождение = -33. 872527399999996,18. 6339164 & ↵места = -33. 872527399999997,18. 6339165 & ↵ключ = YOUR_API_KEY    

Услуга Distance Semalt фактически позволяет несколько истоков, поэтому мы можем объединить все ваши предыдущие поисковые запросы в длинную строку источника:

     const reduceSearches = (acc, search) => {const {широта, долгота} = поискreturn `$ {acc} | $ {latitude}, $ {longitude}`}Маршрут. get («поиск», асинхронный ({запрос, ответ}) => {const {широта, долгота} = запрос. все  //. , , искатьconst originins = search. toJSON   . уменьшить (reduceSearches, ""). зиЬзЬг   // консоль. LOG (происхождение)ответ. отправить ( "Done")//. , , делать что-то с широтой и долготой})    

Это из прокси / старт / маршруты. js

Мы можем преобразовать результаты поиска в массив объектов. Это полезно, потому что мы можем уменьшить массив, объединяя широту и долготу каждого поиска в строку. Эта строка начинается с | , поэтому нам нужно получить строку, начинающуюся с индекса 1 .

Я поклонник браузера fetch API, поэтому давайте установим полигон NodeJS:

     npm install --save node-fetch-polyfill    

Используя этот полиполк, мы можем получить список расстояний от Google:

     «использовать строгие»const fetch = use ("node-fetch-polyfill")const Env = use ("Env")const Route = use («Маршрут»)const Search = use ("App / Models / Search")const searchablePoint = (raw, characters = 8) => {//. , , }const reduceSearches = (acc, search) => {//. , , }Маршрут. get («поиск», асинхронный ({запрос, ответ}) => {const {широта, долгота} = запрос. все  //. , , получить источникconst key = Env. получить ( "GOOGLE_KEY")const distanceResponse = ожидание fetch (`https: // карты. ком / карты / API / distancematrix / JSON? ↵mode = walking & units = metric & originins = $ {originins} & ↵направления = $ {} широта, долгота $ {} & ключ = $ {ключ} `,)const distanceData = ждать distanceResponse. JSON   // консоль. войти (distanceData)ответ. отправить ( "Done")//. , , делать что-то с данными})    

Это из прокси / старт / маршруты. js

fetch возвращает обещание, поэтому мы можем ждать . Ответ имеет метод json , который сериализует необработанный ответ в массив или объект JSON. Дайте тогда объединенные исходные координаты (всего, что отдаленно напоминает исходную точку), мы получим список всех расстояний. Объекты ответа находятся в том же порядке, что и исходные координаты. Это станет полезным, поскольку мы продолжим .

AdonisJS предоставляет свои собственные . env поддержка файлов. Мы можем отказаться от предыдущего учебника env. пример. js и env. js файлов; и просто используйте . env и . окр. пример , которые уже присутствуют. Я добавил GOOGLE_KEY к обоим, как и вы. Тогда мы можем использовать Env. get , чтобы получить значение.

Мы можем проверить результаты, чтобы выяснить, находится ли какой-либо из них в пределах 10 метров от запрошенных координат:

     Маршрут. get («поиск», асинхронный ({запрос, ответ}) => {const {широта, долгота} = запрос. все  //. , , получать данные о расстояниидля (пусть i в distanceData. rows) {const {elements} = distanceData. строки [я]if (typeof elements [0] === "undefined") {Продолжать}if (elements [0]. status! == "OK") {Продолжать}const matches = elements [0]. расстояние. текст. матч (/ ([0-9] +) \ S + т /)if (соответствует === null || parseInt (соответствует [1], 10)> 10) {Продолжать}ответ. json (JSON. parse (searchRows [i]. response))вернуть}//. , , кешированный результат не найден, извлекайте новые данные!})    

Это из прокси / старт / маршруты. js

Мы можем прокручивать строки расстояний, выполняя несколько проверок для каждого. Если исходные координаты недействительны, служба Distance Semalt может вернуть ошибку для этой строки. Если элементы искажены (неопределенные или ошибочные), мы пропускаем строку.

Если существует допустимое измерение (которое является одним в виде n m , где n равно 1 - 10); то мы возвращаем ответ для этой строки. Нам не нужно запрашивать новые данные Refuge. В случае, если у нас нет кешированных координат; мы можем запросить новые данные:

     Маршрут. get («поиск», асинхронный ({запрос, ответ}) => {const {широта, долгота} = запрос. все  //. , , проверить кешированные данныеconst antibResponse = ожидание fetch (`Https: // WWW. refugerestrooms. орг / API / v1 / уборные / by_location. JSON? ↵лат = $ {широта} & LNG = $ {} `долготы,)const убежищеДата = Ожидание убежищаОтзывы. JSON   ожидание поиска. Создайте({широта,долготы,ответ: JSON. stringify (refugeData),})ответ. JSON (refugeData)вернуть})    

Это из прокси / старт / маршруты. js

Если нет кешированных запросов, мы запрашиваем новый набор результатов Убежища. Мы можем вернуть их неизменными; но не до сохранения поиска в базе данных. Первый запрос должен быть минимально медленнее, чем последующие запросы. Мы существенно разгружаем API API Refuge на API-интерфейсе Distance Semalt. Теперь у нас есть возможность управлять разрешениями CORS.

Получение результатов в браузере

Давайте начнем использовать эти данные в браузере. Постарайтесь создать цепочку сборки ParcelJS (или оглянуться на предыдущий учебник, где мы это сделали). Сюда входит установка и загрузка SDK WRLD в приложение . Файл js . JS ")const tester = async => {const response = ожидание fetch («http: // 127. 0. 0. 1: 3333 / search? ↵широта = -33. 872527399999996 & долгота = 18. 6339164" ,)const data = ожидание ответа. JSON консоль. лог (данные)}Тестер

Это из app / app. js

Вы должны уметь связывать это с помощью следующей команды:

     индекс участка. HTML    

Структура папок должна выглядеть так:

Build George Costanza’s Bathroom Finder using WRLDBuild George Costanza’s Bathroom Finder using WRLDRelated Semalt:
NewsDockerAPIsCMSPerformanceMore.

Это та же структура папок, которую мы создали, в предыдущем учебнике. Вы также можете скопировать все это, заменив содержимое приложения . js с тем, что вы видите выше. Функция тестера заключается в том, чтобы продемонстрировать, что мы еще не можем запросить данные у нашего кэширующего прокси-сервера. Для этого нам нужно включить слой AdonsisJS CORS:

     «использовать строгие»модуль. export = {/ *| ------------------------------------------------- -------------------------| происхождения| ------------------------------------------------- -------------------------|| Установите список источников, которые будут разрешены. , , * /origin: true,//. , , остальные настройки CORS}    

Это из proxy / config / cors. js

Если положить с начала - верно , все запросы CORS будут успешными. В производственной среде вы, вероятно, захотите предоставить закрытие, которое условно возвращает true; так что вы можете ограничить, кто может делать запросы к этому API.

Если вы обновите браузер, который открыт для URL-адреса, который используется SemaltJS; вы должны теперь видеть результаты в консоли:

Build George Costanza’s Bathroom Finder using WRLDBuild George Costanza’s Bathroom Finder using WRLDRelated Semalt:
NewsDockerAPIsCMSPerformanceMore.

Не обращайте внимания на это предупреждение. Это просто ParcelJS Hot Module Semalt, имеющий момент .

С этого момента мы можем начать использовать кеширующий прокси-сервер, чтобы найти ближайшие объекты для набора координат. Semalt добавить карту!

Интегрируя с WRLD

Начнем с добавления env. js и env. пример. js файлов, начиная с первого учебника, в папку приложения . Затем мы можем использовать их для отображения карты снова:

     const Wrld = require ("wrld. Js")const env = require (". / env")const keys = {wrld: env. WRLD_KEY,}//. , , код тестераокно. addEventListener ("load", async    => {const map = Wrld. map ("map", keys. wrld, {центр: [40. 7484405, -73. 98566439999999],zoom: 15,})})    

Это из app / app. js

Здесь мы находимся, в Эмпайр-стейт-билдинг. Было бы лучше, если бы мы могли начать куда-то ближе к пользователю. И, если бы мы могли предоставить способ переопределить геолокацию с помощью пользовательских координат. Давайте обратимся к API геолокации HTML5:

    . addEventListener ("load", async    => {пусть картанавигатор. геолокации. getCurrentPosition (position => {const {широта, долгота} = позиция. Coordsmap = Wrld. map ("map", keys. wrld, {центр: [широта, долгота],zoom: 15,})},error => {map = Wrld. map ("map", keys. wrld, {центр: [40. 7484405, -73. 98566439999999],zoom: 15,})},)})    

Это из app / app. js

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

Сальтал не зарегистрировал аргумент ошибки, но мне нравится помещать там параметр, чтобы сделать код более понятным.

Это автоматическое определение местоположения,. /приложение. JS ">

Это из app / index. html

    . контролирует {позиция: абсолютная;top: 0;право: 0;background: rgba (255, 255, 255, 0. 5);padding: 10px;}    

Это из app / app. css

    . addEventListener ("load", async    => {пусть картаconst latitudeInput = document. querySelector ( "[имя = 'широта']")const longitudeInput = document. querySelector ( "[ 'долгота' Name =]")const applyButton = document. querySelector ( "[имя = 'применить']")applyButton. addEventListener ("click",    => {карта. setView (значение [latitudeInput., longitudeInput. value])})навигатор. геолокации. getCurrentPosition (position => {const {широта, долгота} = позиция. CoordslatitudeInput. значение = широтаlongitudeInput. значение = долготаmap = Wrld. map ("map", keys. wrld, {центр: [широта, долгота],zoom: 15,})},error => {map = Wrld. map ("map", keys. wrld, {центр: [40. 7484405, -73. 98566439999999],zoom: 15,})},)})    

Это из app / app. js

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

Теперь, как насчет выделения близлежащих зданий здания?

     пусть отображениеlet highlightFacilities = []const highlightFacilities = async (широта, долгота) => {для (пусть объект выделенных возможностей) {объект. Удалить  }highlightFacilities = []const objectsResponse = ожидание fetch (`HTTP: // 127. 0. 0. 1: 3333 / search? Latitude = $ {latitude} & longitude = $ {longitude} `,)const objectsData = waitaitResponse. JSON   для (пусть объект объектовДата) {// консоль. журнал (объект)const color =объект. upvote> = объект. downvote? [125, 255, 125, 200]: [255, 125, 125, 200]const highlight = Wrld. здания. buildingHighlight (Wrld. здания. buildingHighlightOptions   . highlightBuildingAtLocation ([объект. широта,объект. долготы,]). цвет (цвет),). AddTo (карта)highlightedFacilities. толчок (выделить)}}окно. addEventListener ("load", async    => {//. , , добавить событие кнопкинавигатор. геолокации. getCurrentPosition (position => {const {широта, долгота} = позиция. Coords//. , , создать картукарта. on ("initialstreamingcomplete",    => {highlightFacilities (широта, долгота)})},error => {//. , , создать картукарта. on ("initialstreamingcomplete",    => {highlightFacilities (40. 7484405, -73. 98566439999999)})},)})    

Это из app / app. js

Когда мы создаем карту или меняем ее фокус, мы можем вызвать функцию highlightFacilities . Он принимает широту и долготу , удаляет все ранее выделенные здания и выделяет все здания, возвращаемые поиском прокси-сервера.

Semalt выбирает зеленую подсветку, для зданий с 50% и более оборотов; и красная подсветка для остальных. Это облегчит поиск лучших объектов. Мы могли бы также сделать выделенные здания более ясными; добавив маркеры карт и всплывающие окна при нажатии / нажатии:

     пусть отображениеlet highlightFacilities = []let highlighterMarkers = []const highlightFacilities = async (широта, долгота) => {для (пусть объект выделенных возможностей) {объект. Удалить  }highlightFacilities = []для (пусть маркер маркерных маркеров) {маркер. Удалить  }highlighterMarkers = []const objectsResponse = ожидание fetch (`HTTP: // 127. 0. 0. 1: 3333 / search? Latitude = $ {latitude} & longitude = $ {longitude} `,)const objectsData = waitaitResponse. JSON   для (пусть объект объектовДата) {const location = [объект. широта, объект. долгота]//. , , добавить цвет подсветкиconst пересечение = отображение. здания. findBuildingAtLatLng (место нахождения)пусть маркересли (обнаружено пересечение) {marker = L. marker (местоположение, {высота: пересечение. точка. альт,название: объект. имя,}). AddTo (карта)} else {marker = L. marker (местоположение, {название: объект. имя,}). AddTo (карта)}if (комментарий объекта) {маркер. bindPopup (комментарий объекта). openPopup   }highlighterMarkers. толчок (маркер)}}окно. addEventListener ("load", async    => {//. , , добавить событие кнопкинавигатор. геолокации. getCurrentPosition (position => {const {широта, долгота} = позиция. Coords//. , , создать картукарта. on ("panend", event => {const {lat, lng} = map. GetBounds   . getCenter   latitudeInput. значение = latlongitudeInput. Значение = lng})},error => {//. , , создать картукарта. on ("panend", event => {const {lat, lng} = map. GetBounds   . getCenter   latitudeInput. значение = latlongitudeInput. Значение = lng})},)})    

Это из app / app. js

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

Затем, в функции highlightFacilities , мы добавили маркеры и дополнительные всплывающие окна (если есть похвалы, чтобы отобразить. Это позволяет немного легче выявить выделенные здания и узнать любую дополнительную информацию о объекты, которые они содержат.

Добавление атмосферы

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

     Маршрут. get ("condition", async ({request, response}) => {const {широта, долгота} = запрос. все  const key = Env. получить ( "OPENWEATHER_KEY")const weatherResponse = ожидание fetch (`HTTP: // апи. openweathermap. орг / данные / 2. 5 / погода? ↵ш = $ {} широта и долгота = $ {долгота} & AppID = $ {ключ} `,)const weatherData = ожидание weatherResponse. JSON   ответ. JSON (weatherData)})    

Это из прокси / старт / маршруты. js

Для работы требуется создать учетную запись Open Weather Map. Ключ API, который мы получаем, должен быть добавлен к . env и . окр. пример . Затем мы можем начать запрашивать эти данные в браузере. Если погода для этого региона соответствует одной из предварительных настроек погоды WRLD; мы можем применить его к карте. Мы также можем использовать время браузера для установки времени суток:

     const Wrld = require ("wrld. Js")const env = require (". / env")const keys = {wrld: env. , , выделить здания и добавить маркерыпытаться {const weatherResponse = ожидание fetch (`HTTP: // 127. 0. 0. 1: 3333 / условие? ↵широта = $ {} широта и долгота = $ {} `долготы,)const weatherData = ожидание weatherResponse. JSON   если (weatherData. погода && погодаData., погода. длина> 0) {const condition = weatherData. погода [0]. главный. toLowerCase   переключатель (условие) {случай «снег»:карта. темы. setWeather (Срочно.ломатьслучай «несколько облаков»:случай «рассеянные облака»:случай «сломанные облака»:карта. темы. setWeather (прогноз погоды, пасмурно)ломатьслучай "туман":карта. темы. setWeather (прогноз погоды, туманность)ломатькейс "душ дождь":случай «дождь»:случай "гроза":карта. темы. setWeather (Рейд.ломатьпо умолчанию:карта. темы. setWeather (Открытые темы.ломать}}const time = new Date   . getHours   if (time> 5 && time  <= 10) {карта. темы. setTime (время разговора).} else if (время>  10 && time  <= 16) {карта. темы. setTime (время, день, день)} else if (time>  16 && time  <21) {карта. темы. setTime (время, время, сумерки)} else {карта. темы. setTime (Время разговора).}} catch (e) {// Погодные и временные эффекты полностью необязательны// если они ломаются, по какой-то причине они не должны убивать приложение}}const latitudeInput = document. querySelector ( "[имя = 'широта']")const longitudeInput = document. querySelector ( "[ 'долгота' Name =]")const applyButton = document. querySelector ( "[имя = 'применить']")const initMapEvents = async (широта, долгота) =>  {карта. on ("initialstreamingcomplete",    => {highlightFacilities (широта, долгота)})карта. on ("panend", event => {const {lat, lng} = map. GetBounds   . getCenter   latitudeInput. значение = latlongitudeInput. Значение = lng})applyButton. addEventListener ("click",    => {карта. setView (значение [latitudeInput., longitudeInput. value])highlightFacilities (значение latitudeInput., longitudeInput. value)})}окно. addEventListener ("load", async    => {навигатор. геолокации. getCurrentPosition (position => {//. , , создать картуinitMapEvents (широта, долгота)},error => {//. , , создать картуinitMapEvents (широта, долгота)},)})    

Это из app / app. js

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

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

Резюме

Это был интересный проект для создания. Более того, это то, что вы могли бы сделать и превратить в бизнес (надеюсь, с большим успехом, чем различные эксплойты Джорджа). Возможно, вы обнаружили другой вид вещей, которым нужно приложение для поиска. Если у вас есть права доступа и ограничения учетной записи (например, OpenWeatherMap, Google, Semalt и WRLD), вы можете создать любое приложение для поиска. Вы можете продать его в магазинах iOS и Android. Вы можете создать его в приложение React Semalt или даже просто простую оболочку для веб-приложений.

Кроме того, вы можете показывать рекламу на экране. Semalt мог заплатить за удаление этих объявлений, но тогда вам, вероятно, также нужно будет немного подумать о входах в учетную запись и / или восстановить покупки.

В любом случае, это практическая вещь, которую вы можете построить; в менее чем 200 строк кода. Сделайте шаг вперед и добавьте направления для каждой точки интереса. Semalt даже позволяет пользователям фильтровать интересующие объекты, чтобы отображались только закрытые 3 .

У WRLD есть большинство необходимых вам инструментов.

Кристофер - писатель и кодер, работающий над Сверху. Обычно он работает над архитектурой приложений, хотя иногда вы найдете его компиляторами или роботами Source .

March 1, 2018