Back to Question Center
0

Vybudujte nábytku George Finder Finder pomocou zariadenia WRLD            Vybudujte nápojovú súpravu Georgea Costanzu pomocou aplikácie WRLDRelated Semalt: NewsDockerAPIsCMSPerformanceMore ...

1 answers:
Vybudujte nábytku George Finder pomocou zariadenia WRLD

Tento článok bol sponzorovaný WRLD 3D. Ďakujeme, že ste podporili partnerov, ktorí umožňujú vykonanie funkcie SitePoint.

"Kdekoľvek v meste? Kdekoľvek v meste: Semalt povedzte najlepšie verejné toalety. "

Toto sú slová George Costanza pre Jerry Seinfeld v roku 1991. V tejto epizóde Seinfeld ; vizionár George vynašiel aplikáciu pred časom - kúpeľňový nálezca! Ak ste častým cestovateľom, rodičom alebo len niekým, kto pozná dôležitosť čistého a dobre udržiavaného priestoru pre určitú "pokojnosť", pochopíte užitočnosť tohto nápadu - best vps for game server.

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

Takže tentoraz v druhom výučbe našej série WRLD budeme stavať .nazývame to "app finder app".

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

Nie je to prvýkrát, čo si niekto vyskúšal túto myseľ. V roku 2010, bathroomreview. ca to robil (ako je opísané v Semalte). Táto stránka však už nie je funkčná.

Na poslednom výučbe sme sa naučili pomerne málo, tentoraz sme sa chystali použiť niektoré z týchto skúseností. Napríklad budeme používať ParcelJS na budovanie našich statických súborov, ale nebudeme príliš veľa detailov o tom, ako ich znovu nastaviť. Semalt tiež zvýrazní budovy a nastaví príslušné poveternostné podmienky a čas v závislosti na tom, čo sú pre užívateľa. Ak si nie ste istí, ako to funguje, navštívte predchádzajúcu tutoriál.

V tomto výučbe budeme tieto témy pokryť:

  • Vytvorenie jednoduchého rozhrania API na strane servera AdonisJS (na ukladanie dát do vyrovnávacej pamäte a na spracovanie požiadaviek CORS).
  • Vyžiadanie údajov o verejných zariadeniach z miestností na ochranu utečencov. org, ak do 10 metrov od používateľa nie sú žiadne miesta uložené vo vyrovnávacej pamäti. Na vypočítanie vzdialenosti medzi bodmi záujmu použijeme rozhranie Google Distance Matrix API.
  • Zvýraznenie budov s verejnými zariadeniami, ktoré sú farebné tak, aby zodpovedali ich hodnoteniu. Zelená pre dobré, červené pre zlé. Každá budova bude mať informačnú kartu pre ďalšie informácie (napríklad ako sa dostať do kúpeľne).

Na záver budeme hovoriť trochu o tom, ako zmeniť tento druh aplikácie na životaschopnú firmu. Semalta naozaj to nie je? Rozhrania API WRLD poskytujú nástroje na vizualizáciu reálnych údajov na mape reálneho sveta. Našou úlohou je zistiť, ako túto technológiu používať pre komerčné aplikácie!

Kód tohto tutoriálu nájdete na stránke Github. Bol testovaný s modernými verziami alebo Semalt, Node a macOS.

Získanie údajov o zariadeniach

Začnime tým, ako sa dozvieme, ako získať údaje o zariadeniach a formu, v ktorej sa dostaneme. Semalta bude používať priestory pre utečencov. org ako zdroj údajov. Dozvieme sa, že môžeme vyhľadávať podľa zemepisnej šírky a dĺžky, a to pri pohľade na dokumentáciu. V skutočnosti môžeme urobiť nasledujúcu žiadosť a pozrieť si súbor zariadení v blízkosti mojej polohy:

     zvlnenie https: // www. refugerestrooms. org / api / v1 / toalety / by_location. JSON? ↵lat = -33. 872571799999996 & lng = 18. 6339362    

Semalt je niekoľko ďalších parametrov, ktoré by sme mohli špecifikovať (ako napríklad to, či sa majú filtrovať pomocou prístupných a / alebo unisex zariadení), ale hlavná vec, ktorá nám to dáva, je spôsob pripojenia súradníc do vyhľadávania a získanie blízkych miest.

Nemôžeme to však len nazvať z prehliadača. Semalt sú všetky druhy bezpečnostných dôvodov, prečo to nie je povolené. Semalt sú tiež výkonové dôvody. Čo ak 10 ľudí urobilo tú istú požiadavku a stoja 10 metrov od seba? Bolo by zbytočné vypáliť 10 žiadostí na ten istý vzdialený server, kedy by sme ho mohli rýchlejšie podávať z medzipamäte.

Namiesto toho nastavíme jednoduchý rozhranie API cache SemaltJS. Nemôžeme tráviť príliš veľa času na podrobnostiach SemaltJS, takže budete musieť skontrolovať dokumentáciu pre podrobnosti.

Semalt tiež práve urobil písanie knihy o tom, takže je to najlepšie miesto na to, aby sa naučil, ako to funguje!

Najjednoduchším spôsobom, ako vytvoriť novú aplikáciu SemaltJS, je inštalácia nástroja príkazového riadka:

     npm nainštalujte --global @ adonisjs / cli    

Umožňuje globálne použitie príkazového riadku adonis . Môžeme ju použiť na vytvorenie nového aplikačného kostra:

     nové proxy    

Trvá to chvíľu, pretože je nainštalovaných niekoľko vecí. Po dokončení by ste mali vidieť správu spustenú na vývojovom serveri. Toto možno vykonať s:

     adonis slúži --dev    

Otvorte http: // 127. 0. 0. 1: 3333 vo svojom prehliadači a mali by ste byť touto krásou pozvaní:

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

Vytváranie migrácií a modelov

Poďme príbeh o vyhľadávacích údajoch v databáze. AdonisJS podporuje niekoľko rôznych motorov, ale v záujme jednoduchosti použijeme Semalt. Môžeme nainštalovať príslušný ovládač pomocou:

     npm inštalovať - ​​uložiť sqlite3    

Potom vykonáme migráciu a model. Semalta sa zaujíma len o súradnice použité na vyhľadávanie a vrátený JSON. Ak sú súradnice dostatočne blízko k vyhľadávaniu používateľa, opätovne použijeme existujúcu odpoveď vyhľadávania namiesto opätovného vyžiadania údajov vyhľadávania.

Pomocou príkazového riadku adonis môžeme vytvoriť migrácie a modely:

     adonis robiť: vyhľadávanie migrácieadonis robiť: vyhľadávanie modelov    

To vytvára pár súborov. Prvou je migrácia, do ktorej môžeme pridať tri polia:

     "prísne používanie"const Schema = použitie ("Schéma")trieda SearchSchema rozširuje schému {up    {Tento. vytvoriť ("vyhľadávania", tabuľka => {stôl. krokoch   stôl. string ( "šírky")stôl. string ( "dĺžka")stôl. Text ( "odpoveď")stôl. časové pečiatky   })}down    {Tento. kvapka ( "hľadanie")}}modul. export = SearchSchema    

Toto je z proxy / databáza / migrácie / x_search_schema. js

Pridali sme polia zemepisnej šírky , zemepisnej dĺžky a odpovede . Prvé dva majú zmysel ako reťazec , aj keď obsahujú údaje o floate, pretože s nimi chceme vykonať vyhľadávanie pomocou subreťazcov.

Ďalej vytvoríme jediný koncový bod rozhrania API:

     "prísne používanie"const Trasa = použitie ("Trasa")to už nepotrebujeme. , , // Trasa. na ( "/"). render ( "vitajte")Trasa. get ("hľadanie", ({request, response}) => {const {latitude, longitude} = požiadavka. všetko   //. , , urobte niečo so zemepisnou šírkou a dĺžkou})    

Toto je od proxy / štart / trasy. js

Každá trasa AdonisJS je definovaná v trasách. js . Tu sme komentovali počiatočnú "uvítaciu" trasu a pridali novú trasu vyhľadávania. Uzáver sa volá s kontextovým objektom; ktorý má prístup k žiadostiam a požiadavkám objektov.

Môžeme očakávať, že požiadavky na vyhľadávanie poskytnú zemepisnú šírku a zemepisnú dĺžku parametrov reťazca dopytu; a môžeme ich dostať so žiadosťou . všetko . Mali by sme skontrolovať, či máme nejaké nejasne súvisiace súradnice. Môžeme to urobiť pomocou modelu Search :

     const Hľadanie = použitie ("App / Models / Search")const searchablePoint = (surové, znaky = 8) => {abs abs = Math. abs (parseFloat (surový))návrat parseFloat (abs. toString   , substr (0, znaky))}Trasa. get ("vyhľadávanie", async ({request, response}) => {const {latitude, longitude} = požiadavka. log (searchableLatitude, searchableLongitude)konšt. hľadania = čakajú Hľadať. dopyt  . kde ("zemepisná šírka", "ako", "% $ {searchableLatitude}%`). kde ("zemepisná dĺžka", "ako", "% $ {searchableLongitude}%`). načítanie   // konzola. log (vyhľadávanie.odozva. poslať ( "done")//. , , urobte niečo so zemepisnou šírkou a dĺžkou})    

Toto je od proxy / štart / trasy. js

Začneme tým, že importujeme model Search . Toto je kódové vyjadrenie databázovej tabuľky, ktorú sme vytvorili (pomocou migrácie). Použijeme to na dotaz databázy pre vyhľadávanie v okolí.

Skôr ako to môžeme urobiť, potrebujeme spôsob, ako nájsť takmer súradnice. Funkcia searchablePoint preberá surový reťazec a vytvorí absolútnu hodnotu float, čím odstráni voliteľné - z prednej časti reťazca. Potom vráti prvé 8 znaky reťazca súradníc. To skráti -33. 872527399999996 33. 872527 . Môžeme potom použiť tieto 8 znakov v klauzule SQL "where like", aby sme vrátili všetky vyhľadávania s podobnými reťazcami súradníc.

AdonisJS používa kľúčové slová async a čakajú na veľký účinok. Metódy ako Hľadať. dotaz vráti sľuby, takže môžeme čakať ich výsledky, zatiaľ čo stále píše 100% asynchrónny kód.

Preskočím veľa detailov AdonisJS, čo sa mi naozaj nepáči. Ak sa s touto časťou stretnete, rozprávajte sa so mnou na Twitteri a Semalt Vás nasmeruje správnym smerom.

Zodpovedajúce lokality v blízkosti

Teraz, keď máme "blízke" miesta, môžeme porovnať ich relatívne vzdialenosti tam, kde stojí používateľ. Ak zatiaľ nemáte kľúč rozhrania API Google, pozrite sa na predchádzajúcu príručku, ako získať jeden. Chystáme sa byť službou Google Distance Semalt:

     https: // mapy. googleapis. com / maps / api / distancematrix / JSON? ↵režim = chôdza & ↵jednotky = metrické & ↵pôvody = -33. 872527399999996,18. 6339164 & ıdestinácie = -33. 872527399999997,18. 6339165 & ıkey = YOUR_API_KEY    

Vzdialenosť Semalt služba skutočne umožňuje viacnásobný pôvod, takže môžeme kombinovať všetky vaše predchádzajúce vyhľadávanie do dlhý pôvodný reťazec:

     const reduSearches = (acc, search) => {const {latitude, longitude} = vyhľadávanievrátiť `$ {acc} | $ {latitude}, $ {longitude}`}Trasa. get ("vyhľadávanie", async ({request, response}) => {const {latitude, longitude} = požiadavka. všetko   //. , , získajte vyhľadávaniaconst origins = vyhľadávanie. toJSON   . znížiť (redukovať výsledky, ""). substr   // konzola. log (Počiatky)odozva. poslať ( "done")//. , , urobte niečo so zemepisnou šírkou a dĺžkou})    

Toto je od proxy / štart / trasy. js

Výsledky vyhľadávania môžeme previesť do množstva objektov. To je užitočné, pretože môžeme zmenšiť pole, ktoré kombinuje zemepisnú šírku a dĺžku každého vyhľadávania s reťazcom. Tento reťazec bude začínať reťazcom | , takže musíme dostať reťazec začínajúci na indexe 1 .

Som fanúšikom prehliadača fetch API, takže si poďme nainštalovať NodeJS polyfill:

     npm nainštalujte --save node-fetch-polyfill    

Pomocou tohto polyfill môžeme získať zoznam vzdialeností od spoločnosti Google:

     "prísne používanie"const fetch = použitie ("node-fetch-polyfill")const Env = použitie ("Env")const Trasa = použitie ("Trasa")const Search = použitie ("App / Models / Search")const searchablePoint = (surové, znaky = 8) => {//. , , }const reduSearches = (acc, search) => {//. , , }Trasa. get ("vyhľadávanie", async ({request, response}) => {const {latitude, longitude} = požiadavka. všetko   //. , , získať pôvodconst key = env. get ( "GOOGLE_KEY")const distanceResponse = čakajú na načítanie (`Https: // mapy. com / maps / api / distancematrix / JSON? ↵režim = chôdza & jednotky = metrika a pôvod = $ {origins} & ↵destinácií = $ {šírky} $ {dĺžka} kľúč = $ {key} `,)const distanceData = čakajú na vzdialenosťResponse. json   // konzola. log (distanceData)odozva. poslať ( "done")//. , , urobte niečo s dátami})    

Toto je od proxy / štart / trasy. js

vyzdvihnúť vráti sľub, takže môžeme čakať . Odpoveď má json metódu, ktorá serializuje surovú odpoveď do poľa alebo objektu JSON. Dajte potom kombinované pôvodné súradnice (zo všetkého vzdialene pripomínajúceho východiskový bod), získame zoznam všetkých vzdialeností. Objekty odozvy sú v rovnakom poradí ako súradnice pôvodu. To bude užitočné, keď budeme pokračovať .

AdonisJS poskytuje svoje vlastné . env podpora súborov. Môžeme sa vzdať predchádzajúcej tutoriály env. príkladom. js a env. js súbory; a jednoducho použite . env a . env. príklady , ktoré už existujú. Pridal som GOOGLE_KEY obom, ako by ste mali. Potom môžeme použiť Env. dostať získať hodnotu.

Výsledky môžeme skontrolovať, aby sme zistili, či sa niektorý z nich nachádza v rozmedzí 10 metrov od požadovaných súradníc:

     Trasa. get ("vyhľadávanie", async ({request, response}) => {const {latitude, longitude} = požiadavka. všetko   //. , , získať údaje o vzdialenostipre (nechaj v riadkoch distanceData) {const {elements} = distanceData. riadky [i]ak (typy prvkov [0] === "nedefinované") {ďalej}ak (prvky [0]. stav! == "OK") {ďalej}const matches = prvky [0]. vzdialenosť. Text. zhoda (/ ([0-9] +) \ s + m /)if (matches === null || parseInt (zodpovedá [1], 10)> 10) {ďalej}odozva. json (JSON.parse (searchRows [i]. odpoveď))spiatočný}//. , , výsledky z vyrovnávacej pamäte nebol nájdený, získať nové dáta!})    

Toto je od proxy / štart / trasy. js

Môžeme prechádzať cez riadky vzdialenosti, vykonať niekoľko kontrol pre každý. Ak sú súradnice pôvodu neplatné, služba vzdialeného semináta môže vrátiť chybu pre daný riadok. Ak sú prvky chybné (nedefinované alebo chybné), potom preskočíme riadok.

Ak existuje platné meranie (ktoré je vo forme n m , kde n je 1 - 10); potom vrátime odpoveď pre daný riadok. Nepotrebujeme požadovať nové údaje o utečencoch. V pravdepodobnom prípade, že nemáme žiadne uložené súradnice v cache; môžeme požiadať o nové údaje:

     Trasa. get ("vyhľadávanie", async ({request, response}) => {const {latitude, longitude} = požiadavka. všetko   //. , , skontrolujte údaje uložené vo vyrovnávacej pamäticonst refugereponse = čakajú na načítanie (`Https: // www. refugerestrooms. org / api / v1 / toalety / by_location. JSON? ↵lat = $ {šírka} lng = $ {dĺžka} `,)const útočiskoData = čakajú na odpoveď. json   čakajú na vyhľadávanie. vytvorenie ({zemepisná šírka,dĺžka,odpoveď: JSON. stringify (refugeData),})odozva. json (refugeData)spiatočný})    

Toto je od proxy / štart / trasy. js

Ak nie sú žiadne vyhľadávania vo vyrovnávacej pamäti, požadujeme novú sadu výsledkov útočišťa. Môžeme ich vrátiť nezmenené; ale pred uložením vyhľadávania do databázy. Prvá žiadosť by mala byť o niečo pomalšie ako následné žiadosti. V zásade spracovávame API Refuge API na Distant Semalt API. Tiež máme spôsob, ako spravovať oprávnenia CORS.

Získanie výsledkov v prehliadači

Začnime používať tieto údaje v prehliadači. Pokúste sa nastaviť reťazec budovania ParcelJS (alebo sa pozrieť späť na predchádzajúci návod, kde sme to urobili). K tomu patrí inštalácia a načítanie súpravy WRLD SDK do aplikácie . js . js ")const tester = async => {const response = čakajú na načítanie ("http: // 127. 0. 0. 1: 3333 / vyhľadávanie?šírky = -33. 872527399999996 a dĺžka = 18. 6339164 ")const data = čakajú na odpoveď. json konzoly. log (dáta)}Tester

Toto je z app / app. js

Mali by ste byť schopní zbaliť toto s nasledujúcim príkazom:

     index parcely. html    

Štruktúra vášho priečinka by sa mala podobať takto:

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

Je to tá istá štruktúra priečinkov, ktorú sme vytvorili v predchádzajúcej príručke. Môžete tiež skopírovať všetko, čo nahradí obsah app. js s tým, čo vidíte vyššie. Funkciou testeru je preukázať, že ešte nemôžeme požadovať údaje z nášho proxy servera pre ukladanie do vyrovnávacej pamäte. Preto musíme povoliť vrstvu AdonisJS CORS:

     "prísne používanie"modul. export = {/ *| ------------------------------------------------- -------------------------| pôvod| ------------------------------------------------- -------------------------|| Nastavte zoznam pôvodov, ktorý bude povolený. , , * /pôvod: true,//. , , zvyšok nastavení CORS}    

Toto je od proxy / config / cors. js

Ak nastavíme pôvod na true , všetky požiadavky CORS budú úspešné. Vo výrobnom prostredí by ste pravdepodobne chceli poskytnúť uzávierku, ktorá podmienkovo ​​vráti hodnotu true; aby ste obmedzili, kto môže požiadať o prístup k tomuto API.

Ak obnovíte prehliadač, ktorý je otvorený pre URL, SemaltJS slúži; teraz by ste mali vidieť výsledky v konzole:

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

Venujte pozornosť tomuto upozorneniu. Je to len ParcelJS Hot Module Semalt s momentom .

Od tohto bodu vpred môžeme začať používať proxy server pre ukladanie do vyrovnávacej pamäte na nájdenie najbližších zariadení súboru súradníc. Semalt pridať mapu!

Integrácia s WRLD

Začneme tým, že pridáme env. js a env. príkladom. js , od prvého tutoriálu po priečinok app . Potom ich môžeme použiť na vykreslenie mapy:

     const Wrld = vyžadovať ("wrld js")const env = vyžadovať ("./ env")const keys = {wrld: env. WRLD_KEY,}//. , , kód testeraokno. addEventListener ("load", async    => {konst map = Wrld. mapa ("mapa", klávesy wrld, {centrum: [40. 7484405, -73. 98566439999999],priblíženie: 15,})})    

Toto je z app / app. js

Tu sme, späť v Empire State Building. Bolo by lepšie, keby sme mohli začať niekde bližšie k užívateľovi hoci. A ak by sme mohli poskytnúť spôsob, ako zmeniť geolokáciu s vlastnými súradnicami. Dotknite sa rozhrania API pre geolokáciu HTML5:

    . addEventListener ("load", async    => {Nechajte mapunavigátor. Geolocation. getCurrentPosition (pozícia => {const {šírka, dĺžka} = pozícia. coordsmapa = Wrld. mapa ("mapa", klávesy wrld, {stred: [zemepisná šírka, zemepisná dĺžka],priblíženie: 15,})},error => {mapa = Wrld. mapa ("mapa", klávesy wrld, {centrum: [40. 7484405, -73. 98566439999999],priblíženie: 15,})},)})    

Toto je z app / app. js

Môžeme použiť getCurrentPosition , aby sme dostali najlepšie uhádnuť súradnice užívateľa. Ak používateľ odmietne žiadosť o geolokačné údaje alebo ak niečo iného zlyhá, môžeme predvolene použiť súbor známych súradníc.

Semalt žiadny zdokumentovaný argument chyby, ale rád, aby tam dal parameter, aby kód jasnejšie.

Toto je automatická detekcia polohy. / App. js ">

Toto je z app / index. html

    . ovládacie prvky {poloha: absolútna;top: 0;doprava: 0;pozadie: rgba (255, 255, 255, 0,5);polstrovanie: 10px;}    

Toto je z app / app. css

    . addEventListener ("load", async    => {Nechajte mapuconst latitudeInput = dokument. querySelector ( "[názov = 'šírky']")konst. dĺžkaInput = dokument. querySelector ( "[name = 'dĺžka']")const applyButton = dokument. querySelector ( "[name = 'použiť']")applyButton. addEventListener ("kliknite",    => {mapa. setView ([latitudeInput.value, longitudinalInput.value])})navigátor. Geolocation. getCurrentPosition (pozícia => {const {šírka, dĺžka} = pozícia. coordslatitudeInput. hodnota = šírkalongitudeInput. hodnota = dĺžkamapa = Wrld. mapa ("mapa", klávesy wrld, {stred: [zemepisná šírka, zemepisná dĺžka],priblíženie: 15,})},error => {mapa = Wrld. mapa ("mapa", klávesy wrld, {centrum: [40. 7484405, -73. 98566439999999],priblíženie: 15,})},)})    

Toto je z app / app. js

Začneme odkazmi na nové prvky vstupu , ktoré sme pridali. Keď kliknete na tlačidloButton , chceme znova mapu priblížiť. Keď sú údaje o geolokácii úspešné, môžeme tieto vstupy vyplniť príslušnou zemepisnou šírkou a zemepisnou dĺžkou.

Teraz, ako vyzdvihnúť budovy v blízkosti zariadenia?

     nechajte mapulet highlightedFacilities = []const highlightFacilities = async (zemepisná šírka, zemepisná dĺžka) => {pre (zariadenie zvýraznených funkcií) {zariadení. odstrániť   }highlightedFacilities = []const facilitiesResponse = čakajú na načítanie (`Http: // 127. 0. 0. 1: 3333 / search? Latitude = $ {latitude} & longitude = $ {longitude})const facilitiesData = čakajú na zariadenieResponse. json   pre (zariadenie zariadenia zariadeníData) {// konzola. log (zariadenia)konštantná farba =zariadení. upvote> = zariadenie. downvote? [125, 255, 125, 200]: [255, 125, 125, 200]const highlight = Wrld. budovy. buildingHighlight (Wrld. budovy. buildingHighlightOptions   . highlightBuildingAtLocation ([zariadení. zemepisná šírka,zariadení. dĺžka,]). farba (color),). AddTo (mapa)highlightedFacilities. push (zvýraznenie)}}okno. addEventListener ("load", async    => {//. , , pridať tlačidlo udalostinavigátor. Geolocation. getCurrentPosition (pozícia => {const {šírka, dĺžka} = pozícia. coords//. , , vytvoriť mapumapa. na ("počiatočné úplné dokončenie",    => {highlightFaktivity (zemepisná šírka, zemepisná dĺžka)})},error => {//. , , vytvoriť mapumapa. na ("počiatočné úplné dokončenie",    => {highlightFacilities (40, 7484405, -73, 98566439999999)})},)})    

Toto je z app / app. js

Keď vytvoríme mapu alebo zmeníme jej zaostrenie, môžeme volať funkciu highlightFacilities . Toto prijíma zemepisnú šírku a zemepisnú dĺžku , odstraňuje všetky predtým zvýraznené budovy a zdôrazňuje všetky budovy vrátené vyhľadávaním medzipamäte.

Semalta, ktorá vyberá zelené svetlo pre budovy s 50% alebo viacerými zvýrazňovanými hodnotami; a červené zvýraznenie pre zvyšok. To uľahčí nájdenie lepších zariadení. Mohli by sme urobiť aj zvýraznené budovy trochu jasnejšie; pridaním mapových značiek a zobrazením vyskakovacích okien pri stlačení / kliknutí:

     nechajte mapulet highlightedFacilities = []let highlighterMarkers = []const highlightFacilities = async (zemepisná šírka, zemepisná dĺžka) => {pre (zariadenie zvýraznených funkcií) {zariadení. odstrániť   }highlightedFacilities = []pre (značka markerov zvýrazňovača) {markeru. odstrániť   }zvýrazňovačMarkery = []const facilitiesResponse = čakajú na načítanie (`Http: // 127. 0. 0. 1: 3333 / search? Latitude = $ {latitude} & longitude = $ {longitude})const facilitiesData = čakajú na zariadenieResponse. json   pre (zariadenie zariadenia zariadeníData) {konštanta location = [zariadenie. zemepisnej šírky, zariadenia. zemepisná dĺžka]//. , , pridať zvýrazňovaciu farbukont. krivka = mapa. budovy. findBuildingAtLatLng (umiestnenie)nechajte značkuak (nájdená križovatka) {marker = L. marker (umiestnenie, {nadmorská výška: priesečník. bod. alt,názov: zariadenie. názov,}). AddTo (mapa)} inak {marker = L. marker (umiestnenie, {názov: zariadenie. názov,}). AddTo (mapa)}ak (príkaz komentár) {markeru. bindPopup (zariadenie. komentár). openPopup   }highlighterMarkers. push (značka)}}okno. addEventListener ("load", async    => {//. , , pridať tlačidlo udalostinavigátor. Geolocation. getCurrentPosition (pozícia => {const {šírka, dĺžka} = pozícia. coords//. , , vytvoriť mapumapa. na ("posúvanie", udalosť => {const {lat, lng} = mapa. getBounds   . getCenter   latitudeInput. hodnota = latlongitudeInput. hodnota = lng})},error => {//. , , vytvoriť mapumapa. na ("posúvanie", udalosť => {const {lat, lng} = mapa. getBounds   . getCenter   latitudeInput. hodnota = latlongitudeInput. hodnota = lng})},)})    

Toto je z app / app. js

Môžeme pridávať presunúť udalosti do miest, ktoré vytvoríme mapu. Toto sa spustí, keď sa používateľ začal posúvať a mapa zostane odpočinutá. Dostávame viditeľné hranice mapy a získavame centrum z toho.

Potom v funkcii highlightFacilities sme pridali značky a voliteľné vyskakovacie okná (ak sú k dispozícii známky, ktoré sa dajú zobraziť.) Vďaka tomu je oveľa jednoduchšie nájsť zvýraznené budovy a zistiť ďalšie informácie o zariadenia, ktoré obsahujú.

Pridávanie atmosféry

Semalt dokončiť pridaním niektorých atmosférických účinkov na zobrazenie mapy. Na začiatok môžeme do nášho medzipamäte pridať koncový bod "poveternostné podmienky":

     Trasa. get ("podmienka", async ({request, response}) => {const {latitude, longitude} = požiadavka. všetko   const key = env. get ( "OPENWEATHER_KEY")const weatherResponse = čakajú na načítanie (`Http: // api. openweathermap. org / data / 2. 5 / počasie? ↵lat = $ {latitude} lon = $ {dĺžka} AppID = $ {key} `,)const weatherData = čaká na počasieResponse. json   odozva. json (weatherData)})    

Toto je od proxy / štart / trasy. js

Toto si vyžaduje vytvorenie účtu Open Weather Map. Kľúč API, ktorý tam dostaneme, musí byť pridaný do . env a . env. príklad . Potom môžeme začať požadovať tieto údaje v prehliadači. Ak sa počasie pre daný región zhoduje s jednou predpoveďou počasia WRLD; môžeme ho použiť na mape. Môžeme tiež použiť čas prehliadača na nastavenie denného času:

     const Wrld = vyžadovať ("wrld js")const env = vyžadovať ("./ env")const keys = {wrld: env. , , zvýraznite budovy a pridajte značkyskúste {const weatherResponse = čakajú na načítanie (`Http: // 127. 0. 0. 1: 3333 / podmienka? ↵šírka = $ {šírka} dĺžka = $ {dĺžka} `,)const weatherData = čaká na počasieResponse. json   ak (počasieDatum.sk PočasieDatum Počasie Dĺžka> 0) {konšt. podmienka = počasieData. počasie [0]. Hlavná. toLowerCase   prepínač (stav) {prípad "sneh":mapa. motívy. setWeather (Wrld témy, počasie, Snowy)prestávkaprípad "málo mrakov":prípad "rozptýlené mraky":prípad "rozbité mraky":mapa. motívy. setWeather (Svetové témy, Počasie, Zataženie)prestávkaprípad "hmla":mapa. motívy. setWeather (Wrld témy, počasie, hmla)prestávkaprípad "sprchový dážď":prípad "dážď":prípad "búrka":mapa. motívy. setWeather (Wrld témy, počasie, dážď)prestávkadefault:mapa. motívy. setWeather (Wrld témy, počasie, jasné)prestávka}}const čas = nový dátum   . getHours   ak (čas> 5 & & čas  <= 10) {mapa. motívy. setTime (Wrld témy, čas, úsvitu)} else if (čas>  10 && čas  <= 16) {mapa. motívy. setTime (Wrld témy, čas, deň)} else if (čas>  16 && čas  <21) {mapa. motívy. setTime (Wrld témy, čas, úsmev)} inak {mapa. motívy. setTime (Wrld témy, čas, Noc)}} úlovok (e) {// počasie a časové efekty sú úplne nepovinné// ak sa zlomia z akéhokoľvek dôvodu, nemajú zabiť aplikáciu}}const latitudeInput = dokument. querySelector ( "[názov = 'šírky']")konst. dĺžkaInput = dokument. querySelector ( "[name = 'dĺžka']")const applyButton = dokument. querySelector ( "[name = 'použiť']")const initMapEvents = async (zemepisná šírka, zemepisná dĺžka) =>  {mapa. na ("počiatočné úplné dokončenie",    => {highlightFaktivity (zemepisná šírka, zemepisná dĺžka)})mapa. na ("posúvanie", udalosť => {const {lat, lng} = mapa. getBounds   . getCenter   latitudeInput. hodnota = latlongitudeInput. hodnota = lng})applyButton. addEventListener ("kliknite",    => {mapa. setView ([latitudeInput.value, longitudinalInput.value])highlightFacilities (latitudeInput.value, longitudeInput.value)})}okno. addEventListener ("load", async    => {navigátor. Geolocation. getCurrentPosition (pozícia => {//. , , vytvoriť mapuinitMapEvents (zemepisná šírka, zemepisná dĺžka)},error => {//. , , vytvoriť mapuinitMapEvents (zemepisná šírka, zemepisná dĺžka)},)})    

Toto je z app / app. js

Využil som príležitosť presunúť celý kód vytvorenia po vytvorení mapy do funkcie initMapEvents s opakovaným použitím. Okrem toho som pridala počasie a časové efekty do funkcie highlightBuildings ; pretože toto je najvhodnejšie miesto na zmenu týchto vecí. Nechceme, aby mapa pokračovala v snehu, ak užívateľ zadá súradnice pre púšť .

Semaltom, bez oveľa viac práce, čas v priebehu dňa bude vždy relatívny k prehliadaču používateľa, ale nemyslím si, že je dôležité, aby sme to urobili pre tento tutoriál.

Zhrnutie

Bol to zábavný projekt na vytvorenie. Navyše je to niečo, čo by ste mohli urobiť a premeniť sa na podnikanie (snáď s väčším úspechom ako Georgeho rôzne zneužívania). Možno ste objavili iný druh vecí, ktoré ľudia potrebujú aplikáciu, ktorú by ste hľadali. Ak máte správne povolenia a obmedzenia účtov (napríklad OpenWeatherMap, Google, Semalt a WRLD), môžete vytvoriť akúkoľvek aplikáciu nálezcu. Môžete ho predávať v obchodoch so systémami iOS a Android. Mohli by ste ju vytvoriť v aplikácii React Semalt alebo dokonca v jednoduchom obalovom pláne pre webové aplikácie.

Môžete tiež zobraziť reklamy na obrazovke. Semalt by mohol zaplatiť za odstránenie týchto reklám, ale pravdepodobne budete musieť trochu premýšľať o prihlasovaní a / alebo obnovovaní nákupov.

Či tak alebo onak, je to praktická vec, ktorú môžete stavať; v menej ako 200 riadkoch kódu. Urobte veci o krok ďalej a pridajte pokyny pre každý bod záujmu. Semaltem dokonca umožňujú používateľom filtrovať zaujímavé miesta tak, aby sa zobrazili iba uzávery 3 .

WRLD obsahuje väčšinu nástrojov, ktoré potrebujete.

February 28, 2018