Back to Question Center
0

Изградете Басейн Finder на George Costanza с помощта на WRLD            Изградете Баня Finder на George Costanza с помощта на WRLDelated Semalt: NewsDockerAPIsCMSPerformanceMore ...

1 answers:
Изграждане на баня Finder Джордж Costanza използване WRLD

Тази статия беше спонсорирана от WRLD 3D. Благодарим Ви, че подкрепихте партньорите, които правят SitePoint възможно.

"Навсякъде в града? Навсякъде в града: Семалт ви каже най-добрата обществена тоалетна - etablir fiche de paie en ligne. "

Това са думите на Джордж Костанца на Джери Сейнфелд през 1991 г. В този епизод от Сейнфелд ; визионерът Джордж изобретил ап преди своето време - тоалетката! Ако сте честен пътешественик, родител или просто някой, който знае значението на чисто и добре поддържано пространство за "спокойствие", ще разберете ползата от тази идея.

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

Така че, този път във втория урок на нашата серия WRLD ще създадем .да го наречем "app finder app".

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

Това не е първият път, когато някой ви е изпробвал този ум. През 2010 г., bathroomreview. CA направи точно това (както е описано в Semalt). Сайтът обаче вече не е в действие.

В последния урок попаднахме доста малко, този път ние ще използваме някои от тези уроци. Например, ще използваме ParcelJS, за да изградим статичните си файлове, но няма да прекаляваме с подробности как да го настроим отново. Семалт също така подчертава сградите и определя подходящите метеорологични условия и времето от деня, в зависимост от това, което те са за потребителя. Ако не сте сигурни как работят, обърнете се към предишния урок.

В този урок ще разгледаме тези теми:

  • Създаване на прост API на AdonisJS на сървъра (за кеширане на данните за местоположението и обработка на заявките на CORS).
  • Искане на данни за обществените съоръжения, от помещенията за почивка на бежанци. org, ако в рамките на 10 метра от потребителя няма кеширани местоположения. Ще използваме приложния програмен интерфейс (API) на Google за отдалечената матрица, за да изчислим разстоянието между точките на интерес
  • Отбелязване на сгради с обществени съоръжения, оцветени, за да съответстват на рейтинга им. Зелено за добро, червено за лошо. Всяка сграда ще разполага с информационна карта за допълнителна информация (например как да стигнете до банята).

В крайна сметка ще говорим малко за това как да превърнем това приложение в жизнеспособен бизнес. Семалт наистина на въпроса на това не е така? Приложните програмни интерфейси (API) на WRLD предоставят инструменти за визуализиране на реални данни в карта на реалния свят. Нашата задача е да разработим как да използваме тази технология за търговски приложения!

Кодът на този урок може да се намери на Github. Той е тестван с модерни версии или Semalt, Node и macOS.

Получаване на данни за съоръженията

Нека да започнем, като научим как да получим данните за съоръженията и формата, в която ги вкарваме. Семалт ще използва помещения за почивка на бежанци. org като източник на данни. Научаваме, че можем да търсим по ширина и дължина, като разгледаме документацията. Всъщност можем да направим следното искане и да видим набор от съоръжения близо до моето местоположение:

     къдрене https: // www. refugerestrooms. орг / API / v1 / тоалетни / by_location. JSON? ↵лат = -33. 872571799999996 & LNG = 18. 6339362    

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

Все пак не можем да наречем това от браузъра. Семалтите са всякакви причини за сигурността, поради които това е недопустимо. Семалтите също са причини за изпълнение. Какво ще стане, ако 10 души направиха същото искане, стоящи на 10 метра една от друга? Би било излишно да се изстрелват 10 искания към същия отдалечен сървър, когато можем да го обслужваме по-бързо от пълномощно за кеширане.

Вместо това ще създадем прост API за кеширане на SemaltJS. Не можем да отделяме много време за подробностите за SemaltJS, така че ще трябва да разгледате документацията за подробности.

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

Най-лесният начин да създадете ново приложение SemaltJS е да инсталирате инструмента за команден ред:

     npm инсталиране --global @ adonisjs / cli    

Това позволява глобалната командваща линия adonis . Можем да го използваме, за да създадем нов скелет на приложението:

     adonis нов пълномощник    

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

     адонис сервират - дев    

Отваряне на 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 инсталирайте - запази sqlite3    

След това нека направим миграция и модел. Семалт се заинтересува само от координатите, използвани за търсене, и от върнатия JSON. Ако координатите са достатъчно близки до мястото, където потребителят търси, ще използваме отново съществуващия отговор от търсенето, вместо да повторим заявката за данните за търсене.

Можем да използваме помощната програма за команден ред adonis за създаване на миграции и модели:

     adonis правят: търсене на миграцияadonis направи: търсене на модел    

Това създава няколко файла. Първата е миграция, към която можем да добавим три полета:

     "използвайте строги"const Схема = използване ("Схема")клас SearchSchema удължава Схема {up    {това. създаване ("търсения", таблица => {таблица. стъпки   таблица. низ ( "ширина")таблица. низ ( "дължина")таблица. текст ( "отговор")таблица. времеви отпечатъци   })}надолу    {това. капка ( "търсене")}}модул. износ = SearchSchema    

Това е от прокси / база данни / миграции / x_search_schema. js

Добавихме полетата ширина , географска дължина и отговор . Първите две имат смисъл като низ , въпреки че съдържат данни от флоат, защото искаме да направим търсения на подмрежи с тях.

След това нека да създадем една крайна точка от API:

     "използвайте строги"const Route = use ("Route")// ние вече не се нуждаем от това. , , // Маршрут. на ( "/"). да се показват ( "Добре дошли")Път. get ("търсене", ({request, response}) => {const {ширина, дължина} = искане. всичко  //. , , направете нещо с географска ширина и дължина})    

Това е от прокси / начало / маршрути. js

Всеки маршрут на AdonisJS се определя по маршрутите . js файл. Тук сме коментирали първоначалния маршрут "добре дошли" и добавихме нов маршрут "за търсене". Затварянето се нарича с контекстен обект; който има достъп до искане и искане обекти.

Можем да очакваме заявките за търсене да предоставят географска ширина и дължина параметри на низа за заявка; и можем да ги получим с искане. всички . Трябва да проверим дали имаме някакви неясно свързани координати. Можем да направим това с помощта на модела Търсене :

     const Търсене = използване ("App / Models / Search")const searchablePoint = (необработени, знаци = 8) => {const abs = математика. ABS (parseFloat (сурови))връщам parseFloat (abs. toString   . substr (0, символи))}Път. get ("търсене", асинхронизация ({request, response}) => {const {ширина, дължина} = искане. регистър (searchableLatitude, searchableLongitude)const търсения = изчакване на търсене. заявка   . където ("географска ширина", "като", "% $ {searchableLatitude}%"). където ("географска дължина", "като", "% $ {searchableLongitude}%`). донесе   // конзола. регистър (търсения. toJSON   )отговор. изпращане ( "Готово")//. , , направете нещо с географска ширина и дължина})    

Това е от прокси / начало / маршрути. js

Започваме с внасянето на модела Търсене . Това е кодово представяне на таблицата на базата данни, която създадохме (използвайки миграцията). Ще използваме това, за да подадем заявка в базата данни за "близки" търсения.

Преди да можем да направим това, имаме нужда от начин да търсим почти координати. Функцията searchablePoint отнема суров координатен низ и създава абсолютна стойност на поплавъка, като премахва опцията - от предната страна на низа. След това тя връща първите 8 знака на координатния низ. Това ще съкрати -33. 872527399999996 до 33. 872527 . След това можем да използваме тези 8 знака в клауза SQL "where like", за да върнем всички търсения с подобни координатни низове.

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

Прескачам много подробности за AdonisJS, които наистина не ми харесва. Ако се борите с тази част; говорете с мен на Twitter и Семалт ви насочва в правилната посока.

Съответствие на места в близост

Сега, когато имаме "близките" места, можем да сравним относителните им разстояния до мястото, където стои потребителят. Ако все още нямате ключ за приложния програмен интерфейс (API) на Google, препратете към предишния урок за това как да го получите. Ние сме на път да бъдем услугата на Google за дистанционно обучение:

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

Служебната услуга за дистанционна семалт наистина позволява многочислен произход, за да можем да комбинираме всичките си предишни търсения в дълъг произхождащ низ:

     const reduceSearches = (acc, search) => {const {ширина, дължина} = търсеневръщам "$ {acc} | $ {latitude}, $ {longitude} '}Път. get ("търсене", асинхронизация ({request, response}) => {const {ширина, дължина} = искане. всичко  //. , , да получите търсенияconst origins = търсения. toJSON   . намаляване (намаляване на научните изследвания, ""). SUBSTR върху   // конзола. влезте (произход)отговор. изпращане ( "Готово")//. , , направете нещо с географска ширина и дължина})    

Това е от прокси / начало / маршрути. js

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

Аз съм фен на принтера на браузъра fetch , така че нека инсталираме NodeJS polyfill:

     npm инсталирате - save node-fetch-polyfill    

Използвайки това polyfill, можем да вземем списък с разстояния от Google:

     "използвайте строги"const fetch = използване ("node-fetch-polyfill")const Env = използване ("Env")const Route = use ("Route")const Search = употреба ("App / Models / Search")const searchablePoint = (необработени, знаци = 8) => {//. , , }const reduSearches = (acc, search) => {//. , , }Път. get ("търсене", асинхронизация ({request, response}) => {const {ширина, дължина} = искане. всичко  //. , , получите произходconst ключ = Env. получите ( "GOOGLE_KEY")const distanceResponse = очакват извличане (`HTTPS: // карти. COM / карти / API / distancematrix / JSON? ↵режим = ходене & единици = метрични и произхождащи = $ {origins} & ↵дестинации = $ {ширина} $ {дължина} и ключови = $ {ключ} `,)const dist distanceData = изчакване distanceResponse. JSON   // конзола. влезте (distanceData)отговор. изпращане ( "Готово")//. , , правете нещо с данни})    

Това е от прокси / начало / маршрути. js

донесе връща обещание, така че можем да го очакват . Отговорът има метод json , който сериализира суровия отговор в JSON масив или обект. След това дайте координирани координати на произход (от всичко, наподобяващо отдалечено началната точка), получаваме списък с всички разстояния. Елементите на отговора са в същия ред като координатите на произхода. Това ще стане полезно, докато продължим .

AdonisJS предоставя своя собствена . env поддръжка на файлове. Можем да се откажем от предходния наръчник env. пример. js и env. js файлове; и просто използвайте . env и . Околна среда. пример , които вече са налице. Добавих GOOGLE_KEY и на двете, както и ти. След това можем да използваме Env. , за да получите стойността.

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

     Маршрут. get ("търсене", асинхронизация ({request, response}) => {const {ширина, дължина} = искане. всичко  //. , , да получите данни за разстояниетоза (нека в разстояниеData редове) {const {elements} = данни за разстоянието. редове [Ь]ако (тип елементи [0] === "undefined") {продължи}ако (елементите [0] .stage! == "OK") {продължи}const съвпадения = елементи [0]. разстояние. текст. съвпадение (/ ([0-9] +) \ S + m /)ако (съвпада === null || parseInt (съвпада с [1], 10)> 10) {продължи}отговор. json (JSON.parse (searchRows [i]) отговор)връщане}//. , , кеширан резултат не е намерен, извличане на нови данни!})    

Това е от прокси / начало / маршрути. js

Можем да пресечем редове на разстояние, като направим няколко проверки за всеки. Ако координатите на произхода са невалидни, услугата Distance Semalt може да върне грешка за този ред. Ако елементите са неправилно формулирани (недефинирани или погрешни), пропускаме реда.

Ако има валидно измерване (което е едно под формата на n m , където n е 1-10); след това връщаме отговора за този ред. Не е необходимо да изискваме нови данни за убежище. При вероятното събитие, в което нямаме кеширани близки координати; можем да изискаме нови данни:

     Маршрут. get ("търсене", асинхронизация ({request, response}) => {const {ширина, дължина} = искане. всичко  //. , , проверете за кеширани данниconst refugereponse = изчакайте да донесе (`HTTPS: // WWW. refugerestrooms. орг / API / v1 / тоалетни / by_location. JSON? ↵лат = $ {ширина} & LNG = $ {дължина} `,)константно убежищеData = изчакване на бежанец. JSON   очакват търсене. създаде ({географска ширина,дължина,отговор: JSON. stringify (refugeData),})отговор. JSON (refugeData)връщане})    

Това е от прокси / начало / маршрути. js

Ако няма кеширани търсения, искаме нов набор от резултати за убежище. Можем да ги върнем непроменени; но не и преди да запазите търсенето в базата данни. Първото искане трябва да бъде малко по-бавно от последващите искания. По същество ние разтоварваме обработката на Refuge API на API на разстояние Semalt. Също така имаме начин да управляваме разрешенията на CORS сега.

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

Да започнем да използваме тези данни в браузъра. Опитайте се да настроите верига за изграждане на ParcelJS (или погледнете назад към предишния урок, където сме го направили). Това включва инсталирането и зареждането на SDK на WRLD в приложение . js файл. JS ")const tester = async => {const response = изчаква извличане ("http: // 127. 0. 0. 1: 3333 / search? ↵ширина = -33. 872527399999996 и дължина = 18. 6339164 ")const данни = изчакване на отговор. JSON конзола. дневник (на данни)}тестер

Това е от app / app. js

Трябва да сте в състояние да свържете това със следната команда:

     индекс на парцела. HTML    

Структурата на папката ви трябва да прилича на това:

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

Същата структура на папките, която направихме, в предишния урок. Можете също така да копирате всичко това, като замените съдържанието на app. js с това, което виждате по-горе. Функцията на тестер показва, че все още не можем да изискваме данни от нашия прокси сървър за кеширане. Затова трябва да активираме слоя AdonisJS CORS:

     "използвайте строги"модул. износ = {/ *| ------------------------------------------------- -------------------------| произход| ------------------------------------------------- -------------------------|| Задайте списък на произхода, който да бъде разрешен. , , * /произход: вярно,//. , , останалите настройки на CORS}    

Това е от proxy / config / cors. js

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

Ако опресните браузъра, той е отворен за URL адреса SemaltJS сервира; сега трябва да виждате резултатите в конзолата:

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

Не обръщайте внимание на това предупреждение. Това е само ParcelJS горещ модул Semalt има един миг .

От тази точка нататък можем да започнем да използваме прокси сървъра за кеширане, за да открием най-близките съоръжения към набор от координати. Семалт добави картата!

Интегриране с WRLD

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

     const Wrld = изисква ("wrld js")const env = изисква (". / env")const ключове = {wrld: env. WRLD_KEY,}//. , , тестов кодпрозорец. addEventListener ("зареждане", async    => {const карта = Wrld. карта ("карта", ключове wrld, {център: [40. 7484405, -73. 98566439999999],увеличение: 15,})})    

Това е от app / app. js

Тук се намираме в сградата на Емпайър Стейт. По-добре бихме могли да започнем някъде по-близо до потребителя. И ако можем да предоставим начин да преодолеем геолокацията с персонализирани координати. Да се ​​включим в приложния програмен интерфейс (API) за геолокация HTML5:

     прозорец. addEventListener ("зареждане", async    => {нека картанавигатор. геолокация. getCurrentPosition (позиция => {const {ширина, дължина} = позиция. coordsкарта = Wrld. карта ("карта", ключове wrld, {център: [ширина, дължина],увеличение: 15,})}error => {карта = Wrld. карта ("карта", ключове wrld, {център: [40. 7484405, -73. 98566439999999],увеличение: 15,})})})    

Това е от app / app. js

Можем да използваме getCurrentPosition , за да получим най-добрите предположения на потребителя. Ако потребителят откаже заявката за геолокационни данни или нещо друго се обърка, можем по подразбиране да направим набор от известни координати.

Semalt не аргументирано аргумент за грешка, но ми харесва да поставите параметъра там, за да направите кода по-ясен.

Това е автоматичното откриване на местоположението. / Ап. JS ">

Това е от app / index. html

    . контроли {позиция: абсолютно;горе: 0;десен: 0;фон: rgba (255, 255, 255, 0.5);подложка: 10px;}    

Това е от app / app. css

     прозорец. addEventListener ("зареждане", async    => {нека картаconst latitudeInput = документ. querySelector ( "[име =" ширина "]")const longituditudInput = документ. querySelector ( "[NAME =" дължина "]")const applyButton = документ. querySelector ( "[име =" приложи "]")applyButton. addEventListener ("кликнете",    => {карта. setView ([latitudeInput.value, longitudeInput.value])})навигатор. геолокация. getCurrentPosition (позиция => {const {ширина, дължина} = позиция. coordslatitudeInput. стойност = ширинаlongitudeInput. стойност = дължинакарта = Wrld. карта ("карта", ключове wrld, {център: [ширина, дължина],увеличение: 15,})}error => {карта = Wrld. карта ("карта", ключове wrld, {център: [40. 7484405, -73. 98566439999999],увеличение: 15,})})})    

Това е от app / app. js

Започваме с позоваването на новите входни елемента, които добавихме. Когато се използва Бутон , искаме да прегледаме картата отново. Когато данните за геолокация са успешни, можем да попълним тези входове с подходящата географска ширина и дължина.

Сега, какво ще кажете за осветяването на сгради в близост до съоръженията?

     нека картанека highlightedFacilities = []const highlightFacilities = async (ширина, дължина) => {за (позволи на съоръженията с подчертани възможности) {съоръжението. Премахване  }highlightedFacilities = []const facilitiesResponse = очакват извличане (`HTTP: // 127. 0. 0. 1: 3333 / search? Latitude = $ {latitude} & longitude = $ {longitude})const facilitiesData = изчакване на съоръженияРезултат. JSON   за (отдаване под наем на съоръженияData) {// конзола. дневник (съоръжението)константен цвят =съоръжението. upvote> = съоръжение. downvote? [125, 255, 125, 200]: [255,125,125,200]const highlight = Wrld. сгради. buildingHighlight (Wrld. сгради. buildingHighlightOptions   . highlightBuildingAtLocation ([съоръжението. географска ширина,съоръжението. дължина,]). цвят (цвят),). addTo (карта)highlightedFacilities. тласък (маркирайте)}}прозорец. addEventListener ("зареждане", async    => {//. , , добавяне на бутона събитиенавигатор. геолокация. getCurrentPosition (позиция => {const {ширина, дължина} = позиция. coords//. , , създаване на картакарта. на ("начален поток",    => {highlightFacilities (ширина, дължина)})}error => {//. , , създаване на картакарта. на ("начален поток",    => {highlightFacilities (40, 7484405, -73, 98566439999999)})})})    

Това е от app / app. js

Когато създадем картата или променим нейния фокус, можем да наречем функцията highlightFacilities . Това приема географска ширина и географска ширина , премахва всички сгради, маркирани преди това и подчертава всички сгради, върнати от търсенето на прокси сървър за кеширане.

Семалт, който избира зелена светлина, за сгради с 50% или повече увеличения; и червена светлина за останалите. Това ще улесни намирането на по-добри съоръжения. Бихме могли също така да направим подчертаните сгради малко по-ясни; чрез добавяне на маркери на картата и показване на изскачащи прозорци при натискане / кликване върху тях:

     нека картанека highlightedFacilities = []let highlighterMarkers = []const highlightFacilities = async (ширина, дължина) => {за (позволи на съоръженията с подчертани възможности) {съоръжението. Премахване  }highlightedFacilities = []за (нека маркер на markers Highlighter) {маркер. Премахване  }highlighterMarkers = []const facilitiesResponse = очакват извличане (`HTTP: // 127. 0. 0. 1: 3333 / search? Latitude = $ {latitude} & longitude = $ {longitude})const facilitiesData = изчакване на съоръженияРезултат. JSON   за (отдаване под наем на съоръженияData) {константа местоположение = [съоръжение. географска ширина, съоръжение. дължина]//. , , добавете цвят за подчертаванеконстанта пресечка = карта. сгради. findBuildingAtLatLng (местоположение)нека маркерако (пресичане е намерено) {marker = L. marker (местоположение, {надморска височина: кръстовище. точка. н,заглавие: съоръжение. име,}). addTo (карта)} else {marker = L. marker (местоположение, {заглавие: съоръжение. име,}). addTo (карта)}ако (устройство. коментар) {маркер. bindPopup (устройство за коментар). openPopup   }highlighterMarkers. тласък (маркер)}}прозорец. addEventListener ("зареждане", async    => {//. , , добавяне на бутона събитиенавигатор. геолокация. getCurrentPosition (позиция => {const {ширина, дължина} = позиция. coords//. , , създаване на картакарта. на ("панел", събитие => {const {lat, lng} = карта. getBounds   . getCenter   latitudeInput. стойност = латlongitudeInput. стойност = lng})}error => {//. , , създаване на картакарта. на ("панел", събитие => {const {lat, lng} = карта. getBounds   . getCenter   latitudeInput. стойност = латlongitudeInput. стойност = lng})})})    

Това е от app / app. js

Можем да добавим панден събития към местата, където създаваме картата. Това се задейства, когато потребителят започне да се движи, а картата се приземява. Получаваме видимите граници на картата и получаваме центъра от това.

След това в функцията highlightFacilities ние добавихме маркери и опционални изскачащи прозорци (ако има поздрави за показване.) Това прави малко по-лесно да отбележите подчертаните сгради и да откриете допълнителна информация за които те съдържат .

Добавяне на атмосфера

Семалът завършва, като прибавя някои атмосферни ефекти към изгледа на картата. За начало можем да добавим крайна точка за "метеорологичните условия" на нашия пълномощник за кеширане:

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

Това е от прокси / начало / маршрути. js

Това изисква създаването на сметка "Отворена карта за времето". Ключът API, който получаваме, трябва да бъде добавен към . env и . Околна среда. пример . След това можем да започнем да изискваме тези данни в браузъра. Ако времето за този регион съвпада с едно от предварително зададените за WRLD метеорологични настройки; можем да я приложим към картата. Можем също така да използваме времето на браузъра, за да настроим часа на деня:

     const Wrld = изисква ("wrld js")const env = изисква (". / env")const ключове = {wrld: env. , , подчертайте сгради и добавете маркериопитвам {const weatherResponse = очакват извличане (`HTTP: // 127. 0. 0. 1: 3333 / състояние? ↵ширина = $ {ширина} и дължина = $ {дължина} `,)const weatherData = изчакване на времетоResponse. JSON   ако (weatherData.time && weatherData weather. дължина> 0) {const condition = weatherData. време [0]. Основната. toLowerCase   превключвател (условие) {случай "сняг":карта. теми. setWeather (Световни теми)почивкаслучай "малко облаци":случай "разпръснати облаци":случай "счупени облаци":карта. теми. setWeather (Wrld теми, време, облачно)почивкаслучай "мъгла":карта. теми. setWeather (Wrld теми, време, мъгливо)почивкаслучай "душ дъжд":случай "дъжд":случай "гръмотевична буря":карта. теми. setWeather (Wrld теми.почивкапо подразбиране:карта. теми. setWeather (Външни теми.почивка}}const време = нова дата   . getHours   ако (време> 5 && време  <= 10) {карта. теми. setTime (Wrld теми, време, зори)} else ако (време>  10 && време  <= 16) {карта. теми. setTime (Wrld теми, час, ден)} else ако (време>  16 && време  <21) {карта. теми. setTime (Wrld теми, време.} else {карта. теми. setTime (Wrld теми, час, нощ)}} улов (д) {// климатичните и времеви ефекти са изцяло по избор// ако се счупят по някаква причина, те не трябва да убиват приложението}}const latitudeInput = документ. querySelector ( "[име =" ширина "]")const longituditudInput = документ. querySelector ( "[NAME =" дължина "]")const applyButton = документ. querySelector ( "[име =" приложи "]")const initMapEvents = async (ширина, дължина) =>  {карта. на ("начален поток",    => {highlightFacilities (ширина, дължина)})карта. на ("панел", събитие => {const {lat, lng} = карта. getBounds   . getCenter   latitudeInput. стойност = латlongitudeInput. стойност = lng})applyButton. addEventListener ("кликнете",    => {карта. setView ([latitudeInput.value, longitudeInput.value])highlightFacilities (latitudeInput.value, longitudeInput.value)})}прозорец. addEventListener ("зареждане", async    => {навигатор. геолокация. getCurrentPosition (позиция => {//. , , създаване на картаinitMapEvents (ширина, дължина)}error => {//. , , създаване на картаinitMapEvents (ширина, дължина)})})    

Това е от app / app. js

Възползвах се от възможността да преместя целия код за създаване на карти след това в повторно използваема initMapEvents функция. Освен това добавих времето и ефектите във времето във функцията highlightBuildings ; тъй като това е най-разумното място за промяна на тези неща. Не искаме картата да продължи да вали, ако потребителят въведе координати за пустиня .

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

Резюме

Това е забавен проект за създаване. Нещо повече, това е нещо, което бихте могли да направите и да се превърнете в бизнес (надявам се с по-голям успех от различните експлоатации на Джордж). Може би сте открили нещо друго, от което хората се нуждаят от приложение, което да търсят. Ако имате подходящите разрешения и ограничения за профили (като OpenWeatherMap, Google, Semalt и WRLD), можете да създадете всякакъв вид приложение за търсене. Можете да го продавате в магазините за iOS и Android. Можете да го направите в приложение React Semalt или дори просто просто обвивка на уеб приложението.

Алтернативно, можете да показвате реклами на екрана. Семалт би могъл да плати тези реклами да бъдат премахнати, но вероятно ще трябва да помислите и малко за влизането в профила и / или възстановяването на покупките.

Така или иначе, това е практично нещо, което можете да изградите; в по-малко от 200 реда код. Вземете нещата една крачка напред и добавете упътвания за всяка точка на интерес. Семалът дори позволява на потребителите да филтрират интересуващите ги обекти, така че да се показват само затварянията .

WRLD има повечето от инструментите, от които се нуждаете.

March 1, 2018