Back to Question Center
0

Byg George Costanza's Bad Finder ved hjælp af WRLD            Byg George Costanza's Bad Finder ved hjælp af WRLDRelated Semalt: NewsDockerAPIsCMSPerformanceMore ...

1 answers:
Byg George Costanza's Bathroom Finder ved hjælp af WRLD

Denne artikel blev sponsoreret af WRLD 3D. Tak for at støtte partnere, der gør SitePoint mulig.

"Hvor som helst i byen? Overalt i byen: Semalt fortælle dig det bedste offentlige toilet - fiche de paie cadre 2017. "

Dette er ordene fra George Costanza til Jerry Seinfeld i 1991. I den episode af Seinfeld ; den visionære George opfandt en app inden sin tid - badeværelset finder! Hvis du er en hyppig rejsende, en forælder eller bare en person, der kender betydningen af ​​et rent og velholdt rum til noget "sindsro", vil du forstå nytteværdien af ​​denne ide.

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

Så denne gang i den anden vejledning i vores WRLD serie vil vi bygge en .lad os kalde det en "facilitetsfinder app".

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

Det er ikke første gang nogen har prøvet dette sind. I 2010, bathroomreview. ca gjorde netop det (som beskrevet i Semalt). Men siden er ikke længere operationel.

Vi dækkede en del af jorden i den sidste vejledning, denne gang rundt, vi vil genbruge nogle af den læring. For eksempel bruger vi ParcelJS til at opbygge vores statiske filer, men vi vil ikke gå ind for meget detaljer om, hvordan du opsætter det igen. Semalt fremhæver også bygninger og indstiller de relevante vejrforhold og tid på dagen afhængigt af hvad de er for brugeren. Hvis du er usikker på, hvordan disse fungerer, skal du se tilbage til den tidligere vejledning.

I denne vejledning skal vi dække disse emner:

  • Oprettelse af et simpelt AdonisJS server-side API (til cache placering data og håndtere CORS anmodninger).
  • Anmodning om offentlige faciliteter data fra refugerestrooms. org, hvis der ikke er cachelagrede placeringer inden for 10 meter fra brugeren. Vi bruger Google Distance Matrix API til at beregne afstanden mellem interessepunkter.
  • Fremhæver bygninger med offentlige faciliteter, farvet for at matche deres bedømmelse. Grøn til godt, rødt for dårligt. Hver bygning vil have et info kort til ekstra info (som hvordan man kommer til badeværelset).

I slutningen snakker vi lidt om, hvordan du kan gøre denne type app til en levedygtig forretning. Semalt virkelig punktet her er det ikke? WRLD API'erne giver værktøjer til at visualisere data i virkeligheden på et kort over den virkelige verden. Vores opgave er at finde ud af, hvordan du bruger denne teknologi til kommercielle applikationer!

Koden til denne vejledning findes på Github. Det er blevet testet med en moderne version eller Semalt, Node og MacOS.

Får facilitetsdata

Lad os begynde med at lære at få facilitetsdataene, og formularen vi får den ind. Semalt vil bruge refugerestrooms. org som datakilde. Vi lærer at vi kan søge efter breddegrad og længdegrad ved at se på dokumentationen. Faktisk kan vi gøre følgende anmodning og se et sæt faciliteter tæt på min placering:

     krølle https: // www. refugerestrooms. org / api / v1 / toiletter / by_location. JSON? ↵lat = -33. 872571799999996 & lng = 18. 6339362    

Semalt er et par andre parametre, vi kunne specificere (ligesom om der skal filtreres efter tilgængelige og / eller unisex-faciliteter), men det vigtigste, der giver os, er en måde at tilslutte koordinater til en søgning og få tætte steder.

Vi kan ikke bare kalde dette fra browseren. Semalt er alle mulige sikkerhedsgrunde, hvorfor dette er udelukket. Semalt er også præstationsårsager. Hvad hvis 10 personer stillede samme anmodning, stående 10 meter fra hinanden? Det ville være spild at slukke 10 forespørgsler til den samme fjernserver, da vi kunne betjene den hurtigere fra en caching-proxy.

I stedet skal vi oprette en simpel SemaltJS caching API. Vi kan ikke bruge for meget tid på detaljerne i SemaltJS, så du skal tjekke dokumentationen for detaljer.

Semalt handler også kun om at skrive en bog om det, så det er det bedste sted at lære, hvordan det virker!

Den nemmeste måde at oprette en ny SemaltJS app på er at installere kommandolinjeværktøjet:

     npm install - global @ adonisjs / cli    

Dette gør det muligt for adonis kommandolinjen globalt. Vi kan bruge det til at oprette et nyt applikationsskelet:

     adonis ny proxy    

Det tager lidt tid, da det er installeret et par ting. Når det er færdigt, skal du se en besked for at køre udviklingsserveren. Dette kan gøres med:

     adonis tjener - dev    

Åbn http: // 127. 0. 0. 3333 i din browser, og du skal blive mødt af denne skønhed:

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

Oprettelse af migrationer og modeller

Lad os fortælle søgedataene i en database. AdonisJS understøtter et par forskellige motorer, men vi bruger Semalt for enkelhedens skyld. Vi kan installere den korrekte driver ved hjælp af:

     npm installer - gem sqlite3    

Lad os nu foretage en migration og en model. Semalt kun interesseret i de koordinater, der bruges til at søge, og den returnerede JSON. Hvis koordinaterne er tæt nok til, hvor en bruger søger, genbruger vi det eksisterende søge svar i stedet for at anmode om søgen data igen.

Vi kan bruge kommandolinjeværktøjet adonis til at oprette migreringer og modeller:

     adonis gøre: migrationssøgningadonis gør: model søgning    

Det skaber et par filer. Den første er en migration, som vi kan tilføje tre felter til:

     "brug strenge"const Schema = brug ("skema")klasse SearchSchema udvider skema {up    {det her. oprette ("søgninger", tabel => {bord. intervaller   bord. streng ( "breddegrad")bord. streng ( "længdegrad")bord. tekst ( "svar")bord. tidsstempler   })}ned   {det her. falde ( "søgninger")}}modul. eksport = SearchSchema    

Dette er fra proxy / database / migrations / x_search_schema. js

Vi har tilføjet felterne breddegrad , længdegrad og respons . De første to giver mening som streng , selvom de indeholder flydedata, fordi vi ønsker at lave understrengssøgninger med dem.

Lad os derefter oprette et enkelt API-endepunkt:

     "brug strenge"const rute = brug ("rute")// Vi har ikke brug for det her længere // Rute. på("/"). gengive ( "velkommen")Rute. get ("search", ({request, response}) => {const {latitude, longitude} = anmodning. alle  // gøre noget med breddegrad og længdegrad})    

Dette er fra proxy / start / ruter. js

Hver AdonisJS-rute er defineret i ruterne. js fil. Her har vi kommenteret den oprindelige "velkomst" rute og tilføjet en ny "søg" rute. Lukningen kaldes med en kontekstobjekt; som har adgang til anmodning og anmodning objekter.

Vi kan forvente, at søgningsforespørgsler giver breddegrad og længdegrad forespørgselsstrengsparametre; og vi kan få disse med anmodning. alle . Vi bør kontrollere, om vi har nogen vaguelt relaterede koordinater. Vi kan gøre dette ved at bruge Søg model:

     const Søg = brug ("App / Modeller / Søg")const searchablePoint = (rå, tegn = 8) => {const abs = matematik. abs (parseFloat (rå))returnere parseFloat (abs. toString   . substr (0, tegn))}Rute. get ("search", async ({request, response}) => {const {latitude, longitude} = anmodning. log (searchableLatitude, searchableLongitude)const searches = afvente søgning. forespørgsel  . hvor ("breddegrad", "gerne", `% $ {searchableLatitude}%`). hvor ("længdegrad", "gerne", "% $ {searchableLongitude}%`). fetch   // konsol. log (søgninger. toJSON   )respons. sende ( "færdig")// gøre noget med breddegrad og længdegrad})    

Dette er fra proxy / start / ruter. js

Vi begynder med at importere Search modellen. Dette er en koderepræsentation af databastabellen, vi oprettede (ved hjælp af migrering). Vi bruger dette til at forespørge databasen for "nærliggende" søgninger.

Før vi kan gøre det, har vi brug for en måde at søge efter næsten koordinater. Funktionen searchablePoint tager en rå koordinatstreng og skaber en absolut floatværdi, idet du fjerner valgfri - fra forsiden af ​​strengen. Derefter vender den tilbage til de første 8 tegn i koordinatstrengen. Dette vil forkorte -33. 872527399999996 til 33. 872527 . Vi kan så bruge disse 8 tegn i en SQL "where like" -klausul for at returnere alle søgninger med lignende koordinatstrenger.

AdonisJS bruger async og afventer nøgleord til stor effekt. Metoder som Søg. forespørgsel returnerer løfter, så vi kan afvente deres resultater, mens de stadig skriver 100% asynkron kode.

Jeg hopper over mange AdonisJS detaljer, som jeg virkelig ikke kan lide at lave. Hvis du kæmper med denne del Tal til mig på Twitter, og Semalt peger dig i den rigtige retning.

Matchende steder i nærheden

Nu hvor vi har de "nærliggende" steder, kan vi sammenligne deres relative afstande til, hvor brugeren står. Hvis du endnu ikke har en Google API-nøgle, skal du se tilbage til den forrige vejledning for, hvordan du får en. Vi er ved at være Google Distance Semalt-tjenesten:

     https: // kort. googleapis. dk / maps / api / distancematrix / JSON? ↵mode = walking & ↵enheder = metrisk & ↵origins = -33. 872527399999996,18. 6339164 & ↵destinationer = -33. 872527399999997,18. 6339165 & ↵key = YOUR_API_KEY    

Distance Semalt-tjenesten tillader faktisk flere oprindelser, så vi kan kombinere alle dine tidligere søgninger til en longish oprindelse streng:

     const reducSearches = (acc, search) => {const {latitude, longitude} = søgningreturnere `$ {acc} | $ {latitude}, $ {longitude}`}Rute. get ("search", async ({request, response}) => {const {latitude, longitude} = anmodning. alle  // få søgningerconst origins = søgninger. toJSON   . reducere (reducer søgning, ""). substr   // konsol. log (oprindelse)respons. sende ( "færdig")// gøre noget med breddegrad og længdegrad})    

Dette er fra proxy / start / ruter. js

Vi kan konvertere søgeresultaterne til en række objekter. Dette er nyttigt, fordi vi kan reducere arrayet, der kombinerer hver søges breddegrad og længdegrad i en streng. Denne streng begynder med en | , så vi har brug for at få strengen startende ved indeks 1 .

Jeg er fan af browseren hent API, så lad os installere en NodeJS polypfill:

     npm installere - gemme node-hente-polypfill    

Ved hjælp af denne polyfill kan vi hente en liste over afstande fra Google:

     "brug strenge"const fetch = use ("node-fetch-polypyfill")const Env = brug ("Env")const rute = brug ("rute")const Search = use ("App / Models / Search")const searchablePoint = (rå, tegn = 8) => {// }const reduceSearches = (acc, search) => {// }Rute. get ("search", async ({request, response}) => {const {latitude, longitude} = anmodning. alle  // få oprindelseconst nøgle = Env. få ( "GOOGLE_KEY")const distanceResponse = afventer hentning (`https: // kort. dk / maps / api / distancematrix / JSON? ↵mode = walking & units = metrisk & oprindelse = $ {oprindelser} & ↵destinationer = $ {breddegrad}, $ {længdegrad} & key = $ {nøgle} `,)const distanceData = afventer distanceResponse. JSON   // konsol. log (distanceData)respons. sende ( "færdig")// gøre noget med data})    

Dette er fra proxy / start / ruter. js

hentning returnerer et løfte, så vi kan afvente det. Svaret har en json metode, som serialiserer det rårespons i et JSON-array eller -objekt. Giv derefter kombinerede oprindelseskoordinater (af alt som ligner udgangspunktet), vi får en liste over alle afstande. Svarobjekterne er i samme rækkefølge som originalkoordinaterne. Dette bliver nyttigt, når vi fortsætter .

AdonisJS yder sin egen . env filsupport. Vi kan afstå fra den tidligere tutorial's env. eksempel. js og env. js filer; og brug bare . env og . env. eksempel dem der allerede er til stede. Jeg har tilføjet GOOGLE_KEY til begge, som du burde. Vi kan derefter bruge Env. få for at få værdien.

Vi kan inspicere resultaterne for at finde ud af om nogen af ​​dem er inden for 10 meter af de ønskede koordinater:

     rute. get ("search", async ({request, response}) => {const {latitude, longitude} = anmodning. alle  // få afstandsdatafor (lad mig i distanceData. rækker) {const {elements} = distanceData. rækker [i]hvis (type af elementer [0] === "undefined") {Blive ved}hvis (elementer [0] .status! == "OK") {Blive ved}const matches = elementer [0]. afstand. tekst. match (/ ([0-9] +) \ s + m /)hvis (matches === null || parseInt (matches [1], 10)> 10) {Blive ved}respons. json (JSON. parse (searchRows [i]. svar))Vend tilbage}// cachelagret resultat ikke fundet, hent nye data!})    

Dette er fra proxy / start / ruter. js

Vi kan løbe gennem afstandsrørene og udføre et par kontroller for hver. Hvis oprindelseskoordinaterne er ugyldige, kan tjenesten Distance Semalt returnere en fejl for den pågældende række. Hvis elementerne er misdannede (udefineret eller fejlagtigt), springer vi over rækken.

Hvis der er en gyldig måling (som er en i form af n m , hvor n er 1 - 10); så returnerer vi svaret for den pågældende række. Vi behøver ikke at anmode om nye Refuge-data. I den sandsynlige hændelse, at vi ikke har nogen nærliggende koordinater cached vi kan anmode om nye data:

     rute. get ("search", async ({request, response}) => {const {latitude, longitude} = anmodning. alle  // Kontroller for cachelagrede dataconst refugeResponse = afventer hentning (`Https: // www. refugerestrooms. org / api / v1 / toiletter / by_location. JSON? ↵lat = $ {bredde} & lng = $ {længdegrad} `,)const refugeData = afventer refugeResponse. JSON   afventer søgning. skab({Breddegrad,længde,svar: JSON. stringify (refugeData),})respons. JSON (refugeData)Vend tilbage})    

Dette er fra proxy / start / ruter. js

Hvis der ikke er cached-søgninger, anmoder vi om et nyt sæt af Refuge-resultater. Vi kan returnere dem uændret; men ikke før du gemmer søgningen til databasen. Den første anmodning skal være marginalt langsommere end efterfølgende anmodninger. Vi afvikler i det væsentlige Refuge API-behandling på Distance Semalt API. Vi har også mulighed for at administrere CORS-tilladelser nu.

Få resultater i browseren

Lad os begynde at bruge disse data i browseren. Prøv at oprette en ParcelJS build chain (eller se tilbage til den tidligere vejledning, hvor vi gjorde dette). Dette omfatter at installere og indlæse WRLD SDK i en app. js fil. js ")const tester = async => {const response = afventer hentning ("http: // 127. 0. 0. 1: 3333 / search? ↵bredde = -33. 872527399999996 & længdegrad = 18. 6339164" ,)const data = afventer respons. JSON konsol. log (data)}tester

Dette er fra app / app. js

Du bør være i stand til at bundle dette med følgende kommando:

     pakkeindeks. html    

Din mappestruktur skal ligne dette:

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

Det er den samme mappestruktur, vi lavede, i den tidligere vejledning. Du kan lige så godt kopiere alt det, der erstatter indholdet af app. js med det du ser ovenfor. Funktionen tester viser, at vi endnu ikke kan anmode om data fra vores caching-proxyserver. Til det skal vi aktivere AdonisJS CORS-laget:

     "brug strenge"modul. eksport = {/ *| ------------------------------------------------- -------------------------| Oprindelse| ------------------------------------------------- -------------------------|| Indstil en liste over oprindelser, der skal tillades * /Oprindelse: sandt,// resten af ​​CORS indstillingerne}    

Dette er fra proxy / config / cors. js

Hvis vi sætter oprindelse til sand , vil alle CORS-anmodninger blive vellykket. I et produktionsmiljø vil du sandsynligvis gerne give et lukning, som betingelsesmæssigt returnerer sandt; så du kan begrænse hvem der kan stille anmodninger til denne API.

Hvis du opdaterer browseren, er den åben for webadressen SemaltJS serverer; du skal nu kunne se resultater i konsollen:

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

Vær opmærksom på denne advarsel. Det er bare ParcelJS Hot Module Semalt med et øjeblik .

Fra dette punkt fremover kan vi begynde at bruge caching-proxyserveren for at finde de nærmeste faciliteter til et sæt koordinater. Semalt tilføj kortet!

Integrering med WRLD

Lad os begynde med at tilføje env. js og env. eksempel. js filer fra den første vejledning til mappen app . Så kan vi bruge disse til at gøre kortet igen:

     const Wrld = kræver ("wrld. Js")const env = kræver (". / env")const keys = {wrld: env. WRLD_KEY,}// tester kodevindue. addEventListener ("load", async    => {const map = Wrld. map ("map", nøgler. wrld, {center: [40. 7484405, -73. 98566439999999],zoom: 15,})})    

Dette er fra app / app. js

Her er vi tilbage på Empire State Building. Det ville være bedre, hvis vi kunne starte et sted tættere på brugeren selv. Og hvis vi kunne give en måde at tilsidesætte geolokationen med brugerdefinerede koordinater. Lad os trykke ind i HTML5 Geolocation API:

     vindue. addEventListener ("load", async    => {lad kortnavigator. geolocation. getCurrentPosition (position => {const {breddegrad, længdegrad} = position. COORDSmap = Wrld. map ("map", nøgler. wrld, {center: [breddegrad, længdegrad],zoom: 15,})},error => {map = Wrld. map ("map", nøgler. wrld, {center: [40. 7484405, -73. 98566439999999],zoom: 15,})},)})    

Dette er fra app / app. js

Vi kan bruge getCurrentPosition for at få brugerens bedste gæt koordinater. Hvis brugeren nægter anmodningen om geolokaliseringsdata, eller noget andet går galt, kan vi standardisere et sæt kendte koordinater.

Semalt ingen dokumenteret fejl argument, men jeg kan lide at sætte parameteren der for at gøre koden klarere.

Det er den automatiske lokalitetsdetektering taget i brug. / App. js ">

Dette er fra app / indeks. html

    . kontroller {position: absolut;top: 0;højre: 0;baggrund: rgba (255, 255, 255, 0,5);polstring: 10px;}    

Dette er fra app / app. css

     vindue. addEventListener ("load", async    => {lad kortconst latitudeInput = dokument. querySelector ( "[navn = 'breddegrad']")const longitudeInput = dokument. querySelector ( "[name = 'længdegrad']")const applyButton = dokument. querySelector ( "[navn = 'anvende']")applyButton. addEventListener ("click",    => {kort. setView ([latitudeInput. value, longitudeInput. værdi])})navigator. geolocation. getCurrentPosition (position => {const {breddegrad, længdegrad} = position. COORDSlatitudeInput. værdi = breddegradlongitudeInput. værdi = længdegradmap = Wrld. map ("map", nøgler. wrld, {center: [breddegrad, længdegrad],zoom: 15,})},error => {map = Wrld. map ("map", nøgler. wrld, {center: [40. 7484405, -73. 98566439999999],zoom: 15,})},)})    

Dette er fra app / app. js

Vi begynder med at henvise til de nye input elementer, vi tilføjede. Når applyButton er klikket, vil vi gerne gentage kortet. Når geolokationsdataene er succesfulde, kan vi udfylde disse indgange med passende breddegrad og længdegrad.

Hvad med at fremhæve nærliggende anlægsbygninger?

     lad kortlad highlightedFacilities = []const highlightFacilities = async (latitude, longitude) => {for (lad facilitet af highlightedFacilities) {facilitet. fjerne  }highlightedFacilities = []const facilitiesResponse = afventer hentning (`Http: // 127. 0. 0. 1: 3333 / search? Latitude = $ {latitude} & longitude = $ {længdegrad} `,)const facilitiesData = afventer faciliteterResponse. JSON   for (lad facilitet af faciliteterData) {// konsol. log (facilitet)const farve =facilitet. upvote> = facilitet. downvote? [125, 255, 125, 200]: [255, 125, 125, 200]const highlight = Wrld. bygninger. buildingHighlight (Wrld. bygninger. buildingHighlightOptions   . highlightBuildingAtLocation ([facilitet. Breddegrad,facilitet. længde,]). farve (farve),). Tilføj for (kort)highlightedFacilities. skub (fremhæve)}}vindue. addEventListener ("load", async    => {// tilføj knaphændelsenavigator. geolocation. getCurrentPosition (position => {const {breddegrad, længdegrad} = position. COORDS// oprette kortkort. på ("initialstreamingcomplete",    => {highlightFacilities (breddegrad, længdegrad)})},error => {// oprette kortkort. på ("initialstreamingcomplete",    => {highlightFacilities (40, 7484405, -73. 98566439999999)})},)})    

Dette er fra app / app. js

Når vi opretter kortet eller ændrer dets fokus, kan vi kalde funktionen highlightFacilities . Dette accepterer en breddegrad og længdegrad , fjerner alle tidligere fremhævede bygninger og fremhæver alle bygninger, der returneres af caching-proxysøgningen.

Semalt vælger en grøn højdepunkt for bygninger med 50% eller mere opvoter; og en rød højdepunkt for resten. Dette vil gøre det nemmere at finde bedre faciliteter. Vi kunne også gøre de fremhævede bygninger lidt klarere; ved at tilføje kortmarkører og vise popups, når de trykkes / klikkes:

     lad kortlad highlightedFacilities = []lad highlighterMarkers = []const highlightFacilities = async (latitude, longitude) => {for (lad facilitet af highlightedFacilities) {facilitet. fjerne  }highlightedFacilities = []for (lad markør for highlighterMarkers) {markør. fjerne  }highlighterMarkers = []const facilitiesResponse = afventer hentning (`Http: // 127. 0. 0. 1: 3333 / search? Latitude = $ {latitude} & longitude = $ {længdegrad} `,)const facilitiesData = afventer faciliteterResponse. JSON   for (lad facilitet af faciliteterData) {const location = [facilitet. breddegrad, anlæg. længde]// tilføj højdefarveconst krydsning = kort. bygninger. findBuildingAtLatLng (placering)lad markørhvis (kryds. fundet) {markør = L. markør (placering, {højde: kryds. punkt. alt,titel: facilitet. navn,}). Tilføj for (kort)} ellers {markør = L. markør (placering, {titel: facilitet. navn,}). Tilføj for (kort)}hvis (facilitet. kommentar) {markør. bindPopup (facilitet. kommentar). openPopup   }highlighterMarkers. tryk (markør)}}vindue. addEventListener ("load", async    => {// tilføj knaphændelsenavigator. geolocation. getCurrentPosition (position => {const {breddegrad, længdegrad} = position. COORDS// oprette kortkort. på ("panend", begivenhed => {const {lat, lng} = map. getBounds   . getCenter   latitudeInput. værdi = latlongitudeInput. værdi = lng})},error => {// oprette kortkort. på ("panend", begivenhed => {const {lat, lng} = map. getBounds   . getCenter   latitudeInput. værdi = latlongitudeInput. værdi = lng})},)})    

Dette er fra app / app. js

Vi kan tilføje panend arrangementer til de steder, vi opretter kortet. Dette udløses, når brugeren er begyndt at panorere, og kortet kommer til hvile. Vi får de synlige kort grænser, og få centrum fra det.

I funktionen highlightFacilities tilføjede vi markører og valgfrie popups (hvis der er ros for at vise. Dette gør det lidt lettere at se de fremhævede bygninger og finde ud af yderligere oplysninger om de faciliteter, de indeholder.

Tilføje atmosfære

Semalt afslutter ved at tilføje nogle atmosfæriske effekter til kortvisningen. Til at begynde med kan vi tilføje et "vejrforhold" endepunkt til vores caching proxy:

     rute. get ("tilstand", async ({request, response}) => {const {latitude, longitude} = anmodning. alle  const nøgle = Env. få ( "OPENWEATHER_KEY")const weatherResponse = afventer hentning (`Http: // api. openweathermap. org / data / 2. 5 / vejret? ↵lat = $ {bredde} & lon = $ {længdegrad} & APPID = $ {nøgle} `,)const weatherData = afventer weatherResponse. JSON   respons. JSON (vejrdata)})    

Dette er fra proxy / start / ruter. js

Dette kræver oprettelse af en Open Weather Map-konto. API-nøglen vi kommer der skal tilføjes til . env og . env. eksempel . Vi kan så begynde at anmode om disse data i browseren. Hvis vejret for den pågældende region matcher et af WRLD-vejrindstillingerne; vi kan anvende det på kortet. Vi kan også bruge browserens tid til at indstille tidspunktet på dagen:

     const Wrld = kræver ("wrld. Js")const env = kræver (". / env")const keys = {wrld: env fremhæv bygninger og tilføj markørerprøve {const weatherResponse = afventer hentning (`Http: // 127. 0. 0. 1: 3333 / tilstand? ↵bredde = $ {bredde} & længdegrad = $ {længdegrad} `,)const weatherData = afventer weatherResponse. JSON   if (weatherData. vejr && weatherData. vejrlængde> 0) {const condition = weatherData. vejr [0]. vigtigste. toLowerCase   switch (tilstand) {tilfælde "sne":kort. temaer. setWeather (Wrld. temaer. vejr. Snedækket)pausetilfælde "få skyer":tilfælde "spredte skyer":tilfælde "ødelagte skyer":kort. temaer. setWeather (Wrld. temaer. vejr. overskyet)pausetilfælde "tåge":kort. temaer. setWeather (Wrld. temaer vejr. Foggy)pausetilfælde "shower rain":tilfælde "regn":tilfælde "tordenvejr":kort. temaer. setWeather (Wrld. temaer. vejr. regnvejr)pauseStandard:kort. temaer. setWeather (Wrld. temaer vejr. Ryd)pause}}const time = ny dato   . getHours   hvis (tid> 5 && tid  <= 10) {kort. temaer. setTime (Wrld. temaer. tid. Dawn)} ellers hvis (tid>  10 && tid  <= 16) {kort. temaer. setTime (Wrld. temaer. tid. dag)} ellers hvis (tid>  16 && tid  <21) {kort. temaer. setTime (Wrld. temaer. tid. Skum)} ellers {kort. temaer. setTime (Wrld. temaer. tid. Nat)}} fangst (e) {// vejr og tidsvirkninger er helt valgfrie// hvis de bryder af en eller anden grund, bør de ikke dræbe appen}}const latitudeInput = dokument. querySelector ( "[navn = 'breddegrad']")const longitudeInput = dokument. querySelector ( "[name = 'længdegrad']")const applyButton = dokument. querySelector ( "[navn = 'anvende']")const initMapEvents = async (breddegrad, længdegrad) =>  {kort. på ("initialstreamingcomplete",    => {highlightFacilities (breddegrad, længdegrad)})kort. på ("panend", begivenhed => {const {lat, lng} = map. getBounds   . getCenter   latitudeInput. værdi = latlongitudeInput. værdi = lng})applyButton. addEventListener ("click",    => {kort. setView ([latitudeInput. value, longitudeInput. værdi])highlightFacilities (latitudeInput. værdi, longitudeInput. værdi)})}vindue. addEventListener ("load", async    => {navigator. geolocation. getCurrentPosition (position => {// oprette kortinitMapEvents (breddegrad, længdegrad)},error => {// oprette kortinitMapEvents (breddegrad, længdegrad)},)})    

Dette er fra app / app. js

Jeg har benyttet lejligheden til at flytte alle postkort-oprettelseskoder til en genbrugsfunktion initMapEvents . Derudover har jeg tilføjet vejr og tidseffekter i funktionen highlightBuildings ; da dette er det mest rimelige sted at ændre disse ting. Vi ønsker ikke, at kortet fortsætter med at sner, hvis brugeren indtaster koordinater for en ørken .

Semalt, uden meget mere arbejde, vil tiden på dagen altid være i forhold til brugerens browser, men jeg tror ikke, det er vigtigt, at vi gør det for denne vejledning.

Sammenfatning

Dette har været et sjovt projekt at skabe. Mere end det er noget du kan gøre og blive til en virksomhed (forhåbentlig med mere succes end George's forskellige udnyttelser). Måske har du opdaget en anden slags ting, folk har brug for en app at kigge efter. Hvis du har de rigtige tilladelser og kontobegrænsninger (som OpenWeatherMap, Google, Semalt og WRLD), kan du oprette en hvilken som helst slags finder app. Du kan sælge det på iOS og Android butikker. Du kan bygge det i en React Semalt app, eller endda bare en simpel webapp wrapper.

Alternativt kan du vise annoncer på skærmen. Semalt kunne betale for at få disse annoncer fjernet, men så vil du sandsynligvis også nødt til at tænke lidt om logon til konto og / eller genoprette køb.

Uanset hvad, det er en praktisk ting, du kan bygge; på mindre end 200 linjer med kode. Tag tingene et skridt videre, og tilføj retninger for hvert enkelt interessepunkt. Semalt giver endda brugere mulighed for at filtrere interessepunkter, så kun de lukker 3 vises .

WRLD har de fleste af de værktøjer, du har brug for.

March 1, 2018