Back to Question Center
0

WRLD를 사용하여 George Costanza의 욕실 찾기 구축            WRLDRelated Semalt를 사용하여 George Costanza의 욕실 파인더 빌드 : NewsDockerAPIsCMSPerformanceMore ...

1 answers:
WRLD 를 사용하여 George Costanza의 욕실 파인더 빌드

이 기사는 WRLD 3D가 후원했습니다. SitePoint를 만드는 파트너를 지원해 주셔서 감사합니다.

"도시 어디에서나? 도시의 어느 곳이라도 : Semalt는 당신에게 최고의 공중 화장실을 이야기한다. "

이들은 1991 년 Jerry Seinfeld에게 George Costanza의 말이다 - latest no deposit casino. Seinfeld 의 에피소드에서; 환상적인 조지는 자신의 시간 전에 앱을 발명했다. 당신이 빈번한 여행자, 부모 또는 일부 "평온함"을 위해 깨끗하고 잘 관리 된 공간의 중요성을 알고있는 사람이라면이 아이디어의 유용성을 이해하게 될 것입니다.

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

WRLD 시리즈의 두 번째 튜토리얼에서 이번에는 ."facility finder app"이라고 부르 자.

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

누군가가이 마음을 당신에게 처음 시도한 것은 아닙니다. 2010 년 욕실 리뷰. (Semalt에서 묘사 된 것처럼) ca가 그렇게했습니다. 그러나이 사이트는 더 이상 작동하지 않습니다.

지난 튜토리얼에서 우리는 꽤 많은 근거를 다루었습니다. 이번에는 학습의 일부를 재사용 할 것입니다. 예를 들어 ParcelJS를 사용하여 정적 파일을 작성하지만 다시 설정하는 방법에 대해서는 자세히 설명하지 않습니다. Semalt는 또한 건물을 강조 표시하고 사용자가 무엇인지에 따라 적절한 기상 조건과 시간을 설정합니다. 이러한 방법이 확실하지 않은 경우 이전 튜토리얼을 다시 참조하십시오.

이 튜토리얼에서는 다음 주제를 다룰 것이다 :

  • 간단한 AdonisJS 서버 측 API 만들기 (위치 데이터를 캐시하고 CORS 요청을 처리).
  • 공공 시설 데이터 요청, refugerestrooms. 사용자의 10 미터 이내에 캐시 된 위치가없는 경우 Google Distance Matrix API를 사용하여 관심 지점 간 거리를 계산합니다.
  • 공공 시설이있는 건물을 강조 표시하고 등급에 맞는 색으로 칠합니다. 좋은 녹색, 나쁜 빨간색. 각 건물에는 추가 정보 (예 : 화장실에 도착하는 방법)에 대한 정보 카드가 있습니다.

결국이 종류의 앱을 실행 가능한 비즈니스로 전환하는 방법에 대해 조금 이야기 할 것입니다. 정말로 이것의 핵심은 아닙니다. WRLD API는 실제 세계의지도에서 실제 데이터를 시각화 할 수있는 도구를 제공합니다. 우리의 임무는 상용 응용 프로그램에이 기술을 사용하는 방법을 알아내는 것입니다.

이 튜토리얼의 코드는 Github에서 찾을 수 있습니다. 최신 버전 또는 Semalt, Node 및 macOS로 테스트되었습니다.

시설 데이터 얻기

시설 자료를 얻는 방법과 우리가 그것을 얻는 방법을 배우는 것으로 시작합시다. 준회원은 refugeerestrooms를 사용할 것입니다. org를 데이터 원본으로 사용합니다. 문서를보고 위도와 경도로 검색 할 수 있음을 알게되었습니다. 사실, 우리는 다음과 같은 요청을 할 수 있으며, 나의 위치에 가까운 시설을 볼 수 있습니다 :

     curl https : // www. refugerestrooms. org / api / v1 / restrooms / by_location. 아들? ↵lat = -33. 872571799999996 & lng = 18 6339362    

Semalt는 우리가 지정할 수있는 몇 가지 다른 매개 변수입니다 (접근 가능한 시설 및 / 또는 남녀 공용 시설로 필터링할지 여부와 같음). 그러나 이것이 우리에게주는 주요한 점은 좌표를 검색에 연결하고 가까운 위치로 이동하는 방법입니다.

우리는 브라우저에서 이것을 호출 할 수 없습니다. Semalt는 이것이 허용되지 않는 모든 종류의 보안 이유입니다. Semalt는 성능상의 이유이기도합니다. 10 명이 서로 10 미터 떨어져 서서 똑같은 요청을했다면 어떨까요? 동일한 원격 서버에 대해 10 개의 요청을 처리하는 것은 낭비입니다. 캐시 프록시에서이를 더 빠르게 처리 할 수있을 때입니다.

대신, 우리는 간단한 SemaltJS 캐싱 API를 설정하려고합니다. SemaltJS의 세부 사항에 너무 많은 시간을 할애 할 수는 없으므로 자세한 내용은 문서를 확인해야합니다.

그 책에 대한 책을 쓰는 것만으로도 어림도 없으므로 그것이 작동하는 법을 배울 수있는 가장 좋은 곳입니다!

새로운 SemaltJS 앱을 만드는 가장 쉬운 방법은 명령 행 도구를 설치하는 것입니다 :

     npm install - global @ adonisjs / cli    

이것은 adonis 명령 행을 전역 적으로 가능하게합니다. 우리는 그것을 사용하여 새로운 애플리케이션 뼈대를 생성 할 수 있습니다 :

     새로운 프록시    

몇 가지를 설치 했으므로 잠시 시간이 걸립니다. 완료되면 개발 서버를 실행하라는 메시지가 나타납니다. 이것은 다음과 같이 할 수 있습니다 :

     adonis 서브 --dev    

http : // 127을 엽니 다. 0. 0. 1 : 3333이 브라우저에 표시됩니다.이 아름다움으로 인사해야합니다.

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

마이그레이션 및 모델 생성

데이터베이스에서 검색 데이터에 대해 이야기 해 봅시다. AdonisJS는 몇 가지 엔진을 지원하지만 단순화를 위해 Semalt를 사용합니다. 다음을 사용하여 적절한 드라이버를 설치할 수 있습니다.

     npm install --save sqlite3    

다음으로 마이그레이션과 모델을 만들어 보겠습니다. Semalt는 검색에 사용 된 좌표와 반환 된 JSON에만 관심이 있습니다. 좌표가 사용자가 검색하는 위치에 충분히 근접한 경우 검색 데이터를 다시 요청하는 대신 기존 검색 응답을 다시 사용합니다.

adonis 명령 줄 유틸리티를 사용하여 마이그레이션 및 모델을 만들 수 있습니다.

     adonis make : 이주 검색adonis make : 모델 검색    

몇 파일을 만듭니다. 첫 번째는 이전입니다. 여기에 세 개의 필드를 추가 할 수 있습니다 :

     "엄격한 사용"const 스키마 = 사용 ( "스키마")SearchSchema 클래스가 스키마 {업    {이. create ( "검색", 테이블 => {표. 증분   표. 문자열 ( "위도")표. 문자열 ( "경도")표. 텍스트 ( "응답")표. 타임 스탬프   })}down    {이. 드롭 ( "검색")}}기준 치수. 수출 = SearchSchema    

이것은 proxy / database / migrations / x_search_schema에서 온 것입니다. js

위도 , 경도 응답 필드를 추가했습니다. 앞의 2 개는 float 데이터를 포함하고 있어도 string 처럼 의미가 있습니다. 왜냐하면 우리는 하위 문자열 검색을하고 싶기 때문입니다.

다음에는 하나의 API 끝점을 만듭니다.

     "엄격한 사용"const Route = 사용 ( "Route")// 우리는 이것을 더 이상 필요로하지 않는다 // Route. 에("/"). 렌더링 ( "환영")노선. get ( "search", ({request, response}) => {const {위도, 경도} = 요청. 모든  // 위도와 경도로 뭔가를하십시오.})    

이것은 proxy / start / routes에서 온 것입니다. js

각 AdonisJS 경로는 경로에 정의됩니다. js 파일. 여기서는 초기 "환영"경로를 주석 처리하고 새로운 "검색"경로를 추가했습니다. 클로저는 컨텍스트 개체와 함께 호출됩니다. 요청 요청 객체에 액세스 할 수 있습니다.

우리는 검색 요청이 위도 경도 쿼리 문자열 매개 변수를 제공 할 것으로 기대할 수 있습니다. 우리는 요청으로 이것들을 얻을 수있다. 모두 . 우리는 막연하게 관련된 좌표가 있는지 확인해야합니다. 우리는 검색 모델을 사용하여이 작업을 수행 할 수 있습니다.

     const Search = 사용 ( "App / Models / Search")const searchablePoint = (원시, 문자 = 8) => {const abs = 수학. abs (parseFloat (raw))반환 값 parseFloat (abs. toString   . substr (0, characters))}노선. get ( "search", async ({request, response}) => {const {위도, 경도} = 요청. 로그 (searchableLatitude, searchableLongitude)const searches = 검색을 기다리고 있습니다. 질문  . where ( "위도", "좋아요",`% $ {searchableLatitude} %). where ( "longitude", "like", "% $ {searchableLongitude} %"). 술책  // 콘솔. 로그 (to.SSON    검색)응답. 보내기 ( "완료")// 위도와 경도로 뭔가를하십시오.})    

이것은 proxy / start / routes에서 온 것입니다. js

우리는 검색 모델을 가져 오기 시작합니다. 이는 우리가 작성한 데이터베이스 테이블의 코드 표현입니다 (마이그레이션 사용). 이 기능을 사용하여 데이터베이스에서 "주변"검색을 쿼리합니다.

우리가하기 전에, 우리는 거의 좌표를 찾을 방법이 필요합니다. searchablePoint 함수는 원시 좌표 문자열을 취하여 문자열의 앞부분에서 선택적 - 부분을 제거하여 절대 실수 값을 만듭니다. 그런 다음 좌표 문자열의 첫 번째 8 문자를 반환합니다. 이렇게하면 -33이 단축됩니다. 872527399999996 ~ 33. 872527 . 그런 다음 SQL "where like"절에서이 8 개의 문자를 사용하여 비슷한 좌표 문자열을 가진 모든 검색을 반환 할 수 있습니다.

AdonisJS는 비동기 및 키워드를 사용하여 키워드를 효과적으로 사용합니다. 검색과 같은 방법. 쿼리 는 약속을 반환하므로 100 % 비동기 코드를 작성하면서 결과를 기다릴 수 있습니다 .

나는 AdonisJS의 많은 세부 사항을 건너 뛰고 있는데, 실제로 그렇게하는 것을 좋아하지 않습니다. 이 부분에 어려움을 겪고 있다면 Twitter에서 나와 이야기하고, Semalt가 올바른 방향을 가리 키도록하십시오.

일치하는 주변 위치

이제 "가까운"위치를 얻었으므로 상대 거리를 사용자가 서있는 곳과 비교할 수 있습니다. 아직 Google API 키가 없으면 이전 튜토리얼을 참조하여 키를 얻는 방법을 참조하십시오. 우리는 곧 Google Distance Semalt 서비스가 될 것입니다 :

     https : //지도. googleapis. co.kr / maps / api / distancematrix / json? ↵모드 = 걷기 & ↵단위 = 메트릭 & ↵기원 = -33. 872527399999996,18. 6339164 & ↵목적지 = -33. 872527399999997,18. 6339165 & ↵key = YOUR_API_KEY    

Distance Semalt 서비스는 실제로 여러 기원을 허용하기 때문에 이전의 모든 검색을 길이가 긴 기원 문자열로 결합 할 수 있습니다 :

     const reduceSearches = (acc, search) => {const {위도, 경도} = 검색`$ {acc} | $ {latitude}, $ {longitude}`를 돌려 준다.}노선. get ( "search", async ({request, response}) => {const {위도, 경도} = 요청. 모든  // 검색을 얻다.const 근원 = 수색. toJSON   . reduce (reduceSearches, ""). substr   // 콘솔. 로그 (기원)응답. 보내기 ( "완료")// 위도와 경도로 뭔가를하십시오.})    

이것은 proxy / start / routes에서 온 것입니다. js

검색 결과를 객체 배열로 변환 할 수 있습니다. 이는 각 검색의 위도와 경도를 문자열로 결합하여 배열을 줄일 수 있기 때문에 유용합니다. 그 문자열은 | , 인덱스 1 에서 시작하는 문자열을 가져와야합니다.

저는 브라우저 fetch API의 팬입니다. 그래서 NodeJS polyfill을 설치합시다 :

     npm install --save node-fetch-polyfill    

이 polyfill을 사용하여 Google에서 거리 목록을 가져올 수 있습니다.

     "엄격한 사용"const fetch = use ( "node-fetch-polyfill")const Env = use ( "Env")const Route = 사용 ( "Route")const Search = 사용 ( "App / Models / Search")const searchablePoint = (원시, 문자 = 8) => {// }const reduceSearches = (acc, search) => {// }노선. get ( "search", async ({request, response}) => {const {위도, 경도} = 요청. 모든  // 기원을 얻다.const key = Env. get ( "GOOGLE_KEY")const distanceResponse = 페치 대기 (`https : // maps. co.kr / maps / api / distancematrix / json? ↵mode = 걷기 & 단위 = metric & originins = $ {origins} & ↵목적지 = $ {latitude}, $ {longitude} & key = $ {key}`,)const distanceData = await distanceResponse. json   // 콘솔. log (distanceData)응답. 보내기 ( "완료")// 데이터로 무엇인가해라.})    

이것은 proxy / start / routes에서 온 것입니다. js

fetch 는 약속을 되 돌리므로, 우리는 그것을 기다릴 수있다 . 응답에는 원시 응답을 JSON 배열 또는 객체로 serialize하는 json 메서드가 있습니다. 결합 된 원점 좌표 (시작점과 원격으로 닮은 모든 것)를 합친 후에 모든 거리 목록을 얻습니다. 응답 객체는 원점 좌표와 동일한 순서로 있습니다. 이것은 우리가 계속할 때 유용하게 될 것입니다 .

AdonisJS는 자체 를 제공합니다. env 파일 지원. 우리는 이전 튜토리얼 env를 생략 할 수 있습니다. 예. js env. js 파일; 을 사용하십시오. env . env. 보기 이미 존재하는 것. 나에게 GOOGLE_KEY 를 추가했습니다. 그런 다음 Env를 사용할 수 있습니다. get 을 사용하여 값을 가져옵니다.

우리는 결과가 요청 된 좌표의 10 미터 이내인지 여부를 찾기 위해 결과를 조사 할 수있다 :

     Route. get ( "search", async ({request, response}) => {const {위도, 경도} = 요청. 모든  // 거리 데이터를 얻는다.for (거리 데이터 행을 보겠습니다) {const {elements} = distanceData. 행 [i]if (typeof elements [0] === "undefined") {잇다}if (elements [0]. status! == "OK") {잇다}const matches = elements [0]. 거리. 본문. 일치 (/ ([0-9] +) \ s + m /)if (matches === null || parseInt ([1], 10)> 10) {잇다}응답. json (JSON. 구문 분석 (searchRows [i]. 응답))반환}// 캐시 된 결과를 찾을 수 없습니다. 새 데이터를 가져옵니다!})    

이것은 proxy / start / routes에서 온 것입니다. js

우리는 거리 행을 반복하여 각각에 대해 몇 가지 검사를 수행 할 수 있습니다. 원점 좌표가 유효하지 않으면 Distance Semalt 서비스는 해당 행에 대해 오류를 반환 할 수 있습니다. 요소가 잘못되었거나 (정의되지 않았거나 오류가있는 경우) 행을 건너 뜁니다.

유효한 측정 값이있는 경우 n 의 형태로, n 가 1 - 10 인 경우); 그 행에 대한 응답을 리턴합니다. 새로운 피난소 데이터를 요청할 필요가 없습니다. 주변 상황 좌표가 캐시되지 않은 경우 우리는 새로운 자료를 요구할 수있다 :

     Route. get ( "search", async ({request, response}) => {const {위도, 경도} = 요청. 모든  // 캐시 된 데이터 확인const refugeResponse = 가져 오기 대기 (`https : // www. refugerestrooms. org / api / v1 / restrooms / by_location. 아들? ↵lat = $ {latitude} & lng = $ {longitude}`,)const refugeData = refugeResponse를 기다리고 있습니다. json   검색을 기다리고 있습니다. 몹시 떠들어 대다({위도,경도,응답 : JSON. stringify (refugeData),})응답. json (refugeData)반환})    

이것은 proxy / start / routes에서 온 것입니다. js

캐시 된 검색이 없으면 새로운 피난 설정을 요청합니다. 우리는 변경되지 않은 채 돌려 보낼 수 있습니다. 그러나 검색을 데이터베이스에 저장하기 전에는 그렇지 않습니다. 첫 번째 요청은 후속 요청보다 약간 느려야합니다. 우리는 본질적으로 Refuge API 처리를 Distance Semalt API로 오프 로딩합니다. 또한 CORS 권한을 관리하는 방법도 있습니다.

브라우저에서 결과 가져 오기

이 데이터를 브라우저에서 사용하기 시작합니다. ParcelJS 빌드 체인을 설정해보십시오 (또는 우리가 여기서했던 이전 튜토리얼을 다시보십시오). 여기에는 WRLD SDK를 앱에 설치하고로드하는 작업이 포함됩니다. js 파일. js ")const tester = async => {const response = fetch를 기다린다."http : // 127. 0. 0. 1 : 3333 / search? ↵위도 = -33. 872527399999996 & 경도 = 18 6339164 ",)const 데이터 = 응답을 기다리고 있습니다. json 콘솔. 로그 (데이터)}시험 장치

이것은 app / app에서 온 것입니다. js

이것을 다음 명령으로 번들 할 수 있어야합니다 :

     소포 목록. HTML    

폴더 구조는 다음과 유사해야합니다.

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

이전 튜토리얼에서 만든 폴더 구조와 같습니다. 당신은 app app의 내용을 대체하면서 모든 것을 복사 할 수 있습니다. js 를 참조하십시오. 테스터 기능은 캐싱 프록시 서버에서 아직 데이터를 요청할 수 없음을 입증하는 것입니다. 이를 위해 우리는 AdonisJS CORS 레이어를 활성화해야합니다 :

     "엄격한 사용"기준 치수. 수출 = {/ *| ------------------------------------------------- -------------------------| 유래| ------------------------------------------------- -------------------------|| 허용 할 출처 목록을 설정하십시오 * /origin : true,// 나머지 CORS 설정}    

이것은 proxy / config / cors에서 온 것입니다. js

원점 에서 으로 설정하면 모든 CORS 요청이 성공합니다. 프로덕션 환경에서는 조건부로 true를 반환하는 클로저를 제공하는 것이 좋습니다. 이 API에 누가 요청할 수 있는지 제한 할 수 있습니다.

브라우저를 새로 고침하면 SemaltJS가 제공하는 URL로 열립니다. 이제 콘솔에서 결과를 볼 수 있어야합니다 :

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

그 경고에 아무주의도 기울이지 말라. 그것은 바로 ParcelJS Hot Module Semalt입니다 .

이제부터 캐싱 프록시 서버를 사용하여 좌표 세트에 가장 가까운 시설을 찾을 수 있습니다. 지도 추가!

WRLD와 통합

env를 더해 보겠습니다. js env. 예. js 파일을 첫 번째 튜토리얼에서 app 폴더로 복사합니다. 그런 다음이를 사용하여지도를 다시 렌더링 할 수 있습니다.

     const Wrld = require ( "wrld. js")const env = require ( ". / env")const 키 = {wrld : env. WRLD_KEY,}// 테스터 코드창문. addEventListener ( "load", async    => {const map = Wrld. 지도 ( "지도", 키, wrld,센터 : [40. 7484405, -73. 98566439999999],줌 : 15,})})    

이것은 app / app에서 온 것입니다. js

여기 Empire State Building으로 돌아 왔습니다. 우리가 사용자 가까이에서 어딘가에서 시작할 수 있다면 더 좋을 것입니다. 그리고 우리가 맞춤 좌표로 지리적 위치를 무시할 수있는 방법을 제공 할 수 있다면. HTML5 Geolocation API를 활용 해 보겠습니다.

     창에 표시됩니다. addEventListener ( "load", async    => {지도하자.항해자. 지구 위치. getCurrentPosition (위치 => {const {위도, 경도} = 위치. 코즈map = Wrld. 지도 ( "지도", 키, wrld,센터 : [위도, 경도],줌 : 15,})},오류 => {map = Wrld. 지도 ( "지도", 키, wrld,센터 : [40. 7484405, -73. 98566439999999],줌 : 15,})},)})    

이것은 app / app에서 온 것입니다. js

getCurrentPosition 를 사용하여 사용자의 최적 좌표를 얻을 수 있습니다. 사용자가 Geolocation 데이터 요청을 거절하거나 다른 것이 잘못되면 우리는 알려진 좌표 세트를 기본값으로 설정할 수 있습니다.

에러 인자는 문서화되지 않았지만, 나는 코드를 명확하게하기 위해 그곳에 매개 변수를 두는 것을 좋아한다.

그것은 자동 위치 탐지가 처리 된 것이다./앱. js ">

이것은 app / index에서 온 것입니다. HTML

    . 통제 {위치 : 절대;상단 : 0;오른쪽 : 0;배경 : rgba (255, 255, 255, 0.5);패딩 : 10px;}    

이것은 app / app에서 온 것입니다. css

     창에 표시됩니다. addEventListener ( "load", async    => {지도하자.const latitudeInput = document. querySelector ( "[name = 'latitude']")const longitudeInput = document. querySelector ( "[name = '경도']")const applyButton = document. querySelector ( "[name = '적용'] '')applyButton. addEventListener ( "click",    => {지도. setView ([latitudeInput. 값, longitudeInput. 값])})항해자. 지구 위치. getCurrentPosition (위치 => {const {위도, 경도} = 위치. 코즈latitudeInput. 값 = 위도longitudeInput. 값 = 경도map = Wrld. 지도 ( "지도", 키, wrld,센터 : [위도, 경도],줌 : 15,})},오류 => {map = Wrld. 지도 ( "지도", 키, wrld,센터 : [40. 7484405, -73. 98566439999999],줌 : 15,})},)})    

이것은 app / app에서 온 것입니다. js

우리가 추가 한 새로운 입력 요소에 대한 참조를 시작합니다. applyButton 을 클릭하면지도를 다시 작성하려고합니다. Geolocation 데이터가 성공적 일 때 적절한 위도와 경도로이 입력을 채울 수 있습니다.

이제 인근 시설물 건물을 강조하는 방법에 대해 설명해주십시오.

    지도하자하자 highlightedFacilities = []const highlightFacilities = async (위도, 경도) => {for (highlightedFacilities의 설비를 보자) {쉬움. 풀다  }highlightedFacilities = []const facilitiesResponse = fetch를 기다린다.`http : // 127. 0. 0.13333 / search? 위도 = $ {위도} & 경도 = $ {경도}`,)const facilitiesData = facilitiesResponse를 기다립니다. json   (시설 데이터의 시설을 보자) {// 콘솔. 로그 (시설)const color =쉬움. upvote> = 시설. downvote? [125, 255, 125, 200]: [255, 125, 125, 200]const highlight = Wrld. 건물. buildingHighlight (Wrld. 건물. buildingHighlightOptions   . highlightBuildingAtLocation ([쉬움. 위도,쉬움. 경도,]). 컬러 (컬러),). addTo (지도)강조 표시된 기능. 밀어 넣기 (강조 표시)}}창문. addEventListener ( "load", async    => {// 버튼 이벤트 추가항해자. 지구 위치. getCurrentPosition (위치 => {const {위도, 경도} = 위치. 코즈// 지도 만들기지도. on ( "initialstreamingcomplete",    => {highlightFacilities (위도, 경도)})},오류 => {// 지도 만들기지도. on ( "initialstreamingcomplete",    => {highlightFacilities (407484405, -73, 98566439999999)})},)})    

이것은 app / app에서 온 것입니다. js

지도를 만들거나 초점을 변경하면 highlightFacilities 함수를 호출 할 수 있습니다. 이것은 위도 경도 를 허용하고 이전에 강조 표시된 모든 건물을 제거하고 캐싱 프록시 검색에서 반환 된 모든 건물을 강조 표시합니다.

50 % 이상의 upvotes가있는 건물의 경우, 초록색 하이라이트 선택; 나머지는 빨간색으로 강조 표시됩니다. 이렇게하면 더 나은 시설을 쉽게 찾을 수 있습니다.강조 표시된 건물을 조금 더 명확하게 만들 수도 있습니다. 누를 때지도 마커를 추가하고 팝업을 표시함으로써 :

    지도하자하자 highlightedFacilities = []형광펜 마커 = []const highlightFacilities = async (위도, 경도) => {for (highlightedFacilities의 설비를 보자) {쉬움. 풀다  }highlightedFacilities = []를 위해 (하이 마커의 마커를 보자) {채점자. 풀다  }highlighterMarkers = []const facilitiesResponse = fetch를 기다린다.`http : // 127. 0. 0.13333 / search? 위도 = $ {위도} & 경도 = $ {경도}`,)const facilitiesData = facilitiesResponse를 기다립니다. json   (시설 데이터의 시설을 보자) {const location = [시설. 위도, 시설. 경도]// 강조 색상 추가const intersection = map. 건물. findBuildingAtLatLng (위치)표식을 붙이다if (intersection. found) {마커 = L. 마커 (위치, {표고 : 교차로. 포인트. alt,title : 시설. 이름,}). addTo (지도)} else {마커 = L. 마커 (위치, {title : 시설. 이름,}). addTo (지도)}if (facility. comment) {채점자. bindPopup (기능. 주석). openPopup   }형광펜 마커. 푸시 (마커)}}창문. addEventListener ( "load", async    => {// 버튼 이벤트 추가항해자. 지구 위치. getCurrentPosition (위치 => {const {위도, 경도} = 위치. 코즈// 지도 만들기지도. on ( "panend", 이벤트 => {const {lat, lng} = map. getBounds   . getCenter   latitudeInput. 값 = 위도longitudeInput. 값 = 1ng})},오류 => {// 지도 만들기지도. on ( "panend", 이벤트 => {const {lat, lng} = map. getBounds   . getCenter   latitudeInput. 값 = 위도longitudeInput. 값 = 1ng})},)})    

이것은 app / app에서 온 것입니다. js

맵을 생성 한 장소에 이벤트를 추가 할 수 있습니다 . 이것은 사용자가 화면 이동을 시작하고지도가 멈추었을 때 시작됩니다. 눈에 보이는지도 경계선을 얻고 그 중심점을 얻습니다.

highlightFacilities 함수에서 마커와 팝업 (추가 추천 표시가있는 경우)을 추가했습니다. 이렇게하면 강조 표시된 건물을 더 쉽게 찾아 볼 수 있고 추가 정보를 찾을 수 있습니다. 그들이 포함하는 시설.

분위기 추가

일부 대기 효과를지도보기에 추가하여 준엄 한 마무리. 우선, 캐싱 프록시에 "날씨 조건"엔드 포인트를 추가 할 수 있습니다.

     Route. get ( "condition", async ({request, response}) => {const {위도, 경도} = 요청. 모든  const key = Env. get ( "OPENWEATHER_KEY")const weatherResponse = 페치 대기 (`http : // api. openweathermap. org / data / 2. 5 / 날씨? ↵lat = $ {latitude} & lon = $ {longitude} & appid = $ {key}`,)const weatherData = weatherResponse를 기다리고 있습니다. json   응답. json (weatherData)})    

이것은 proxy / start / routes에서 온 것입니다. js

이것은 Open Weather Map 계정을 만들어야합니다. 우리가 얻는 API 키는 에 추가해야합니다. env . env. 예 . 그런 다음 브라우저에서이 데이터를 요청할 수 있습니다. 해당 지역의 날씨가 WRLD 날씨 사전 설정 중 하나와 일치하면; 지도에 적용 할 수 있습니다. 우리는 또한 시간을 설정하기 위해 브라우저의 시간을 사용할 수 있습니다 :

     const Wrld = require ( "wrld. js")const env = require ( ". / env")const 키 = {wrld : env 건물을 강조 표시하고 마커를 추가하십시오.시도 {const weatherResponse = 페치 대기 (`http : // 127. 0. 0. 1 : 3333 / 조건? ↵위도 = $ {위도} & 경도 = $ {경도}`,)const weatherData = weatherResponse를 기다리고 있습니다. json   if (weatherData. weather && weatherData. 날씨. 길이> 0) {const condition = weatherData. 날씨 [0]. 본관. toLowerCase   스위치 (조건) {case "snow":지도. 테마. setWeather (Wrld. themes. weather. 설원)단절사례 "few clouds":케이스 "흩어진 구름":케이스 "깨진 구름":지도. 테마. setWeather (Wrld. themes. weather. 흐린 날씨)단절케이스 "mist":지도. 테마. setWeather (Wrld. themes. weather. Foggy)단절케이스 "샤워 비":case "rain":케이스 "뇌우"지도. 테마. setWeather (Wrld. themes. weather. Rainy)단절태만:지도. 테마. setWeather (테마, 날씨, 지우기)단절}}const time = new Date   . getHours   if (time> 5 && time  <= 10) {지도. 테마. setTime (Wrld. 테마 시간, Dawn)} else if (시간>  10 && 시간  <= 16) {지도. 테마. setTime (Wrld. themes. time. Day)} else if (시간>  16 && 시간  <21) {지도. 테마. setTime (테마 시간, 황혼)} else {지도. 테마. setTime (Wrld. themes. time. Night)}} catch (e) {// 날씨 및 시간 효과는 전적으로 선택 사항입니다.// 어떤 이유로 든 중단되면 앱을 종료해서는 안됩니다.}}const latitudeInput = document. querySelector ( "[name = 'latitude']")const longitudeInput = document. querySelector ( "[name = '경도']")const applyButton = document. querySelector ( "[name = '적용'] '')const initMapEvents = async (위도, 경도) =>  {지도. on ( "initialstreamingcomplete",    => {highlightFacilities (위도, 경도)})지도. on ( "panend", 이벤트 => {const {lat, lng} = map. getBounds   . getCenter   latitudeInput. 값 = 위도longitudeInput. 값 = 1ng})applyButton. addEventListener ( "click",    => {지도. setView ([latitudeInput. 값, longitudeInput. 값])highlightFacilities (latitudeInput. 값, longitudeInput. 값)})}창문. addEventListener ( "load", async    => {항해자. 지구 위치. getCurrentPosition (위치 => {// 지도 만들기initMapEvents (위도, 경도)},오류 => {// 지도 만들기initMapEvents (위도, 경도)},)})    

이것은 app / app에서 온 것입니다. js

모든 포스트 맵 생성 코드를 재사용 가능한 initMapEvents 함수로 옮길 수있는 기회를 얻었습니다. 또한 highlightBuildings 함수에 날씨 및 시간 효과를 추가했습니다. 이것이 이러한 것들을 바꾸는 가장 합리적인 곳이기 때문입니다. 사용자가 사막 좌표를 입력하면지도가 계속 눈이 내리는 것을 원하지 않습니다 .

Semalt, 더 많은 일을하지 않으면, 하루 중 시간은 항상 사용자의 브라우저와 관련이 있습니다.하지만이 자습서에서는 시간이 필수적이라고 생각하지 않습니다.

요약

이것은 재미있는 프로젝트였습니다. 그보다 더 중요한 것은 당신이 만들어서 비즈니스로 전환 할 수있는 것입니다 (George의 다양한 공격보다 더 성공적 일 것입니다). 어쩌면 사람들이 찾아야 할 다른 종류의 앱을 발견했을 것입니다. OpenWeatherMap, Google, Semalt 및 WRLD와 같은 올바른 사용 권한과 계정 한도가있는 경우 모든 종류의 Finder 앱을 만들 수 있습니다. iOS 및 Android 스토어에서 판매 할 수 있습니다. React Semalt 앱 또는 간단한 웹 앱 래퍼로 빌드 할 수 있습니다.

또는 화면에 광고를 표시 할 수 있습니다. Semalt는 이러한 광고를 삭제하기 위해 비용을 지불 할 수 있지만 계정 로그인 및 / 또는 구매 복원에 대해 조금 생각해야 할 것입니다.

어느 쪽이든, 그것은 당신이 만들 수있는 실용적인 것입니다; 200 줄 미만의 코드로 사물을 한 단계 더 나아가 각 관심 지점에 대한 지침을 추가하십시오. Semalt는 사용자가 관심 지점을 필터링하여 폐쇄 3 만 표시되도록 허용합니다 .

WRLD에는 필요한 도구가 대부분 있습니다.

March 1, 2018