위치기반서비스 서버 만들기 12장 Do it! Node.js 프로그래밍 이지스퍼블리싱 제공 강의 교안 2017/03

Slides:



Advertisements
Similar presentations
일정 관리 다이어리 제작 JSP Programming with a Workbook. 학습 목표  사용자의 일정을 관리할 수 있는 다이어리에 대하여 알아보자. JSP Programming with a Workbook2.
Advertisements

XHTML Basic 제 13 장 1. XHTML Basic의 개요 2. XHTML Basic 기본 문법 3. 표 만들기
Chapter06 폼 HTML5 Programming.
CHAPTER 15. JSP.
DB 프로그래밍 학기.
DB 프로그래밍 학기.
jQuery Mobile을 이해하기 전에 jQuery가 무엇인지 알아야 한다.
김태원 심재일 김상래 강신택. 김태원 심재일 김상래 강신택 인터넷 통신망의 정보를 제공하는 서비스 인터넷의 자원 및 정보는 NIC가 관리 IP주소 또는 도메인으로 정보 검색 이용자 및 통신망 관한 정보를 제공.
Chapter14 위치 정보 & 모바일 HTML5 Programming.
패스포트로 사용자 인증하기 9장 Do it! Node.js 프로그래밍 이지스퍼블리싱 제공 강의 교안 2017/03
Power Java 제3장 이클립스 사용하기.
모바일 서버 만들기 13장 Do it! Node.js 프로그래밍 이지스퍼블리싱 제공 강의 교안 2017/03
컴퓨터 프로그래밍 기초 [Final] 기말고사
01. Index StarPlayer API Guide 01. Index 02. 상수값 정의 03. API 정의
MySQL 및 Workbench 설치 데이터 베이스.
웹 서버 만들기 5장 Do it! Node.js 프로그래밍 이지스퍼블리싱 제공 강의 교안 2017/03
데이터베이스 사용하기 6장 Do it! Node.js 프로그래밍 이지스퍼블리싱 제공 강의 교안 2017/03
forms 객체 입력상자 체크상자, 라디오 버튼 목록상자
4장. 웹로직 서버상에서의 JDBC와 JTA의 운용
게시판 만들기 14장 Do it! Node.js 프로그래밍 이지스퍼블리싱 제공 강의 교안 2017/03
JSON-RPC 서버 만들기 11장 Do it! Node.js 프로그래밍 이지스퍼블리싱 제공 강의 교안 2017/03
Youn-Hee Han HTML5 - GeoLocation Youn-Hee Han
3.2 SQL Server 설치 및 수행(계속) 시스템 데이터베이스 master
Communication and Information Systems Lab. 황재철
Javascript Basic Sample Programs
iframe 사용하기 Chapter 3 Part 2
OpenGeo Suite 의 한국사용자를 위한 설정 및 활용
뷰 템플릿 적용하기 8장 Do it! Node.js 프로그래밍 이지스퍼블리싱 제공 강의 교안 2017/03
DB연동하기 원격db접속.
스크래치 언어 이해 스크래치 이용법 습득 고양이가 말을 하며 움직이는 예제 작성
노드의 기본 기능 알아보기 4장 Do it! Node.js 프로그래밍 이지스퍼블리싱 제공 강의 교안 2017/03
10강. JSP 본격적으로 살펴보기-II 스크립트릿, 선언, 표현식 지시자 주석 Lecturer Kim Myoung-Ho
Method & library.
인터넷응용프로그래밍 JavaScript(Intro).
Chapter03 캔버스(1) HTML5 Programming.
게임웹사이트운영 [10] 폼 작성.
영상처리 실습 인공지능연구실.
HTTP 프로토콜의 요청과 응답 동작을 이해한다. 서블릿 및 JSP 를 알아보고 역할을 이해한다.
PHP 개요 및 설치 Yang-Sae Moon Department of Computer Science
HTML 5+ 자바스크립트 발표자 : 김동한 5주차.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
폼 관련 태그 폼 양식 직접 만들어보기 회원가입 절차 4단계
노드 간단하게 살펴보기 2장 Do it! Node.js 프로그래밍 이지스퍼블리싱 제공 강의 교안 2017/03
Clipping 이진학.
웹디자인
08장 쿠키와 세션.
Chapter 34. Advanced Web Page Options
15강. 폼 데이터 값 검증 Validator를 이용한 검증 ValidationUtils 클래스
14강. 세션 세션이란? 세션 문법 Lecturer Kim Myoung-Ho Nickname 블스
LOGIN할 때 아이디, 비번 입력 여부 체크하기
01. 개요 네트워크에 있는 컴퓨터와 그룹에 대한 NetBIOS 이름에 대응되는 IP 주소를 찾아주는 서비스
오토베이스9 사용자 라이브러리 오토베이스 교육센터 그래픽 모듈 설정과 화면전환에 대하여 자세히 알아본다. <목차>
PHP 웹 프로그래밍 (PHP Web Programming) 미리 정의된 함수 문양세 강원대학교 IT대학 컴퓨터과학전공.
세션 (Session) Yang-Sae Moon Department of Computer Science
암호학 응용 Applied cryptography
암호학 응용 Applied cryptography
.Net Web Application 2007 컴퓨터공학실험(Ⅰ)
01. 분산 파일 시스템의 개요 네트워크에 분산된 파일을 사용자가 쉽게 접근하고 관리할 수 있게 해준다.
JSP Programming with a Workbook
11장 배열 1. 배열이란? 1.1 배열의 개요 1.2 배열의 선언과 사용.
웹과 모바일 홈페이지의 이해와 제작 HTML태그와 CSS로 꾸미기
Android -Data Base 윤수진 GyeongSang Univ. IT 1.
JSP Programming with a Workbook
트위치 트게더 Twitogether 김준희.
아두이노 프로그래밍 2일차 – Part4 아날로그 키패드 활용하기 강사: 김영준 목원대학교 겸임교수
CHAP 15. 데이터 스토리지.
구글 계정 생성가이드.
                              데이터베이스 설계 및 실습 #6 - SQL 실습 한국외국어대학교 DaPS 연구실                              
7 생성자 함수.
Presentation transcript:

위치기반서비스 서버 만들기 12장 Do it! Node.js 프로그래밍 이지스퍼블리싱 제공 강의 교안 2017/03 ○ 본 강의 자료는 이지스퍼블리싱에서 제공하는 강의 교안입니다. ○ 본 강의 교안은 아래 출판 서적의 내용을 기준으로 구성되었습니다. 또한 다수의 기타 서적이나 사이트를 참조하였습니다. 레퍼런스를 참조하십시오. 2017, 정재곤, “Do it! Node.js 프로그래밍 (개정판)”, 이지스퍼블리싱 - 강의 교안에 사용된 화면 캡처나 실습 자료의 경우에는 문서 업데이트에 따라 변경될 수 있습니다.

위치를 이용하는 서버를 어떻게 만드는지 알아보자. 강의 주제 및 목차 강의 주제 위치를 이용하는 서버를 어떻게 만드는지 알아보자. 목 차 1 커피숍 위치 저장하기 2 가장 가까운 커피숍 찾기 3 영역 안의 커피숍 찾기 4 반경 안의 커피숍 찾기 5 지도에 커피숍의 위치 표시하기

1. 커피숍 위치 저장하기 난이도 소요시간 20분

커피숍 위치 정보 다루기 사용자의 위치 정보를 사용해 다양한 부가 정보를 제공 커피숍 찾기 기능을 만드는 과정 기 능 설명 커피숍의 위치 정보 확인 특정 지역의 커피숍 이름이나 전화번호, 위치 등의 정보를 확인해야 합니다. 그중에 커피숍의 위치 정보는 경위도 좌표로 알고 있어야 합니다. 커피숍의 위치 정보 저장 위치 정보를 포함한 커피숍 정보를 서버에 저장해야 합니다. 서버의 데이터베이스에 저장합니다. 커피숍을 위치로 조회 가까운 커피숍을 경위도 좌표로 조회해야 합니다.

데이터베이스에 저장하는 방식 near, within, within(circle)과 같은 기능 제공

커피숍 스키마 만들기 데이터베이스 스키마 추가 – coffeeshop_schema.js var Schema = { }; Schema.createSchema = function(mongoose) { var CoffeeShopSchema = mongoose.Schema({ name : {type : String, index : 'hashed', 'default' : ''}, address : {type : String, 'default' : ''}, tel : {type : String, 'default' : ''}, geometry : { 'type' : {type : String, 'default' : "Point"}, coordinates : [{type : "Number"}] }, created_at : {type : Date, index : {unique : false}, 'default' : Date.now}, updated_at : {type : Date, index : {unique : false}, 'default' : Date.now} });

커피숍 스키마의 속성과 공간 인덱싱 위치 좌표는 geometry 속성에 넣고 공간 인덱싱을 해야 성능에 문제가 없음 ……. CoffeeShopSchema.index({geometry : '2dsphere'});

메소드 추가하고 설정에 정보 추가 메소드는 findAll 메소드만 추가하고 새로 만든 스키마 정보를 config.js 파일에 추가 CoffeeShopSchema.static('findAll', function(callback) { return this.find({ }, callback); }); module.exports = { server_port : 3000, db_url : 'mongodb://localhost:27017/local', db_schemas : [ {file : './user_schema', collection : 'users6', schemaName : 'UserSchema', modelName : 'UserModel'}, {file : './coffeeshop_schema', collection : 'coffeeshop', schemaName : 'CoffeeShopSchema', modelName : 'CoffeeShopModel'} ],

커피숍 데이터 추가 함수 작성 라우팅 함수들을 만들기 위해 coffeeshop.js 파일을 만들고 add 함수 추가 var add = function(req, res) { console.log('coffeeshop 모듈 안에 있는 add 호출됨.'); var paramName = req.param('name'); var paramAddress = req.param('address'); var paramTel = req.param('tel'); var paramLongitude = req.param('longitude'); var paramLatitude = req.param('latitude'); var database = req.app.get('database'); if (database.db) { addCoffeeShop(database, paramName, paramAddress, paramTel, paramLongitude, paramLatitude, function(err, result) { if (err) { ….. }

커피숍 데이터 추가 함수 작성 라우팅 함수들을 만들기 위해 coffeeshop.js 파일을 만들고 add 함수 추가 if (result) { console.dir(result); res.writeHead('200', {'Content-Type' : 'text/html;charset=utf8'}); res.write('<h2>커피숍 추가 성공</h2>'); res.end(); } else { res.write('<h2>커피숍 추가 실패</h2>'); } }); res.write('<h2>데이터베이스 연결 실패</h2>'); };

데이터베이스에 추가하는 함수 작성 데이터베이스에 커피숍 데이터를 추가하는 addcoffeeShop 함수 작성 var addCoffeeShop = function(database, name, address, tel, longitude, latitude, callback) { console.log('addCoffeeShop 호출됨.'); var coffeeshop = new database.CoffeeShopModel({name : name, address : address, tel : tel, geometry : { type : 'Point', coordinates : [longitude, latitude] } ); coffeeshop.save(function(err) { if (err) { callback(err, null); return; console.log("커피숍 데이터 추가함."); callback(null, coffeeshop);

커피숍 리스트 조회 함수 추가 데이터베이스에서 커피숍 리스트 조회하는 함수 추가 var list = function(req, res) { console.log('coffeeshop 모듈 안에 있는 list 호출됨.'); var database = req.app.get('database'); if (database.db) { database.CoffeeShopModel.findAll(function(err, results) { if (err) { ….. } if (results) { console.dir(results); res.writeHead('200', {'Content-Type' : 'text/html;charset=utf8'}); res.write('<h2>커피숍 리스트</h2>'); res.write('<div><ul>'); for (var i = 0; i < results.length; i++) { var curName = results[i]._doc.name; var curLongitude = results[i]._doc.geometry.coordinates[0]; var curLatitude = results[i]._doc.geometry.coordinates[1]; 경도 좌표 : results[i]._doc.geometry.coordinates[0 위도 좌표 : results[i]._doc.geometry.coordinates[1]

라우팅 설정 방식 라우팅 함수 정보 등록 route_info : [ {file : './coffeeshop', path : '/process/addcoffeeshop', method : 'add', type : 'post'} ,{file : './coffeeshop', path : '/process/listcoffeeshop', method : 'list', type : 'post'} ],

웹페이지 작성 커피숍 정보를 추가하는 웹페이지 작성 <form method="post" action="/process/addcoffeeshop"> <table> <tr> <td><label>이름</label></td> <td><input type="text" name="name" value="스타벅스 삼성역점" /></td> </tr> <td><label>주소</label></td> <td><input type="text" name="address" value="서울특별시 강남구 테헤란로103길 9 제일빌딩" /></td> <td><label>경도</label></td> <td><input type="text" name="longitude" value="127.0638104" /></td> <td><label>위도</label></td> <td><input type="text" name="latitude" value="37.5101225" /></td>

지도에서 경위도 좌표 확인 경위도 좌표를 확인할 수 있는 사이트 있음 ▶ http://mygeoposition.com

웹페이지 작성 커피숍 리스트를 조회하는 웹페이지 작성 <h1>커피숍 리스트</h1> <br> <form method="post" action="/process/listcoffeeshop"> <table> <tr> <td><label>아래 [전송] 버튼을 누르세요.</label></td> </tr> </table> <input type="submit" value="전송" name="" /> </form>

커피숍 추가 후 데이터 확인 로그 및 데이터베이스 확인 ▶ http://localhost:3000/public/addcoffeeshop.html

2. 가장 가까운 커피숍 찾기 난이도 소요시간 20분

커피숍을 위치로 찾는 방법 가장 가까운 커피숍 찾기, 영역으로 커피숍 찾기, 반경으로 커피숍 찾기

스키마에 메소드 추가 가장 가까운 커피숍을 찾을 수 있는 findNear 메소드 추가 // 가장 가까운 커피숍 조회 CoffeeShopSchema.static('findNear', function(longitude, latitude, maxDistance, callback) { console.log('CoffeeShopSchema의 findNear 호출됨.'); this.find().where('geometry').near( {center : {type : 'Point', coordinates : [parseFloat(longitude), parseFloat(latitude)] }, maxDistance : maxDistance }).limit(1).exec(callback); }); ……. find().where(속성 이름).near(조회 조건)

라우팅 함수 추가 가장 가까운 커피숍을 찾기 위한 라우팅 함수 추가 var findNear = function(req, res) { console.log('coffeeshop 모듈 안에 있는 findNear 호출됨.'); var paramLongitude = req.param('longitude'); var paramLatitude = req.param('latitude'); var maxDistance = 1000; var database = req.app.get('database'); if (database.db) { database.CoffeeShopModel.findNear(paramLongitude, paramLatitude, maxDistance, function(err, results) { if (err) { ….. } if (results) { console.dir(results); res.writeHead('200', {'Content-Type' : 'text/html;charset=utf8'}); res.write('<h2>가까운 커피숍</h2>'); res.write('<div><ul>');

라우팅 함수 추가 가장 가까운 커피숍을 찾기 위한 라우팅 함수 추가 for (var i = 0; i < results.length; i++) { var curName = results[i]._doc.name; var curAddress = results[i]._doc.address; var curTel = results[i]._doc.tel; var curLongitude = results[i]._doc.geometry.coordinates[0]; var curLatitude = results[i]._doc.geometry.coordinates[1]; res.write(' <li>#' + i + ' : ' + curName + ', ' + curAddress + ', ' + curTel + ', ' + curLongitude + ', ' + curLatitude + '</li>'); } res.write('</ul></div>'); res.end(); } else { res.writeHead('200', {'Content-Type' : 'text/html;charset=utf8'}); res.write('<h2>가까운 커피숍 조회 실패</h2>');

웹페이지 작성 가까운 커피숍 검색 요청을 위한 웹페이지 작성 <p>삼성역 3번 출구 버스 정류장</p> <br> <form method="post" action="/process/nearcoffeeshop"> <table> <tr> <td><label>경도</label></td> <td><input type="text" name="longitude" value="127.0632954" /></td> </tr> <td><label>위도</label></td> <td><input type="text" name="latitude" value="37.5079523" /></td> </table> <input type="submit" value="전송" name="" /> </form>

설정에 등록 후 확인 config.js 파일에 라우팅 함수 등록 후 확인 route_info : [ {file : './coffeeshop', path : '/process/addcoffeeshop', method : 'add', type : 'post'} ,{file : './coffeeshop', path : '/process/listcoffeeshop', method : 'list', type : 'post'} ,{file : './coffeeshop', path : '/process/nearcoffeeshop', method : 'findNear', type : 'post'} ], ▶ http://localhost:3000/public/nearcoffeeshop.html

3. 영역 안의 커피숍 찾기 난이도 소요시간 30분

스키마에 메소드 추가 앞에서 했던 과정과 같은 과정으로 진행 find().where(속성 이름).within(조회 조건) // 일정 범위 안의 커피숍 조회 CoffeeShopSchema.static('findWithin', function(topleft_longitude, topleft_latitude, bottomright_longitude, bottomright_latitude, callback) { console.log('CoffeeShopSchema의 findWithin 호출됨.'); this.find().where('geometry').within( {box : [[parseFloat(topleft_longitude), parseFloat(topleft_latitude)], [parseFloat(bottomright_longitude), parseFloat(bottomright_latitude)]] }).exec(callback); }); find().where(속성 이름).within(조회 조건)

라우팅 함수 추가 커피숍 검색을 위한 라우팅 함수 추가 var findWithin = function(req, res) { console.log('coffeeshop 모듈 안에 있는 findWithin 호출됨.'); var paramTopLeftLongitude = req.param('topleft_longitude'); var paramTopLeftLatitude = req.param('topleft_latitude'); var paramBottomRightLongitude = req.param('bottomright_longitude'); var paramBottomRightLatitude = req.param('bottomright_latitude'); var database = req.app.get('database'); if (database.db) { database.CoffeeShopModel.findWithin(paramTopLeftLongitude, paramTopLeftLatitude, paramBottomRightLongitude, paramBottomRightLatitude, function(err, results) { if (err) { ….. } ……. module.exports.findWithin = findWithin;

웹 페이지 작성 검색 요청을 위한 웹페이지 작성 <p>삼성역 3번 출구와 4번 출구 부근의 영역 (사각형 박스)</p> <br> <form method="post" action="/process/withincoffeeshop"> <table> <tr> <td><label>왼쪽 윗부분의 경도</label></td> <td><input type="text" name="topleft_longitude" value="127.0617076" /></td> </tr> <td><label>왼쪽 윗부분의 위도</label></td> <td><input type="text" name="topleft_latitude" value="37.5082076" /></td> <td><label>오른쪽 아랫부분의 경도</label></td> <td><input type="text" name="bottomright_longitude" value="127.0637568" /></td>

설정에 추가 후 확인 라우팅 함수를 config.js 파일에 추가 후 기능 동작 확인 route_info : [ {file : './coffeeshop', path : '/process/addcoffeeshop', method : 'add', type : 'post'} ,{file : './coffeeshop', path : '/process/listcoffeeshop', method : 'list', type : 'post'} ,{file : './coffeeshop', path : '/process/nearcoffeeshop', method : 'findNear', type : 'post'} ,{file : './coffeeshop', path : '/process/withincoffeeshop', method : 'findWithin', type : 'post'} ], ……. ▶ http://localhost:3000/public/withincoffeeshop.html

4. 반경 안의 커피숍 찾기 난이도 소요시간 30분

스키마에 메소드 추가 앞에서 했던 과정과 같은 과정으로 진행 // 일정 반경 안의 커피숍 조회 CoffeeShopSchema.static('findCircle', function(center_longitude, center_latitude, radius, callback) { console.log('CoffeeShopSchema의 findCircle 호출됨.'); // change radian : 1/6371 -> 1km this.find().where('geometry').within( {center : [parseFloat(center_longitude), parseFloat(center_latitude)], radius : parseFloat(radius/6371000), unique : true, spherical : true }).exec(callback); });

라우팅 함수 추가 커피숍 검색을 위한 라우팅 함수 추가 var findCircle = function(req, res) { console.log('coffeeshop 모듈 안에 있는 findCircle 호출됨.'); var paramCenterLongitude = req.param('center_longitude'); var paramCenterLatitude = req.param('center_latitude'); var paramRadius = req.param('radius'); var database = req.app.get('database'); if (database.db) { database.CoffeeShopModel.findCircle(paramCenterLongitude, paramCenterLatitude, paramRadius, function(err, results) { if (err) { ….. } ……. module.exports.findCircle = findCircle;

웹 페이지 작성 검색 요청을 위한 웹페이지 작성 <p>삼성역 3번 출구 버스 정류장 반경 100m (원)</p> <br> <form method="post" action="/process/circlecoffeeshop"> <table> <tr> <td><label>중심점 경도</label></td> <td><input type="text" name="center_longitude" value="127.0632954" /></td> </tr> <td><label>중심점 위도</label></td> <td><input type="text" name="center_latitude" value="37.5079523" /></td> <td><label>반경</label></td> <td><input type="text" name="radius" value="100" /></td> </table>

설정에 추가 후 확인 라우팅 함수를 config.js 파일에 추가 후 기능 동작 확인 route_info : [ ……. ,{file : './coffeeshop', path : '/process/withincoffeeshop', method : 'findWithin', type : 'post'} ,{file : './coffeeshop', path : '/process/circlecoffeeshop', method : 'findCircle', type : 'post'} ], ▶ http://localhost:3000/public/circlecoffeeshop.html

5. 지도에 커피숍의 위치 표시하기 난이도 소요시간 30분

구글맵으로 내 위치 표시 내 위치를 표시할 수 있음 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" id="viewport" content="width=device-width, height=device-height, initial-scale=1“ > <title>구글맵 1</title> <style> * { margin: 0; padding: 0; } … <body onload="onLoad()"> <p>구글맵으로 내 위치 표시하기</p> <div id="map"></div> </body>

자바스크립트 코드 추가 구글맵 라이브러리 로딩하여 사용 <script src="https://maps.googleapis.com/maps/api/js"></script> <script> function onLoad() { initMap(); } var map; var centerLocation = {lat: 37.5079523, lng: 127.0632954}; function initMap() { map = new google.maps.Map(document.getElementById('map'), { center: centerLocation, zoom: 17 }); var marker = new google.maps.Marker({ position:centerLocation, icon:'mylocation.png', animation:google.maps.Animation.BOUNCE marker.setMap(map);

구글맵 라이브러리 라이브러리 사용하고 API Key 발급받아 등록해야 함 https://maps.googleapis.com/maps/api/js https://maps.googleapis.com/maps/api/js?key=OOOOOOOOOOOOOOOOOOO https://developers.google.com/maps/documentation/javascript/get-api-key?hl=ko 속성 설명 center 지도가 어느 지역을 보여줄 것인지를 좌표로 지정합니다. 자바스크립트 객체 안에 lat와 lng 속성으로 좌표 값을 넣어줍니다. 예) {lat: 37.5079523, lng: 127.0632954} zoom 지도 확대 수준을 지정합니다. 구글맵은 이미지를 받아오는 방식이기 때문에 확대 수준(zoom level)에 따라 서버에 이미지가 만들어져 있습니다. 값이 클수록 더 자세한 지도 이미지를 받아오게 됩니다.

내 위치 표시 지도를 띄우면 내 위치가 표시됨 ▶ http://localhost:3000/public/map.html

가장 가까운 커피숍 찾아 보여주기 웹페이지 작성 <form method="post" action="/process/nearcoffeeshop2"> <table> <tr> <td><label>경도</label></td> <td><input type="text" name="longitude" value="127.0632954" ></td> </tr> <td><label>위도</label></td> <td><input type="text" name="latitude" value="37.5079523" ></td> </table> <input type="submit" value="전송" name="" > </form>

새로운 라우팅 함수 만들고 등록 findNear2 함수 만들어 등록 if (database.db) { database.CoffeeShopModel.findNear(paramLongitude, paramLatitude, maxDistance, function(err, results) { if (err) { ….. } if (results) { console.dir(results); if (results.length > 0) { res.render('findnear.ejs', {result: results[0]._doc, paramLatitude: paramLatitude, paramLongitude: paramLongitude}); } else { res.writeHead('200', {'Content-Type':'text/html;charset=utf8'}); res.write('<h2>가까운 커피숍 데이터가 없습니다.</h2>'); res.end(); }

템플레이트 파일 작성 라우팅 함수에서 사용하는 findnear.ejs 파일 작성 <script> function onLoad() { initMap(); } var map; var centerLocation = {lat: <%= paramLatitude %>, lng: <%= paramLongitude %>}; var coffeeLocation = {lat: <%= result.geometry.coordinates[1] %>, lng: <%= result.geometry.coordinates[0] %>}; function initMap() { map = new google.maps.Map(document.getElementById('map'), { center: centerLocation, zoom: 17 });

템플레이트 파일 작성 라우팅 함수에서 사용하는 findnear.ejs 파일 작성 var myMarker = new google.maps.Marker({ position:centerLocation, icon:'/public/mylocation.png', animation:google.maps.Animation.BOUNCE }); myMarker.setMap(map); var coffeeMarker = new google.maps.Marker({ position:coffeeLocation, icon:'/public/coffee.png' coffeeMarker.setMap(map); } </script>

지도에 표시되는 결과 확인 요청 후 응답으로 지도가 표시되는지 확인 ▶ http://localhost:3000/public/nearcoffeeshop2.html

일정 범위 안의 커피숍 검색 이전 과정과 마찬가지로 진행 뷰 엔진으로 응답 문서 만들어지도록 구성 if (results.length > 0) { res.render('findwithin.ejs', {result: results[0]._doc, paramLongitude: paramLongitude, paramLatitude: paramLatitude, paramTopLeftLongitude: paramTopLeftLongitude, paramTopLeftLatitude: paramTopLeftLatitude, paramBottomRightLongitude: paramBottomRightLongitude, paramBottomRightLatitude: paramBottomRightLatitude});

템플레이트 파일 작성 라우팅 함수에서 사용하는 findwithin.ejs 파일 작성 // 사각형 검색 영역을 위한 좌표 var coords =new google.maps.LatLngBounds( {lat:<%= paramTopLeftLatitude %>, lng:<%= paramTopLeftLongitude %>}, {lat:<%= paramBottomRightLatitude %>, lng:<%= paramBottomRightLongitude %>} ); …. // 검색하려는 영역 표시 var rectangle = new google.maps.Rectangle({ bounds:coords, strokeColor:"#0000FF", strokeOpacity:0.8, strokeWeight:2, fillColor:"#0000FF", fillOpacity:0.4 }); rectangle.setMap(map);

지도에 표시되는 결과 확인 요청 후 응답으로 지도가 표시되는지 확인 ▶ http://localhost:3000/public/withincoffeeshop2.html

참고 문헌 [ References] 기본 서적 2017, 정재곤, “Do it! Node.js 프로그래밍 (개정판)”, 이지스퍼블리싱 Node.js Site http://nodejs.org/