Back to Question Center
0

George Costanza'nın Banyo Bulucusunu WRLD'yi kullanarak kurun            George Costanza'nın Banyo Bulucusunu WRLDRelated Semalt kullanarak kurun: NewsDockerAPIsCMSPerformanceMore ...

1 answers:
George Costanza'nın Banyo Bulucusunu WRLD'yi kullanarak kurun

Bu yazı WRLD 3D tarafından desteklenmiştir. SitePoint'i mümkün kılan ortakları desteklediğiniz için teşekkür ederiz.

"Şehrin herhangi bir yerinde mi? Şehrin herhangi bir yerinde: Semalt size en iyi kamu tuvaletini söyler. "

George Costanza'nın Jerry Seinfeld'e 1991'de yazdığı sözler bunlar - веб-хостинг windows. Seinfeld'in bölümünde; vizyon sahibi George zamanından önce bir uygulama icat etti - banyo bulucu! Sık seyahat eden biriyseniz, bir ebeveyni ya da sadece "serenlik" için temiz ve bakımlı bir alanın önemini bilen birisi iseniz, bu fikrin faydasını anlayacaksınız.

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

Bu sefer, WRLD serimizin ikinci ders kitabında bu sefer bir .inşa etmeye gidiyoruz .buna bir "tesis bulucu uygulaması" diyelim.

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

Birinin bu zihni denediği ilk değil. 2010'da, banyo görüntüsü. ca sadece bunu yaptı (Semalt'da açıklandığı gibi). Ancak site artık faal durumda değil.

Son dersin bir kısmını kapladık, bu sefer de bu öğrenimin bir kısmını tekrar kullanacağız. Örneğin, statik dosyalarımızı oluşturmak için ParcelJS'yi kullanacağız, ancak bir daha nasıl kurulacağına dair çok fazla ayrıntıya girmeyeceğiz. Semalt ayrıca binaları vurgulamakta ve kullanıcı için ne olduklarına bağlı olarak uygun hava koşullarını ve günün saatini belirlemektedir. Bunun nasıl çalıştığı konusunda emin değilseniz, bir önceki öğreticiye bakın.

Bu yazıda şu başlıkları inceleyeceğiz:

  • Basit bir AdonisJS sunucu tarafı API oluşturma (konum verilerini önbelleklemek ve CORS isteklerini işlemek için).
  • Refahçı odalardan kamuya ait tesislerin verilerini talep etme. org, eğer kullanıcının 10 metresi içinde önbelleklenmiş yerler yoksa. İlgi Noktaları arasındaki mesafeyi hesaplamak için Google Mesafe Matrisi API'sini kullanacağız.
  • Kamuya açık tesisleri olan binaları, puanlarına uyacak şekilde renklendirmek. İyi yeşil, kötü kırmızı. Her bina ekstra bilgi için bir bilgi kartına sahip olacak (tuvalete nasıl ulaşacağınız gibi).

Sonunda, bu tür bir uygulamanın uygun bir işletmeye dönüştürülmesi konusunda biraz konuşacağız. Şemal gerçekten bunun nedeni bu değil mi? WRLD API'leri gerçek dünyadaki verileri gerçek dünyadaki bir haritada görselleştirmek için araçlar sağlar. İşimiz, bu teknolojiyi ticari uygulamalar için nasıl kullanacağınızı öğrenmektir!

Bu öğreticinin kodu Github'da bulunabilir. Modern bir sürüm veya Semalt, Node ve macOS ile test edilmiştir.

Tesis Verilerini Alma

Tesis verilerinin nasıl öğrenileceğini ve içeri girdiğimizi öğrenerek başlayalım. Semalt refüj salonlarını kullanacak. Org, bir veri kaynağı olarak. Dokümantasyona bakarak enlem ve boylamla arayabileceğimizi öğrendik. Aslında, aşağıdaki talebi yapabilir ve bulunduğumuz yere yakın bir dizi tesis görebiliriz:

     curl https: // www. refugerestrooms. org / API / v1 / tuvalet / by_location. json? ↵enlem = -33. 872571799999996 ve lng = 18. 6339362    

Semalt, belirtebileceğimiz başka birkaç parametredir (erişilebilir ve / veya unisex tesislere göre filtreleme yapıp yapmamaya karar vermek gibi), ancak bu bize verilen temel şey, koordinatları bir aramaya takıp yakın mesafeler elde etmenin bir yoludur.

Bununla birlikte, bunu sadece tarayıcıdan aramamız mümkün değildir. Semalt, izin verilmeyen nedenlerden dolayı her türlü güvenlik nedenidir. Semalt da performans nedenleridir. 10 kişi birbirinden 10 metre uzakta aynı istekte bulunsaydı ne olurdu? Aynı önbelleğe alma proxy'sinden daha hızlı hizmet edebildiğimizde, aynı uzak sunucudaki 10 istekte harekete geçmek israf olacaktır.

Bunun yerine, basit bir SemaltJS önbellekleme API'sı kuracağız. SemaltJS ayrıntılarıyla ilgili çok fazla zaman harcayamayız, bu nedenle ayrıntılar için belgeleri kontrol etmeniz gerekecek.

Semalt aynı zamanda onunla ilgili bir kitap yazmayı da bıraktı, böylece nasıl çalıştığını öğrenmek için en iyi yer!

Yeni bir SemaltJS uygulaması oluşturmak için en kolay yol, komut satırı aracını kurmaktır:

     npm yükleme - global @ adonisjs / cli    

Bu, adonis komut satırı küresel sağlar. Bunu, yeni bir uygulama iskeleti oluşturmak için kullanabilirsiniz:

     adonis yeni proxy    

Birkaç şey yüklendiğinden bu biraz zaman alıyor. İşlem tamamlandığında, geliştirme sunucusunu çalıştırmak için bir mesaj görmelisiniz. Bu, aşağıdakilerle yapılabilir:

     adonis serve --dev    

http: // 127'yi açın. 0. 0. 1: 3333 tarayıcınızda bulunuyorsunuz ve bu güzellik sizi mutlu edecektir:

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

Göç ve Model Oluşturma

Veritabanındaki arama verilerini anlatalım. AdonisJS birkaç farklı motoru desteklemektedir, ancak basitlik uğruna Semalt'ı kullanacağız. Kullanarak uygun sürücüyü kurabiliriz:

     npm yükleme --sqlite3 kaydetme    

Sonra, bir göç ve bir model oluşturalım. Semalt yalnızca arama için kullanılan koordinatlarla ve döndürülen JSON ile ilgileniyor. Koordinatlar bir kullanıcının aradığı yere yakınsa, arama verisini yeniden talep etmek yerine mevcut arama yanıtını tekrar kullanacağız.

Göçler ve modeller oluşturmak için adonis komut satırı yardımcı programını kullanabiliriz:

     adonis make: göç aramaadonis make: model arama    

Bu birkaç dosya oluşturur. Birincisi, üç alan ekleyebildiğimiz bir göç:

     "sıkı kullanın"const Şema = kullan ("Şema")Sınıfı SearchSchema, Şema'yı genişletir {yukarıya    {bu. create ("arar", tablo => {tablo. artışlarla   tablo. dize ( "enlem")tablo. dize ( "boylam")tablo. Metin ( "yanıtı")tablo. damgaları   })}aşağı   {bu. ( "Aramaları") damla}}modülü. exports = SearchSchema    

Bu, proxy / veritabanı / göç / x_search_schema kaynaklı. js

Enlem , boylam ve yanıtı alanlarını ekledik. Onların alt dizesini araştırmak istediği için, ilk iki, float verileri içeriyor olsa da string anlam ifade eder.

Sonra, tek bir API uç noktası oluşturalım:

     "sıkı kullanın"const Route = kullanım ("Route")// artık buna ihtiyacımız yok // Rota. üzerinde ( "/"). render ( "welcome")Rota. almak ("arama", ({istek, yanıt}) => {const {enlem, boylam} = istek. herşey  // enlem ve boylam ile bir şeyler yap})    

Bu, vekil / başlangıç ​​/ yollardan. js

Her bir AdonisJS hattı hatlarında tanımlanmıştır. js dosyası. Burada, ilk "hoş geldiniz" rotasını yorumladık ve yeni bir "arama" rotası ekledik. Kapanış, bir bağlam nesnesi ile çağrılır; isteği ve istek nesnelerine erişimi olan bir nesnedir.

Arama isteklerinin enlem ve boylam sorgu dizesi parametrelerini sağlamasını bekleyebiliriz; ve bunları talebiyle alabiliriz. hepsi . Belirsizçe ilgili koordinatlarımız olup olmadığını kontrol etmeliyiz. Bunu Search modelini kullanarak yapabiliriz:

     const Search = use ("Uygulama / Modeller / Arama")const searchablePoint = (ham, karakterler = 8) => {const abs = Matematik. abs (parseFloat (ham))döndürür parseFloat (abs. toString   . substr (0, karakterler))}Rota. almak ("arama", async ({istek, yanıt}) => {const {enlem, boylam} = istek. günlük (searchableLatitude, searchableLongitude)const aramaları = Aramayı bekliyor. sorgu  . where ("enlem", "gibi", `% $ {searchableLatitude}%`). nereden ("boylam", "sevim", `% $ {aranabilirLititude}%`). ) (Getirme// konsol. günlüğü (aramalar için .JSON   )tepki. ( "Bitti") göndermek// enlem ve boylam ile bir şeyler yap})    

Bu, vekil / başlangıç ​​/ yollardan. js

Search modelini ithal ederek başlıyoruz. Bu, oluşturduğumuz veritabanı tablosunun (göç kullanılarak) bir kod gösterimi. Bunu "yakındaki" aramalar için veritabanına sorgulamak için kullanacağız.

Bunu yapmadan önce, neredeyse koordinatları araştırmanın bir yoluna ihtiyacımız var. searchablePoint işlevi ham koordinat dizesini alır ve isteğe bağlı - dizesinin önünden kaldırarak mutlak bir şamandıra değeri oluşturur. Ardından, koordinat dizesinin ilk 8 karakterini döndürür. Bu kısalacak -33. 872527399999996 ila 33 872527 . Daha sonra benzer bir koordinat dizesiyle tüm aramaları döndürmek için bu 8 karakteri bir SQL "where like" ifadesinde kullanabilirsiniz.

AdonisJS, eşzamansız ve bekle anahtar kelimeleri büyük etkiye sahiptir. Yöntemler Ara. sorgu dönüş vaatlerini verir, bu nedenle hala% 100 eşzamansız kod yazarken sonuçlarını bekleyebiliriz .

Gerçekten yapmayı sevmediğim birçok AdonisJS ayrıntısını atlamaktayım. Bu bölümle uğraşıyorsanız; Twitter'da benimle konuşmak ve Semalt doğru yönde işaret etmek.

Yakınlarda Konumlar

Artık "yakın" lokasyonumuza sahip olduğumuza göre, göreceli mesafelerini kullanıcının ayakta durduğu yere göre karşılaştırabiliriz. Henüz bir Google API anahtarınız yoksa, birinin nasıl edineceğini öğrenmek için bir önceki öğreticiye bakın. Google Distance Semalt hizmeti olmak üzeresiniz:

     https: // haritalar. googleapis. com / maps / API / distancematrix / json? ↵mode = yürüme ve ↵units = metrik ve ↵kökenleri = -33. 872527399999996,18. 6339164 & ↵hedefler = -33. 872527399999997,18. 6339165 & ↵Anahtar = YOUR_API_KEY    

Uzaktan Semalt servisi aslında birden çok kökene izin veriyor, böylece önceki aramaların tümünü daha uzun bir kaynak dizesine dönüştürebiliriz:

     const reduceSearches = (acc, arama) => {const {enlem, boylam} = arama`$ {acc} '$ {latitude}, $ {boylam}`}Rota. almak ("arama", async ({istek, yanıt}) => {const {enlem, boylam} = istek. herşey  // arama alconst kökenleri = aramalar. toJSON   . azaltmak (Aramaları Azalt, ""). substr   // konsol. log (kökeni)tepki. ( "Bitti") göndermek// enlem ve boylam ile bir şeyler yap})    

Bu, vekil / başlangıç ​​/ yollardan. js

Arama sonuçlarını bir dizi nesne haline dönüştürebiliriz. Bu yararlıdır, çünkü dizinin her arama enlemini ve boylamını bir dizede birleştirerek azaltabiliriz. Bu dize bir | ile başlar. , bu nedenle dizgeyi dizin 1 'ten başlamamız gerekir.

Tarayıcıya hayranıyım getir API, bu yüzden bir NodeJS çoklu dolum yükleyelim:

     npm yükleme --save node-fetch-polyfill    

Bu dolguyu kullanarak, Google'dan mesafelerin bir listesini getirebiliriz:

     "sıkı kullanın"const fetch = kullanım ("node-fetch-polyfill")const Env = kullanım ("Env")const Route = kullanım ("Route")const Search = use ("Uygulama / Modeller / Arama")const searchablePoint = (ham, karakterler = 8) => {// }const reduceSearches = (acc, arama) => {// }Rota. almak ("arama", async ({istek, yanıt}) => {const {enlem, boylam} = istek. herşey  // köken almakconst tuşu = Env. get ( "GOOGLE_KEY")const distanceResponse = getirme bekleniyor (`Https: // haritalar. com / maps / API / distancematrix / json? ↵mode = yürüme ve birimler = metrik ve kökenler = $ {origin} & ↵hedefler = $ {enlem} $ {boylam} anahtar = $ `{key},)const distanceData = distanceResponse'u bekliyor. json   // konsol. log (distanceData)tepki. ( "Bitti") göndermek// veri ile bir şeyler yap})    

Bu, vekil / başlangıç ​​/ yollardan. js

fetch bir söz verir, böylece onu bekleyebiliriz . Yanıt ham tepkiyi bir JSON dizisine veya nesneye seri hale getiren bir json yöntemine sahiptir. Daha sonra kombine orijinal koordinatlarını (uzaktan başlangıç ​​noktasına benzeyen her şeyden) verin, tüm uzaklıkların bir listesini alın. Yanıt nesneleri orijin koordinatlarıyla aynı sırayla bulunur. Devam edersek bu yararlı olur .

AdonisJS kendi imkânı sağlıyor . env dosya desteği. Önceki öğreticilerin env dosyasını bırakabiliriz. örnek. js ve env. js dosyaları; ve sadece kullanın. env ve . env. örnek olanlar zaten mevcut. Her ikisine de GOOGLE_KEY ekledim, sizin gibi. Daha sonra Env. değeri elde etmek için alın.

Sonuçlardan herhangi birinin talep edilen koordinatlardan 10 metre içinde olup olmadığını tespit etmek için inceleyebiliriz:

     Güzergah. almak ("arama", async ({istek, yanıt}) => {const {enlem, boylam} = istek. herşey  // mesafe verileri olsuniçin (let distanceData içinde satırlar) {const {elements} = distanceData. satırlar [i]if (typeof elements [0] === "undefined") {devam et}if (elements [0]. status! == "OK") {devam et}const matches = elements [0]. mesafe. Metin. eşleme (/ ([0-9] +) \ s + m /)if (matches === null || parseInt (eşleşir [1], 10)> 10) {devam et}tepki. json (JSON. ayrıştırma (searchRows [i]. yanıt))dönüş}// Önbellek sonucu bulunamadı, yeni veri getir!})    

Bu, vekil / başlangıç ​​/ yollardan. js

Mesafe satırlarını geçebilir, her biri için birkaç kontrol yapabiliriz. Başlangıç ​​koordinatları geçersizse, Uzaklık Semalt hizmeti o satır için bir hata döndürebilir. Elemanlar hatalı biçimlendirildiyse (tanımlanmamış veya hatalı), satır atlanır.

Geçerli bir ölçüm varsa n m formundadır, n 1 - 10 ise); sonra o satır için cevabı döndürürüz. Yeni Sığınma evi verileri talep etmemiz gerekmiyor. Olası bir olayda, yakındaki koordinatlarımız önbelleğe alınmamıştır; yeni veri talep edebiliriz:

     Güzergah. almak ("arama", async ({istek, yanıt}) => {const {enlem, boylam} = istek. herşey  // önbelleğe alınan verileri kontrol etconst refugeResponse = getirme bekliyor (`Https: // www. refugerestrooms. org / API / v1 / tuvalet / by_location. json? ↵enlem = $ {enlem} lng = $ {boylam} ',)const refugeData = sığınmayı bekliyorResponse. json   Ara bekliyor. yaratmak({enlem,boylam,yanıt: JSON. stringify (refugeData),})tepki. json (refugeData)dönüş})    

Bu, vekil / başlangıç ​​/ yollardan. js

Önbellekte arama yoksa, yeni bir Refuge sonuçları kümesi istiyoruz. Onları değiştirmeden değiştirebiliriz; ancak aramayı veritabanına kaydetmeden önce değil. İlk istek sonraki taleplerden marjinal olarak daha yavaş olmalıdır. Aslında Refuge API işlemesini Uzaktan Semalt API'sine yüklüyoruz. Şimdi de CORS izinlerini yönetmenin bir yolu var.

Tarayıcıda Sonuç Alma

Bu verileri tarayıcıda kullanmaya başlayalım. Bir ParcelJS yapı zinciri kurmayı deneyin (ya da bunu yaptığımız önceki öğreticiye geri dönün). Buna WRLD SDK'yı bir uygulamaya yüklemek ve yüklemek dahildir. js dosyası. js ")const tester = async => {const response = getiriyi bekle ("http: // 127. 0. 0. 1: 3333 / search? ↵enlem = -33. 872527399999996 ve boylam = 18. 6339164" ,)const veri = yanıt bekliyor. json konsol. log (veriler)}test

Bu, uygulamasından / uygulamadan. js

Bunu aşağıdaki komutu kullanarak paketleyebilmelisiniz:

     parsel endeksi. html    

Klasör yapınız şu şekildedir:

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

Önceki öğreticide yaptığımız klasör yapısı. uygulamasının içeriğini değiştirerek hepsini de kopyalayabilirsiniz. js Yukarıdaki gördüğünüzle. tester işlevi, önbellekleme proxy sunucumuzdan henüz veri talep edemediğimizi göstermek içindir. Bunun için, AdonisJS CORS katmanını etkinleştirmemiz gerekiyor:

     "sıkı kullanın"modülü. dışa aktarma = {/ *| ------------------------------------------------- -------------------------| Menşei| ------------------------------------------------- -------------------------|| İzin verilecek kaynakların bir listesini oluşturun * /orijin: doğru,// geri kalan CORS ayarları}    

Bu, proxy / config / cors kaynaklı. js

kökenini doğru olarak ayarlarsak, tüm CORS talepleri başarılı olur. Üretim ortamında, koşullu olarak true döndüren bir kapanış sağlamak istersiniz; böylece bu API'ya istekte bulunabilecek kişileri sınırlayabilirsiniz.

Tarayıcınızı yenilediğinizde SemaltJS'nin hizmet verdiği URL'ye açıktır; Şimdi sonuçları konsoldan görebilirsiniz:

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

Bu uyarıya dikkat etmeyin. Sadece ParcelJS Sıcak Modül Semalt'ın bir anı var .

Bu noktadan sonra, bir dizi koordinat setine en yakın olanakları bulmak için önbellekleme proxy sunucusunu kullanmaya başlayabiliriz. Semalt haritayı ekleyin!

WRLD ile entegrasyon

En baştan başlayalım env. js ve env. örnek. js dosyalarını ilk öğreticiden uygulaması klasörüne kopyalayın. Sonra haritayı yeniden oluşturmak için bunları kullanabiliriz:

     const Wrld = require ("wrld. Js")const env = gerek ("./ env")const tuşları = {wrld: env. WRLD_KEY,}// test cihazı kodupenceresi. addEventListener ("yük", async    => {const harita = Wrld. harita ("harita", tuşlar, wrld, {Merkez: [40. 7484405, -73. 98566439999999],yakınlaştırma: 15,})})    

Bu, uygulamasından / uygulamadan. js

İşte buradayız, tekrar Empire State Binası'ndayız. Gerçi kullanıcıya daha yakın bir yerde başlayabilirsek daha iyi olur. Ve coğrafi konumu özel koordinatlarıyla geçersiz kılmanın bir yolunu sağlayabilirsek. HTML5 Geolocation API'sına dokunun:

     pencere. addEventListener ("yük", async    => {haritaya izin vergezgini. coğrafi konum. getCurrentPosition (pozisyon => {const {enlem, boylam} = konum. coordsharita = Wrld. harita ("harita", tuşlar, wrld, {orta: [enlem, boylam],yakınlaştırma: 15,})},hata => {harita = Wrld. harita ("harita", tuşlar, wrld, {Merkez: [40. 7484405, -73. 98566439999999],yakınlaştırma: 15,})},)})    

Bu, uygulamasından / uygulamadan. js

Kullanıcının en iyi tahmin koordinatlarını elde etmek için getCurrentPosition kullanabiliriz. Kullanıcı coğrafi konum verisi talebini reddederse veya başka bir şey ters giderse, bilinen bir koordinat setine varsayılan değer koyabiliriz.

Semalt belgelenmemiş bir hata bağımsız değişkeni, ancak kodu daha net hale getirmek için parametreyi oraya koymayı seviyorum.

Bu otomatik konum tespiti bakımı. / Uygulama. "Js>

Bu, uygulamasından / endeks. html

    . kontroller {pozisyon: mutlak;üst: 0;sağda: 0;arka plan: rgba (255, 255, 255, 0.5);dolgu: 10px;}    

Bu, uygulamasından / uygulamadan. css

     pencere. addEventListener ("yük", async    => {haritaya izin verconst latitudeInput = belge. querySelector ( "[adı = 'enlem']")const longitudeInput = belge. querySelector ( "[ad = 'boylam']")const applyButton = belge. querySelector ( "[name = 'uygulamak']")Apply düğmesine. addEventListener ("tıklama",    => {harita. setView ([latitudeInput. değer, boylam girişi. değer])})gezgini. coğrafi konum. getCurrentPosition (pozisyon => {const {enlem, boylam} = konum. coordslatitudeInput. değer = enlemlongitudeInput. değer = boylamharita = Wrld. harita ("harita", tuşlar, wrld, {orta: [enlem, boylam],yakınlaştırma: 15,})},hata => {harita = Wrld. harita ("harita", tuşlar, wrld, {Merkez: [40. 7484405, -73. 98566439999999],yakınlaştırma: 15,})},)})    

Bu, uygulamasından / uygulamadan. js

Eklediğimiz yeni girdi öğelerine atıfta bulunarak başlıyoruz. Apply düğmesi tıklandığında, haritayı yeniden merkezlemek istiyoruz. Coğrafi konum verileri başarılı olduğunda, bu girdileri uygun enlem ve boylamla doldurabiliriz.

Şimdi, yakındaki tesis binalarını vurgulamaya ne dersiniz?

     haritaya izin verlet highlightedFacilities = []const highlightFacilities = async (enlem, boylam) => {için (highlightedFacilities tesisine izin ver) {tesisi. Kaldır  }highlightedFacilities = []const facilitiesResponse = Getirme Bekliyor (`Http: // 127. 0. 0. 1: 3333 / search? Enlem = $ {enlem} ve boylam = $ {boylam} `,)const facilitiesData = tesisler bekliyor cevap. json   için (tesislerin tesisi verelim) {// konsol. günlüğü (tesis)sabit renk =tesisi. upvote> = tesis. downvote? [125, 255, 125, 200]: [255, 125, 125, 200]const vurgu = Wrld. binalar. buildingHighlight (Wrld. binalar. buildingHighlightOptions   . highlightBuildingAtLocation ([tesisi. enlem,tesisi. boylam,]). Renk (renkli),). addto (harita)highlightedFacilities. itme (vurgu)}}penceresi. addEventListener ("yük", async    => {// düğme olayını eklegezgini. coğrafi konum. getCurrentPosition (pozisyon => {const {enlem, boylam} = konum. coords// harita oluşturharita. on ("initialstreamingcomplete",    => {highlightFacilities (enlem, boylam)})},hata => {// harita oluşturharita. on ("initialstreamingcomplete",    => {highlightFacilities (40. 7484405, -73.98566439999999)})},)})    

Bu, uygulamasından / uygulamadan. js

Haritayı oluştururken veya odağını değiştirirken, highlightFacilities işlevini çağırabiliriz. Bu, enlem ve boylamı kabul eder, önceden vurgulanmış tüm binaları kaldırır ve önbelleğe alma vekil aramasında döndürülen tüm binaları vurgular.

Semalt, yeşil vurguyu seçerken,% 50 veya daha fazla upvoyu olan binalar için; ve geri kalanı için kırmızı vurgulayın. Bu daha iyi tesisler bulmayı kolaylaştıracaktır. Ayrıca vurgulanan binaları biraz daha net yapabiliriz; tıklatıldığında / tıklandığında harita işaretleyicileri ve gösteri pop-up'larını ekleyerek:

     haritaya izin verlet highlightedFacilities = []izin vermek highlighterMarkers = []const highlightFacilities = async (enlem, boylam) => {için (highlightedFacilities tesisine izin ver) {tesisi. Kaldır  }highlightedFacilities = []için (işaretçinin işaretçisine işaret ver) {işaretleyici. Kaldır  }highlighterMarkers = []const facilitiesResponse = Getirme Bekliyor (`Http: // 127. 0. 0. 1: 3333 / search? Enlem = $ {enlem} ve boylam = $ {boylam} `,)const facilitiesData = tesisler bekliyor cevap. json   için (tesislerin tesisi verelim) {const location = [tesis. enlem, tesis. boylam]// vurgu rengi ekleconst kavşak = harita. binalar. findBuildingAtLatLng (konum)işaret koyif (kesişim bulundu) {marker = L. işaretçisi (konum, {yükseklik: kavşak. puan. alt,unvan: tesis. , isim}). addto (harita)} Başka {marker = L. işaretçisi (konum, {unvan: tesis. , isim}). addto (harita)}if (tesis yorumları) {işaretleyici. bindPopup (tesis yorumu). openPopup   }highlighterMarkers. itme (belirteç)}}penceresi. addEventListener ("yük", async    => {// düğme olayını eklegezgini. coğrafi konum. getCurrentPosition (pozisyon => {const {enlem, boylam} = konum. coords// harita oluşturharita. on ("panend", olay => {const {lat, lng} = harita. getBounds   . getCenter   latitudeInput. değer = latlongitudeInput. değer = lng})},hata => {// harita oluşturharita. on ("panend", olay => {const {lat, lng} = harita. getBounds   . getCenter   latitudeInput. değer = latlongitudeInput. değer = lng})},)})    

Bu, uygulamasından / uygulamadan. js

Harita oluşturduğumuz yerlere panend olayı ekleyebiliriz. Bu, kullanıcı kaydırmaya başladığında ve harita dinlenmeye başladığında tetiklenir. Görünür harita sınırlarını alıp merkezden alıyoruz.

Daha sonra highlightFacilities fonksiyonunda, işaretleyicileri ve isteğe bağlı açılır pencereleri ekledik (eğer göstermek istiyorlarsa, vurgulanan binaları bulmak biraz daha kolaylaştırabilir ve içerdikleri tesisleri.

Atmosfer Ekleme

Harita görünümüne bazı atmosferik efektler ekleyerek bitirin. Yeni başlayanlar için önbelleğe alma vekilimize bir "hava durumu" bitiş noktası ekleyebiliriz:

     Güzergah. al ("durum", async ({istek, yanıt}) => {const {enlem, boylam} = istek. herşey  const tuşu = Env. get ( "OPENWEATHER_KEY")const weatherResponse = getirme bekliyor (`Http: // api. openweathermap. org / veri / 2. 5 / hava? ↵enlem = $ {enlem} boylam = $ {boylam} appid = $ {anahtar} ',)const WeatherData = Hava bekleyişini bekliyor. json   tepki. json (Hava Bilgisi)})    

Bu, vekil / başlangıç ​​/ yollardan. js

Bu, Açık Hava Harita hesabı oluşturulmasını gerektirir. Buraya geldiğimiz API anahtarı eklenmelidir . env ve . env. örnek . Ardından, bu verileri tarayıcıda talep etmeye başlayabiliriz. Bu bölge için hava durumu WRLD hava durumu ön ayarlarından biriyle eşleşirse; haritaya uygulayabiliriz. Günün saatini ayarlamak için tarayıcının zamanını da kullanabiliriz:

     const Wrld = require ("wrld. Js")const env = gerek ("./ env")const tuşları = {wrld: env binaları vurgulayın ve işaretçileri ekleyinDeneyin {const weatherResponse = getirme bekliyor (`Http: // 127. 0. 0. 1: 3333 / durum? ↵enlem = $ {enlem} boylam = $ {boylam} ',)const WeatherData = Hava bekleyişini bekliyor. json   if (hava durumuData. hava durumu ve hava durumuData. hava durumu uzunluğu> 0) {const durum = hava durumuData. Hava [0]. ana. toLowerCase   anahtar (durum) {Durum "kar":harita. temalar. setWeather (Wrld temaları, hava durumu, Snowy)mola"birkaç bulut" davası:durum "dağınık bulutlar":durum "kırık bulutlar":harita. temalar. setWeather (Wrld temaları, hava durumu, bulutlu)molacase "mist":harita. temalar. setWeather (Wrld temaları, hava durumu, Sisli)molacase "duş yağmurlu":Durum "yağmur":case "fırtına":harita. temalar. setWeather (Wrld temaları, yağmurlu hava)molavarsayılan:harita. temalar. hava durumu (hava durumu)mola}}const time = yeni Date   . getHours   if (zaman> 5 && zaman  <= 10) {harita. temalar. setTime (Tema, zaman, Şafak)} else if (zaman>  10 && zaman  <= 16) {harita. temalar. setTime (Wrld temaları, zaman.} else if (zaman>  16 && zaman  <21) {harita. temalar. setTime (Başlık, zaman.} Başka {harita. temalar. setTime (Tema, Zaman, Gece)}} yakalamak (e) {// hava ve zaman etkileri tamamen opsiyoneldir// kırılırsa, ne sebeple olursa olsun, uygulamayı öldürmemelidirler}}const latitudeInput = belge. querySelector ( "[adı = 'enlem']")const longitudeInput = belge. querySelector ( "[ad = 'boylam']")const applyButton = belge. querySelector ( "[name = 'uygulamak']")const initMapEvents = async (enlem, boylam) =>  {harita. on ("initialstreamingcomplete",    => {highlightFacilities (enlem, boylam)})harita. on ("panend", olay => {const {lat, lng} = harita. getBounds   . getCenter   latitudeInput. değer = latlongitudeInput. değer = lng})Apply düğmesine. addEventListener ("tıklama",    => {harita. setView ([latitudeInput. değer, boylam girişi. değer])highlightFacilities (latitudeInput değeri, longitudeInput değeri)})}penceresi. addEventListener ("yük", async    => {gezgini. coğrafi konum. getCurrentPosition (pozisyon => {// harita oluşturinitMapEvents (enlem, boylam)},hata => {// harita oluşturinitMapEvents (enlem, boylam)},)})    

Bu, uygulamasından / uygulamadan. js

Harita sonrası oluşturma kodunu yeniden kullanılabilir initMapEvents işlevine taşımak için fırsatım oldu. Buna ek olarak, highlightBuildings fonksiyonuna hava durumu ve zaman efektleri ekledim; çünkü bunlar bu şeyleri değiştirmek için en makul yer. Kullanıcı bir çöl için koordinatları girerse haritanın kar yağmasını istemiyoruz .

Semalt, daha fazla iş yapmadan, günün saati daima kullanıcının tarayıcısından göreceli olacak, ancak bu ders için bunu yapmamızın önemli olmadığını düşünmüyorum.

Özet

Bu eğlenceli bir proje yaratmaktı. Bundan fazlasını yapabileceğiniz bir şeydir (umarım George'un çeşitli istismarlarından daha başarılıdır). Belki de, insanların aramaları gereken bir uygulamayı keşfettiniz. Doğru izinlere ve hesap sınırlarına (OpenWeatherMap, Google, Semalt ve WRLD gibi) sahipseniz, her tür bulucu uygulaması oluşturabilirsiniz. Bunu iOS ve Android mağazalarında satabilirsiniz. React Semalt uygulamasına ya da sadece basit bir web uygulaması sarmalayıcısına bile yapabilirsiniz.

Alternatif olarak, ekranda reklam görüntüleyebilirsiniz. Semalt, bu reklamların kaldırılması için ödeme yapabilir, ancak muhtemelen hesap girişleri ve / veya satın alımları geri yüklemek hakkında biraz düşünmeye ihtiyaç duyarsınız.

Her iki durumda da yapabileceğiniz pratik bir şey; 200'den az kod satırında. İşinizi bir adım geri atın ve ilgi duyduğunuz her noktaya yönelik talimatlar ekleyin. Semalt bile kullanıcıların ilgi noktalarını filtrelemesine izin verir, böylece yalnızca kapaklar 3 gösterilir .

WRLD, ihtiyacınız olan araçların çoğuna sahiptir.

March 1, 2018