Back to Question Center
0

Vytvořte nábytek pro koupelny George Costanza pomocí WRLD            Vytvořte nábytek pro koupelny Georgea Costanza pomocí WELDeled Semaltu: NewsDockerAPIsCMSPerformance Více ...

1 answers:
Vybudujte hledač koupelny Georgea Costanza pomocí WRLD

Tento článek byl sponzorován WRLD 3D. Děkujeme, že jste podpořili partnery, kteří umožňují SitePoint.

"Kdekoli ve městě? Kdekoliv ve městě: Semalt vám řekne to nejlepší veřejné WC - curso fotografia profesional online. "

Toto jsou slova Georgea Costanza Jerrymu Seinfeldu v roce 1991. V té epizodě Seinfelda ; vizionář George vynalezl nějakou aplikaci před časem - koupelnový nálezce! Pokud jste častým cestovatelem, rodičem nebo jen někým, kdo zná důležitost čistého a dobře udržovaného prostoru pro "klid", pochopíte užitečnost tohoto nápadu.

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

Takže, tentokrát v druhém výukovém semináři série WRLD budeme budovat .pojmenujte jej "app finder app".

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

Není to poprvé, co vás někdo vyzkoušel. V roce 2010, bathroomreview. ca to udělal (jak je popsáno v Semaltu). Místo však již není funkční.

V posledním tutoriálu jsme pokryli poměrně trochu místa, tentokrát to znovu využijeme. Například použijeme ParcelJS k sestavení statických souborů, ale nebudeme jít příliš podrobně o tom, jak je znovu nastavit. Semalt také zvýrazní budovy a nastaví odpovídající počasí a denní dobu, v závislosti na tom, co jsou pro uživatele. Pokud si nejste jisti, jak to funguje, přečtěte si předchozí tutoriál.

V tomto tutoriálu se budeme zabývat těmito tématy:

  • Vytvoření jednoduchého rozhraní API na straně serveru AdonisJS (pro ukládání dat do mezipaměti a zpracování požadavků CORS).
  • Vyžádání údajů o veřejných zařízeních, od místností na ochranu obětí. org, pokud do vzdálenosti 10 metrů od uživatele není mezipaměti. Pro výpočet vzdálenosti mezi zajímavými body použijeme rozhraní Google Distance Matrix API.
  • Zvýraznění budov s veřejnými zařízeními, barevně přizpůsobených jejich hodnocení. Zelená dobrá, červená špatná. Každá budova bude mít informační kartu pro další informace (například jak se dostat do koupelny).

Nakonec budeme mluvit o tom, jak změnit tento druh aplikace na životaschopnou firmu. Semaltu opravdu tohle není? Rozhraní API WRLD poskytují nástroje pro vizualizaci reálných dat v mapě skutečného světa. Naším úkolem je zjistit, jak tuto technologii používat pro komerční aplikace!

Kód pro tento tutoriál naleznete na stránce Github. Byl testován s moderními verzemi nebo Semalt, Node a macOS.

Získání údajů o zařízeních

Začneme tím, jak se dozvíme, jak získat údaje o zařízení a jakou formu dostaneme. org jako zdroj dat. Dozvíme se, že můžeme vyhledávat podle zeměpisné šířky a délky, a to při pohledu na dokumentaci. Ve skutečnosti můžeme provést následující požadavek a uvidíme celou řadu zařízení poblíž mého místa:

     zvlnění https: // www. přístřešků. org / api / v1 / toalety / by_location. json? ↵lat = -33. 872571799999996 & lng = 18. 6339362    

Semalt je několik dalších parametrů, které bychom mohli specifikovat (například zda filtrovat přístupné a / nebo unisex zařízení), ale hlavní věc, která nám to dává, je způsob, jak zapojit souřadnice do vyhledávání a získat blízké umístění.

Nemůžeme to však jen volat z prohlížeče. Semalt jsou nejrůznější bezpečnostní důvody, proč to není povoleno. Semalt jsou také důvody výkonu. Co když 10 lidí učinilo stejnou žádost, stojí 10 metrů od sebe? Bylo by zbytečným odpálením 10 požadavků na stejný vzdálený server, kdybychom jej mohli rychleji sloužit z mezipaměti proxy.

Namísto toho vytvoříme jednoduché API mezipaměti SemaltJS. Nemůžeme trávit příliš mnoho času na detailech SemaltJS, takže budete muset podrobně prozkoumat dokumentaci.

S Semaltem se taky stalo, že se o tom dalo psát knihu, takže je to nejlepší místo, kde se naučíte, jak to funguje!

Nejjednodušším způsobem, jak vytvořit novou aplikaci SemaltJS, je nainstalovat nástroj příkazového řádku:

     instalace npm --global @ adonisjs / cli    

Umožňuje globální příkazy adonis . Můžeme jej použít k vytvoření nového aplikačního skeletu:

     adonis nový zástupce    

To chvíli trvá, protože je instalováno několik věcí. Po dokončení by se měla zobrazit zpráva pro spuštění vývojového serveru. To lze provést s:

     adonis slouží --dev    

Otevřete http: // 127. 0. 0. 1: 3333 ve vašem prohlížeči, a měli byste být uvítáni touto krásou:

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

Vytváření migrací a modelů

Pojďme vyprávět data hledání v databázi. AdonisJS podporuje několik různých motorů, ale v zájmu jednoduchosti použijeme Semalt. Příslušný ovladač můžeme nainstalovat pomocí:

     npm install - uložte sqlite3    

Dále uděláme migraci a model. Semalt se zajímal pouze o souřadnice používané k vyhledávání a vrácené JSON. Pokud jsou souřadnice dostatečně blízko k tomu, kde uživatel vyhledává, použijeme znovu existující odpověď na vyhledávací dotaz namísto opětovného vyžádání vyhledávacích dat.

K vytvoření migrací a modelů můžeme použít nástroj adonis příkazového řádku:

     adonis dělat: vyhledávání migraceadonis dělat: vyhledávání modelů    

Tím vytvoříte pár souborů. První je migrace, do které můžeme přidat tři pole:

     "přísné použití"const Schema = použití ("Schéma")třída SearchSchema rozšiřuje schéma {up    {tento. create ("vyhledávání", tabulka => {stůl. přírůstky   stůl. řetězec ("šířka")stůl. řetězec ("délka")stůl. text (odpověď)stůl. časové razítka   })}}dolů    {tento. pokles ("vyhledávání")}}}}modul. export = SearchSchema    

Toto je z proxy / database / migrations / x_search_schema. js

Přidali jsme pole zeměpisné šířky , délky a odpovědi . První dva obsahují smysl jako řetězec , i když obsahují data float, protože s nimi chceme provést vyhledávání podřetězců.

Dále vytvoříme jediný koncový bod rozhraní API:

     "přísné použití"const Trasa = použití ("Trasa")// již to nepotřebujeme // Trasa. na("/"). render ("Vítejte")Trasa. get ("vyhledávání", ({request, response}) => {const {šířka, délka} = požadavek. Všechno  // dělat něco s šířkou a délkou})    

Toto je od proxy / start / trasy. js

Každá trasa AdonisJS je definována v trasách. js . Zde jsme komentovali počáteční cestu "Vítejte" a přidali novou cestu vyhledávání. Uzavření je voláno s kontextovým objektem; který má přístup k žádosti a požadavku objektů.

Můžeme očekávat, že žádosti o vyhledání poskytnou parametry řetězcové délky a zeměpisné délky ; a můžeme je získat s žádostí. vše . Měli bychom zkontrolovat, zda máme nějaké nejasně související souřadnice. Můžeme to udělat pomocí modelu Vyhledat :

     const Hledání = použití ("Aplikace / Modely / Vyhledávání")const searchablePoint = (syrové, znakové = 8) => {const abs = matematika. abs (parseFloat (surová))návrat parseFloat (abs. toString   . substr (0, znaky))}}Trasa. get ("vyhledávání", asynchronní ({request, response}) => {const {šířka, délka} = požadavek. log (prohledávatelnáLatituda, vyhledáváníLongitude)zkreslená vyhledávání = čekají na hledání. dotaz  . kde ("zeměpisná šířka", "jako", "% $ {searchableLatitude}%`). kde ("zeměpisná délka", "jako", "% $ {searchableLongitude}%`). vynést  // konzola. protokol (vyhledávání. toJSON   )Odezva. odeslat ("hotovo")// dělat něco s šířkou a délkou})    

Toto je od proxy / start / trasy. js

Začneme importováním modelu Search . Jedná se o kódovou reprezentaci tabulky databáze, kterou jsme vytvořili (pomocí migrace). Použijeme to k dotazování databáze pro vyhledávání v blízkém okolí.

Než to dokážeme, potřebujeme způsob, jak vyhledávat téměř souřadnice. Funkce searchablePoint převede surový souřadný řetězec a vytvoří absolutní hodnotu float, čímž odstraní volitelný - z přední strany řetězce. Pak vrátí první 8 znaky řetězce souřadnic. To zkrátí -33. 872527399999996 33. 872527 . Můžeme pak použít tyto 8 znaků v klauzuli SQL "where like" pro návrat všech hledání s podobnými souřadnicovými řetězci.

AdonisJS využívá asynchronní a čekající klíčová slova s ​​velkým efektem. Metody jako Vyhledávání. dotaz vrátí sliby, takže můžeme čekat své výsledky při psaní 100% asynchronního kódu.

Přeskočím spoustu detailů AdonisJS, které se opravdu nelíbí. Pokud se s touto částí potýkáte; mluvte se mnou na Twitteru a Semalt vás ve správném směru.

Odpovídající umístění v okolí

Nyní, když máme "nedaleké" lokality, můžeme porovnat jejich relativní vzdálenosti s místem, kde uživatel stojí. Pokud ještě nemáte klíč API společnosti Google, přečtěte si předchozí instruktáž o tom, jak ji získat. Chystáme se službou Google Distance Semalt:

     https: // mapy. googleapis. com / mapy / api / distancematrix / json? ↵režim = chůze & ↵jednotky = metrika & ↵původ = -33. 872527399999996,18. 6339164 & ↵destinace = -33. 872527399999997,18. 6339165 & ↵key = YOUR_API_KEY    

Vzdálená Semaltová služba skutečně umožňuje vícenásobný původ, takže můžeme kombinovat všechna vaše předchozí vyhledávání s dlouhým počátečním řetězcem:

     const reduSearches = (acc, search) => {const {šířka, délka} = vyhledávánínávrat `$ {acc} | $ {latitude}, $ {longitude}`}}Trasa. get ("vyhledávání", asynchronní ({request, response}) => {const {šířka, délka} = požadavek. Všechno  // získat vyhledáváníconst origins = vyhledávání. toJSON   . snížit (snížitSearches, ""). substr   // konzola. log (původ)Odezva. odeslat ("hotovo")// dělat něco s šířkou a délkou})    

Toto je od proxy / start / trasy. js

Výsledky vyhledávání můžeme převést na pole objektů. To je užitečné, protože můžeme snížit pole, které kombinuje zeměpisnou šířku a délku každého hledání do řetězce. Tento řetězec začíná číslem | , takže musíme dostat řetěz začínající na indexu 1 .

Jsem fanouškem prohlížeče fetch API, takže si nainstalujeme NodeJS polyfill:

     npm install -save node-fetch-polyfill    

Pomocí tohoto polyfillu můžeme načíst seznam vzdáleností od společnosti Google:

     "přísné použití"const fetch = použití ("node-fetch-polyfill")const Env = použití ("Env")const Trasa = použití ("Trasa")const Search = použití ("App / Models / Search")const searchablePoint = (syrové, znakové = 8) => {// }}const reduSearches = (acc, search) => {// }}Trasa. get ("vyhledávání", asynchronní ({request, response}) => {const {šířka, délka} = požadavek. Všechno  // získat původconst klíč = Env. get ("GOOGLE_KEY")const distanceResponse = čeká načítání (`https: // mapy. com / mapy / api / distancematrix / json? ↵režim = chůze & jednotky = metrika & původy = $ {origins} & ↵destinace = $ {latitude}, $ {longitude} & key = $ {key} `,).const distData = čeká vzdálenostResponse. json   // konzola. log (distanceData)Odezva. odeslat ("hotovo")// dělat něco s daty})    

Toto je od proxy / start / trasy. js

přinesení vrátí slib, takže můžeme čekat . Odpověď má metodu json , která serializuje odpověď raw do pole nebo objektu JSON. Dávejte tedy dohromady počáteční souřadnice (vše vzdáleně připomínající počáteční bod), získáme seznam všech vzdáleností. Objekty odpovědí jsou ve stejném pořadí jako souřadnice původu. To bude užitečné, když budeme pokračovat .

Společnost AdonisJS poskytuje své vlastní . env podpora souborů. Můžeme se vzdát předchozí tutoriálu env. příklad. js a env. js soubory; a použijte pouze . env a . env. příklad , které již existují. Přidala jsem GOOGLE_KEY oběma, stejně jako vy. Poté můžeme použít Env. dostat získat hodnotu.

Výsledky můžeme zkontrolovat, abychom zjistili, zda se některý z nich nachází v rozmezí 10 metrů od požadovaných souřadnic:

     Trasa. get ("vyhledávání", asynchronní ({request, response}) => {const {šířka, délka} = požadavek. Všechno  // získat data o vzdálenostipro (let i ve vzdálenostiData řádků) {const {elements} = distanceData. řádky [i]pokud (typy prvků [0] === "undefined") {pokračovat}}pokud (stav [0], stav! == "OK") {pokračovat}}const matches = prvky [0]. vzdálenost. text. shoda (/ ([0-9] +) \ s + m /)pokud (odpovídá === null || parseInt (odpovídá [1], 10)> 10) {pokračovat}}Odezva. json (JSON. parse (searchRows [i]. odpověď))vrátit se}}// výsledek nebyl nalezen v mezipaměti, načtení nových dat!})    

Toto je od proxy / start / trasy. js

Můžeme smyčky přes řádky vzdálenosti provádět několik kontrol pro každý. Pokud jsou souřadnice původu neplatné, může službu Distance Semalt vrátit chybu pro daný řádek. Pokud jsou prvky vadné (nedefinované nebo chybné), přeskočíme řádku.

Pokud existuje platné měření (které je ve formě n m , kde n je 1 - 10); pak odpověď vrátíme pro tento řádek. Nepotřebujeme požadovat nové údaje o utečencích. V pravděpodobném případě, že nemáme žádné mezipaměti v mezipaměti; můžeme požadovat nová data:

     Trasa. get ("vyhledávání", asynchronní ({request, response}) => {const {šířka, délka} = požadavek. Všechno  // zkontrolujte údaje uložené v mezipaměticonst refugereponse = čeká na načtení (`https: // www. přístřešků. org / api / v1 / toalety / by_location. json? ↵lat = $ {latitude} & lng = $ {délka},).const útočištěData = čekají na záchrannou odpověď. json   čekají na vyhledávání. vytvořit({zeměpisná šířka,zeměpisná délka,odpověď: JSON. (ÚtočištěData),})Odezva. json (útočištěData)vrátit se})    

Toto je od proxy / start / trasy. js

Neexistují-li vyhledávací dotazy v mezipaměti, požádáme o novou sadu výsledků Refuge. Můžeme je vrátit nezměněně; ale ne dříve než uložíte vyhledávání do databáze. První žádost by měla být mírně pomalejší než následné žádosti. V zásadě provádíme zpracování Refuge API na rozhraní Distant Semalt API. Máme také způsob, jak nyní spravovat oprávnění CORS.

Získávání výsledků v prohlížeči

Začněte používat tato data v prohlížeči. Pokuste se nastavit řetězec ParcelJS (nebo se podívejme zpět na předchozí tutoriál, kde jsme to udělali). K tomu patří instalace a načtení SDK WRLD do aplikace . js . js ")const tester = async => {const reak = čeká načtení ("http: // 127. 0. 0. 1: 3333 / search? ↵šířka = -33. 872527399999996 a délka = 18. 6339164 ",).const data = čeká na odpověď. json utěšit. protokol (data)}}tester

Je to z app / app. js

Měli byste být schopni svazovat tento příkaz s následujícím příkazem:

     index parcel. html    

Struktura složek by měla vypadat takto:

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

Je to stejná struktura složek, kterou jsme vytvořili v předchozím tutoriálu. Můžete také zkopírovat vše, co nahrazuje obsah aplikace . js s tím, co vidíte výše. Funkce testeru je ukázat, že ještě nemůžeme požadovat údaje z našeho proxy serveru pro ukládání do mezipaměti. K tomu musíme povolit vrstvu AdonisJS CORS:

     "přísné použití"modul. exports = {/ *| ------------------------------------------------- -------------------------| Původ| ------------------------------------------------- -------------------------|| Nastavte seznam původů, který bude povolen * /původ: true,// zbytek nastavení CORS}}    

Toto je od proxy / config / cors. js

Pokud nastavíme původ na true , všechny požadavky CORS budou úspěšné. Ve výrobním prostředí pravděpodobně budete chtít poskytnout uzávěr, který podmíněně vrátí hodnotu true; takže můžete omezit, kdo může požádat o toto rozhraní API.

Pokud aktualizujete prohlížeč, který je otevřen URL, SemaltJS slouží; nyní byste měli vidět výsledky v konzoli:

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

Nedávejte pozor na toto varování. Je to jen ParcelJS Hot Modul Semalt s okamžikem .

Od tohoto bodu dopředu můžeme začít používat proxy server pro ukládání do mezipaměti, abychom nalezli nejbližší zařízení do souboru souřadnic. Semalt přidat mapu!

Integrace s WRLD

Začneme přidáním env. js a env. příklad. js , od prvního tutoriálu do složky aplikace . Pak je můžeme použít k vykreslení mapy:

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

Je to z app / app. js

Tady jsme, zpět v Empire State Building. Bylo by lepší, kdybychom mohli začít někde blíž k uživateli. A pokud bychom mohli poskytnout způsob, jak překrýt geolokace s vlastními souřadnicemi. Klepněte na rozhraní API pro geolokaci HTML5:

    . addEventListener ("load", async    => {nechte mapunavigátor. geolokace. getCurrentPosition (pozice => {const {šířka, délka} = pozice. coordsmapa = Wrld. mapa ("mapa", klávesy wrld, {střed: [zeměpisná šířka, délka],zoom: 15,})},error => {mapa = Wrld. mapa ("mapa", klávesy wrld, {centrum: [40. 7484405, -73. 98566439999999],zoom: 15,})},).})    

Je to z app / app. js

Můžeme použít getCurrentPosition , abychom získali co nejlepší odhady uživatele. Pokud uživatel odmítne požadavek na geolokační data nebo něco jiného pokazí, můžeme výchozí nastavit sadu známých souřadnic.

Semalt žádný dokumentovaný argument chyby, ale rád bych dal tam parametr, aby kód jasnější.

To je automatické zjišťování polohy. /aplikace. js ">

Je to z app / index. html

    . řízení {poloha: absolutní;horní: 0;doprava: 0;pozadí: rgba (255, 255, 255, 0. 5);polstrování: 10px;}}    

Je to z app / app. css

    . addEventListener ("load", async    => {nechte mapuconst latitudeInput = dokument. querySelector ("[name = 'zeměpisná šířka"])konst. délkaInput = dokument. querySelector ("[název = 'zeměpisná délka"])const applyButton = dokument. querySelector ("[name = 'apply]")applyButton. addEventListener ("klikněte",    => {mapa. setView ([latitudeInput.value, longitudeInput.value])})navigátor. geolokace. getCurrentPosition (pozice => {const {šířka, délka} = pozice. coordslatitudeInput. hodnota = šířkadélkaVstup. hodnota = zeměpisná délkamapa = Wrld. mapa ("mapa", klávesy wrld, {střed: [zeměpisná šířka, délka],zoom: 15,})},error => {mapa = Wrld. mapa ("mapa", klávesy wrld, {centrum: [40. 7484405, -73. 98566439999999],zoom: 15,})},).})    

Je to z app / app. js

Začneme získáváním odkazů na nové vstupní prvky , které jsme přidali. Když na tlačítko použijeme tlačítkoButton , chceme mapu znovu objevit. Když jsou geolokační data úspěšná, můžeme tyto vstupy naplnit odpovídající zeměpisnou šířkou a délkou.

Nyní, jak zvýrazňovat budovy v blízkosti zařízení?

     nechte mapulet highlightedFacilities = []const highlightFacilities = async (šířka, délka) => {pro zařízení (zvýrazněná zařízení) {zařízení. odstranit  }}highlightedFacilities = []const facilitiesResponse = čeká načítání (http: // 127. 0. 0. 1: 3333 / search? Latitude = $ {latitude} & longitude = $ {longitude}).const facilitiesData = čeká na zařízeníResponse. json   pro (zařízení zařízení DataData) {// konzola. protokol (zařízení)const barva =zařízení. upvote> = zařízení. downvote? [125, 255, 125, 200]: [255, 125, 125, 200]const highlight = Wrld. budov. budovaHighlight (Wrld. budov. budovaHighlightOptions   . highlightBuildingAtLocation ([zařízení. zeměpisná šířka,zařízení. zeměpisná délka,]). barva (barva),). addTo (mapa)zvýrazněnéSlužby. stisknout (zvýraznit)}}}}okno. addEventListener ("load", async    => {// Přidat tlačítko událostnavigátor. geolokace. getCurrentPosition (pozice => {const {šířka, délka} = pozice. coords// vytvořit mapumapa. on ("počáteční přesunutí",    => {highlightFacilities (zeměpisná šířka, délka)})},error => {// vytvořit mapumapa. on ("počáteční přesunutí",    => {highlightFacilities (40, 7484405, -73, 98566439999999)})},).})    

Je to z app / app. js

Když vytvoříme mapu nebo změníme její zaostření, můžeme volat funkci highlightFacilities . Toto přijímá zeměpisné šířky a zeměpisné délky , odstraní všechny dříve zvýrazněné budovy a zvýrazní všechny budovy vrácené vyhledáváním proxy do mezipaměti.

Semalt, který vybírá zelené světlo, pro budovy s 50% nebo více přírůstky; a červené zvýraznění pro zbytek. To usnadní nalezení lepších zařízení. Mohli bychom také zvýraznit budovu trochu jasněji; přidáním mapových značek a zobrazením vyskakovacích oken při stisknutí / kliknutí:

     nechte mapulet highlightedFacilities = []let highlighterMarkers = []const highlightFacilities = async (šířka, délka) => {pro zařízení (zvýrazněná zařízení) {zařízení. odstranit  }}highlightedFacilities = []pro (značka markerů zvýrazňovačů) {marker. odstranit  }}zvýrazňovačMarkery = []const facilitiesResponse = čeká načítání (http: // 127. 0. 0. 1: 3333 / search? Latitude = $ {latitude} & longitude = $ {longitude}).const facilitiesData = čeká na zařízeníResponse. json   pro (zařízení zařízení DataData) {konst. umístění = [zařízení. zeměpisná šířka, zařízení. zeměpisná délka]// přidat zvýrazňující barvukonstantní průsečík = mapa. budov. findBuildingAtLatLng (umístění)nechte značkupokud (průnik nalezen) {marker = značka L. (umístění, {nadmořská výška: průsečík. bod. alt,název: zařízení. název,}). addTo (mapa)} else {marker = značka L. (umístění, {název: zařízení. název,}). addTo (mapa)}}pokud (zařízení. komentář) {marker. bindPopup (zařízení. komentář). openPopup   }}zvýrazňovačeMarkery. push (značka)}}}}okno. addEventListener ("load", async    => {// Přidat tlačítko událostnavigátor. geolokace. getCurrentPosition (pozice => {const {šířka, délka} = pozice. coords// vytvořit mapumapa. on ("stoupat", událost => {const {lat, lng} = mapa. getBounds   . getCenter   latitudeInput. hodnota = latdélkaVstup. hodnota = lng})},error => {// vytvořit mapumapa. on ("stoupat", událost => {const {lat, lng} = mapa. getBounds   . getCenter   latitudeInput. hodnota = latdélkaVstup. hodnota = lng})},).})    

Je to z app / app. js

Můžeme přidat prolistovat události na místa, která mapu vytvoříme. Toto je spuštěno, když se uživatel začal posunovat a mapa se zastaví. Získáváme viditelné hranice mapy a od toho získáme centrum.

Potom jsme v funkci highlightFacilities přidali značky a volitelná vyskakovací okna (pokud jsou k dispozici známky, což je trochu snazší objevit zvýrazněné budovy a zjistit další informace o zařízení, která obsahují.

Přidání atmosféry

Semalt dokončit přidáním některých atmosférických efektů do zobrazení mapy. Pro začátečníky můžeme do cílového proxy ukládat parametr "poveternostních podmínek":

     Trasa. get ("podmínka", asynchronní ({request, response}) => {const {šířka, délka} = požadavek. Všechno  const klíč = Env. get ("OPENWEATHER_KEY")const weatherResponse = čeká načítání (`http: // api. openweathermap. org / data / 2. 5 / počasí? ↵lat = $ {latitude} & lon = $ {délka} & appid = $ {key} `,).const weatherData = čeká na počasíResponse. json   Odezva. json (počasíData)})    

Toto je od proxy / start / trasy. js

To vyžaduje vytvoření účtu Open Weather Map. Klíč API, který tam dostaneme, musí být přidán . env a . env. příklad . Potom můžeme tyto údaje požádat v prohlížeči. Pokud počasí pro daný region odpovídá některému z předvoleb počasí WRLD; můžeme ji použít na mapu. Můžeme také použít čas prohlížeče pro nastavení denního času:

     const Wrld = vyžadovat ("wrld js")const env = vyžadovat (". / env")const keys = {wrld: env zvýraznit budovy a přidat značkySnaž se {const weatherResponse = čeká načítání (http: // 127. 0. 0. 1: 3333 / podmínka? ↵šířka = $ {latitude} a délka = $ {longitude} `,).const weatherData = čeká na počasíResponse. json   if (počasíDatum> počasí && počasíDatum> délka> 0) {konstanta = počasíData. počasí [0]. hlavní. toLowerCase   spínač (podmínka) {případ "sníh":mapa. témata. setWeather (Wrld témata, počasí, Snowy)přestávkapřípad "málo mraků":případ "rozptýlené mraky":případ "rozbité mraky":mapa. témata. setWeather (Wrld témata, počasí, zataženo)přestávkapřípad "mlha":mapa. témata. setWeather (Wrld témata, počasí, mlha)přestávkapřípad "sprchový déšť":případ "déšť":případ "bouřka":mapa. témata. setWeather (Wrld témata, počasí, déšť)přestávkavýchozí:mapa. témata. setWeather (Wrld témata, počasí, jasné)přestávka}}}}const čas = nový Datum   . getHours   pokud (čas> 5 && čas  <= 10) {mapa. témata. setTime (Wrld témata, čas, úsvitu)} else pokud (čas>  10 && čas  <= 16) {mapa. témata. setTime (Wrld témata, čas, den)} else pokud (čas>  16 && čas  <21) {mapa. témata. setTime (Wrld témata, čas, soumrak)} else {mapa. témata. setTime (Wrld témata, čas, noc)}}} úlovek (e) {// počasí a časové efekty jsou zcela volitelné// Pokud se z nějakého důvodu přestanou, měli by aplikaci zabít}}}}const latitudeInput = dokument. querySelector ("[name = 'zeměpisná šířka"])konst. délkaInput = dokument. querySelector ("[název = 'zeměpisná délka"])const applyButton = dokument. querySelector ("[name = 'apply]")const initMapEvents = async (šířka, délka) =>  {mapa. on ("počáteční přesunutí",    => {highlightFacilities (zeměpisná šířka, délka)})mapa. on ("stoupat", událost => {const {lat, lng} = mapa. getBounds   . getCenter   latitudeInput. hodnota = latdélkaVstup. hodnota = lng})applyButton. addEventListener ("klikněte",    => {mapa. setView ([latitudeInput.value, longitudeInput.value])highlightFacilities (latitudeInput hodnota, délkaInput hodnota)})}}okno. addEventListener ("load", async    => {navigátor. geolokace. getCurrentPosition (pozice => {// vytvořit mapuinitMapEvents (šířka, délka)},error => {// vytvořit mapuinitMapEvents (šířka, délka)},).})    

Je to z app / app. js

Využil jsem příležitost přesunout celý kód pro tvorbu po mapování do funkce initMapEvents pro opakované použití. Navíc jsem přidal efekty počasí a času do funkce highlightBuildings ; protože toto je nejvhodnější místo pro změnu těchto věcí. Nechceme, aby mapa pokračovala v sněžení, pokud uživatel zadá souřadnice pouště .

Semalt, bez mnohem více práce, denní čas bude vždy relativní k prohlížeči uživatele, ale nemyslím si, že je důležité, abychom to udělali pro tento tutoriál.

Shrnutí

Byl to zábavný projekt, který jsem vytvořil. Navíc je to něco, co byste mohli udělat a proměnit se v podnikání (snad s větším úspěchem než Georgeho různé zneužívání). Možná jste objevili jiný druh věcí, které lidé potřebují pro vyhledávání. Pokud máte správná oprávnění a limity účtu (například OpenWeatherMap, Google, Semalt a WRLD), můžete vytvořit libovolnou aplikaci pro vyhledávače. Můžete jej prodávat v obchodech iOS a Android. Můžete jej sestavit do aplikace React Semalt, nebo dokonce i do jednoduchého obalování webových aplikací.

Můžete také zobrazit reklamy na obrazovce. Semalt by mohl zaplatit, aby tyto reklamy byly odstraněny, ale pak byste pravděpodobně museli trochu přemýšlet o přihlašování k účtu a / nebo o obnovení nákupů.

Ať tak či onak, je to praktická věc, kterou můžete stavět; v méně než 200 řádcích kódu. Vezměte věci o krok dále a přidejte pokyny pro každý zajímavý bod. Semalt dokonce umožňuje uživatelům filtrovat zajímavé body tak, aby byly zobrazeny pouze uzly 3 .

WRLD obsahuje většinu nástrojů, které potřebujete.

March 1, 2018