๐บ๏ธ Geolocation API๋ก ์์น, ๋ ์จ ์ ๋ณด๋ฅผ ์ป์ด์ค๊ธฐ
Geolocation API
Geolocation API๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ก๊ทธ๋จ์ด ์ฌ์ฉ์์ ์ค์ ์์น๋ฅผ ๋ธ๋ผ์ฐ์ ์๊ฒ ์์ฒญํ ์ ์๋๋ก ํด์ค๋ค.
๋ฌผ๋ก ์ด๋ฐ ์ ๋ณด๋ค์ ์ฃผ์ํ ๊ฐ์ธ ์ ๋ณด์ ๊ด๋ จ๋์ด ์์ผ๋ฏ๋ก, ๋ธ๋ผ์ฐ์ ์์๋ Geolocation API๊ฐ ๋ฌผ๋ฆฌ์ ์ธ ์์น ์ ๋ณด์ ์ ๊ทผํ๊ธฐ ์ ์ ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ก๊ทธ๋จ์ด ํญ์ ์ฌ์ฉ์์ ํ๋ฝ์ ๋ฐ๋๋ก ํ๊ณ ์๋ค.
Geolocation API๋ ํ๊ฒฝ์ ๋ฐ๋ผ GPS๋ฅผ ๋น๋กฏํ Wi-Fi, ํด๋์ ํ์ ๊ธฐ์ง๊ตญ, IP ์ฃผ์ ๋ฑ์์ ์์น ์ ๋ณด๋ฅผ ์์๋ธ๋ค.
๋ธ๋ผ์ฐ์ ๊ฐ ์ง์ํ๋ Geolocation API๋navigator.gelocation์ผ๋ก ์ ์๋์ด ์๋ค.
Geolocation API ์ฌ์ฉ๋ฒ
์ด ๊ฐ์ฒด์๋ ๋ค์ ์ธ๊ฐ์ง ๋ฉ์๋๊ฐ ์กด์ฌํ๋ค.
navigator.geolocation.getCurrentPosition()
- ์ฌ์ฉ์์ ํ์ฌ ์์น๋ฅผ ์์ฒญํ๋ค.
Geolocation API๋ ๋น๋๊ธฐ์ ์ผ๋ก ๋์ํ๋ค.
์์น๋ฅผ ์์ฒญํ๋ ๊ฐ์ฅ ๊ฐ๋จํ ํํ๋ ๋ค์๊ณผ ๊ฐ๋ค.
navigator.geolocation.getCurrentPosition(function(pos) {
console.log(pos);
var latitude = pos.coords.latitude;
var longitude = pos.coords.longitude;
alert("ํ์ฌ ์์น๋ : " + latitude + ", "+ longitude);
});
์ฑ๊ณต์ ์ธ geolocation ์์ฒญ์ ์๋์ ๊ฒฝ๋ ์ธ์๋ ๋ฏธํฐ ๋จ์์ ์ ํ๋ ๊ฐ์ ๋ฐํํ๋ค. ์ด ์ ํ๋ ๊ฐ์ ํด๋น ์ขํ์ ์ผ๋ง๋ ๊ฐ๊น์ด์ง๋ฅผ ๋ํ๋ธ๋ค.
Position ๊ฐ์ฒด์ ์ฃผ์ ์์ฑ
์์ฑ | ๊ฐ์ |
coords.latitude | ๊ณ ๋ |
coords.latitude | ์๋ |
coords.longitude | ๊ฒฝ๋ |
coords.accuracy | ์๋/๊ฒฝ๋์ ์ค์ฐจ(m) |
coords.altitudeAccuracy | ๊ณ ๋์ ์ค์ฐจ(m) |
coords.heading | ๋ฐฉ์(๋) |
coords.speed | ์๋(m/์ด) |
timestamp | ์ทจ๋ ๋ ์ง (1970๋ ๋ถํฐ ๊ฒฝ๊ณผ ๋ฐ๋ฆฌ์ด) |
+ ์์น ๊ตฌํ ๋ ์๋ฌ ์ฒ๋ฆฌ๋ ์ต์ ์ค์ ํ๊ธฐ
getCurrentPosition()์ ์ฒซ ๋ฒ์งธ ์ฝ๋ฐฑ ์ธ์๋ฟ๋ง ์๋๋ผ, geolocation ์์ฒญ์ด ์คํจํ์ ๋ ํธ์ถ๋ ๋ ๋ฒ์งธ ์ฝ๋ฐฑ ์ธ์๋ฅผ ์ ํ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
์๋ฌ์ฒ๋ฆฌ(์คํจ์ฝ๋ฐฑ)๋ ์ธ์๋ก PositionError๊ฐ์ฒด๋ฅผ ๋ฐ๋๋ค. ์ฝ๋ฐฑํจ์์ ๋ด๋ถ์์๋ ์ด ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ์ค๋ฅ ๋ฉ์์ง ํ์ ๋ฑ์ ์ฒ๋ฆฌํ๋ค.
navigator.geolocation.getCurrentPosition(showYourLocation, showErrorMsg);
function showYourLocation(position) { // ์ฑ๊ณตํ์๋ ์คํ
var userLat = position.coords.latitude;
var userLng = position.coords.longitude;
}
function showErrorMsg(error) { // ์คํจํ์๋ ์คํ
switch(error.code) {
case error.PERMISSION_DENIED:
loc.innerHTML = "์ด ๋ฌธ์ฅ์ ์ฌ์ฉ์๊ฐ Geolocation API์ ์ฌ์ฉ ์์ฒญ์ ๊ฑฐ๋ถํ์ ๋ ๋ํ๋ฉ๋๋ค!"
break;
case error.POSITION_UNAVAILABLE:
loc.innerHTML = "์ด ๋ฌธ์ฅ์ ๊ฐ์ ธ์จ ์์น ์ ๋ณด๋ฅผ ์ฌ์ฉํ ์ ์์ ๋ ๋ํ๋ฉ๋๋ค!"
break;
case error.TIMEOUT:
loc.innerHTML = "์ด ๋ฌธ์ฅ์ ์์น ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํ ์์ฒญ์ด ํ์ฉ ์๊ฐ์ ์ด๊ณผํ์ ๋ ๋ํ๋ฉ๋๋ค!"
break;
case error.UNKNOWN_ERROR:
loc.innerHTML = "์ด ๋ฌธ์ฅ์ ์ ์ ์๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ ๋ ๋ํ๋ฉ๋๋ค!"
break;
}
}
PositionError ๊ฐ์ฒด์ ์ฃผ์ ์์ฑ
์์ฑ | ๊ฐ์ |
code | ์๋ฌ ์ฝ๋ |
message | ์์ธ ์๋ฌ ๋ฉ์์ง |
์ด ๋ ๋ฉ์๋๋ ์ฑ๊ณต ์ฝ๋ฐฑ๊ณผ ์ค๋ฅ ์ฝ๋ฐฑ๋ฟ๋ง ์๋๋ผ ์ธ๋ฒ์ฌ ์ ํ์ ์ธ์๋ก ์ต์ ๊ฐ์ฒด๋ ์ฌ์ฉํ ์ ์๋ค.
์ต์ ์๋ ๋์ ์์ค์ ์์น ์ ํ๋๊ฐ ์๊ตฌ๋๋์ง, ์ด๋ค ์์น '์ํ'๋ฅผ ํ์ฉํ ์ง, ์์คํ ์ด ์ผ๋ง๋ ์ค๋ ์๊ฐ๋์ ์์น ์ถ์ ์ ํ์ฉํ ์ง๋ฅผ ์ง์ ํ ์ ์๋ค.
์ต์ ์ '์ต์ ๋ช : ๊ฐ' ํ์์ ํด์๋ก ์ง์ ํ ์ ์๋ค. ์ง์ ํ ์ ์๋ ์ต์ ์ ์๋ ํ์ ๊ฐ๋ค.
์ต์ | ๊ฐ์ |
timeout | ์์น ์ ๋ณด ์ฝ๊ธฐ ํ์์์(๋ฐ๋ฆฌ์ด) |
maximumAge | ์์น ์ ๋ณด์ ์บ์ ๊ธฐํ (๋ฐ๋ฆฌ์ด). 0์ด๋ฉด ์บ์ ์ํจ(=ํญ์ ์ต์ ์ ๋ณด๋ฅผ ์ป์) |
enableHighAccuracy | ๋์ ์ ํ๋์ ์์น ์ ๋ณด๋ฅผ ๊ตฌํ ์ง(true | false) enableHighAccuracy ์ต์ ์ true๋ก ํ ๊ฒฝ์ฐ ์ค๋งํธํฐ ํ๊ฒฝ์์๋ GPS์์ ์์น์ ๋ณด๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ๋ค. ์ด๊ฒ์ผ๋ก ์์น ์ ๋ณด์ ์ ํ๋๋ ํฅ์๋์ง๋ง ๊ทธ๋งํผ ๋ฐฐํฐ๋ฆฌ์๋น๋ ๋น ๋ฅด๋ค. |
navigator.geolocation.watchPosition()
- ํ์ฌ ์์น๋ฅผ ์์ฒญํ๋ ๊ฒ์ ๋์ผํ์ง๋ง, ์ง์์ ์ผ๋ก ํ์ธํ์ฌ ์ฌ์ฉ์์ ์์น๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์ง์ ๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ํธ์ถํ๋ค.
navigator.geolocation.clearWatch()
- ์ฌ์ฉ์์ ์์น ์ ๋ณด๋ฅผ ์์งํ๋ ์์ ์ ์ค๋จํ๋ค. ์ด ๋ฉ์๋์ ์ ๋ฌ์ธ์๋ watchPosition()์ ํธ์ถํ ๋ค์ ๋ฐํ๋ฐ์ ์ซ์ ๊ฐ(๊ฐ์๋ฅผ ์๋ณํ๊ธฐ ์ํ ID๊ฐ)์ด์ด์ผ ํ๋ค.
Geolocation ์์
๋์ ํ์ฌ ์์น์ ๋ณด ์ถ๋ ฅํ๊ธฐ
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div id="myLocationInfo"></div>
</body>
</html>
/* ๋น๋๊ธฐ์ ์ผ๋ก ํ์ฌ ์์น๋ฅผ ์์๋ด์ด ์ง์ ๋ ์์์ ์ถ๋ ฅํ๋ค. */
function whereami(elt) {
// ์ด ๊ฐ์ฒด๋ฅผ getCurrentPosition() ๋ฉ์๋์ ์ธ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌํ๋ค.
var options = {
// ๊ฐ๋ฅํ ๊ฒฝ์ฐ, ๋์ ์ ํ๋์ ์์น(์๋ฅผ ๋ค์ด, GPS ๋ฑ) ๋ฅผ ์ฝ์ด์ค๋ ค๋ฉด true๋ก ์ค์
// ๊ทธ๋ฌ๋ ์ด ๊ธฐ๋ฅ์ ๋ฐฐํฐ๋ฆฌ ์ง์ ์๊ฐ์ ์ํฅ์ ๋ฏธ์น๋ค.
enableHighAccuracy: false, // ๋๋ต์ ์ธ ๊ฐ์ด๋ผ๋ ์๊ด ์์: ๊ธฐ๋ณธ๊ฐ
// ์์น ์ ๋ณด๊ฐ ์ถฉ๋ถํ ์บ์๋์์ผ๋ฉด, ์ด ํ๋กํผํฐ๋ฅผ ์ค์ ํ์,
// ์์น ์ ๋ณด๋ฅผ ๊ฐ์ ๋ก ์ฌํ์ธํ๊ธฐ ์ํด ์ฌ์ฉํ๊ธฐ๋ ํ๋ ์ด ๊ฐ์ ๊ธฐ๋ณธ ๊ฐ์ 0์ด๋ค.
maximumAge: 30000, // 5๋ถ์ด ์ง๋๊ธฐ ์ ๊น์ง๋ ์์ ๋์ง ์์๋ ๋จ
// ์์น ์ ๋ณด๋ฅผ ๋ฐ๊ธฐ ์ํด ์ผ๋ง๋ ์ค๋ซ๋์ ๋๊ธฐํ ๊ฒ์ธ๊ฐ?
// ๊ธฐ๋ณธ๊ฐ์ Infinity์ด๋ฏ๋ก getCurrentPosition()์ ๋ฌดํ์ ๋๊ธฐํ๋ค.
timeout: 15000 // 15์ด ์ด์ ๊ธฐ๋ค๋ฆฌ์ง ์๋๋ค.
}
if(navigator.geolocation) // geolocation ์ ์ง์ํ๋ค๋ฉด ์์น๋ฅผ ์์ฒญํ๋ค.
navigator.geolocation.getCurrentPosition(success, error, options);
else
elt.innerHTML = "์ด ๋ธ๋ผ์ฐ์ ์์๋ Geolocation์ด ์ง์๋์ง ์์ต๋๋ค.";
// geolocation ์์ฒญ์ด ์คํจํ๋ฉด ์ด ํจ์๋ฅผ ํธ์ถํ๋ค.
function error(e) {
// ์ค๋ฅ ๊ฐ์ฒด์๋ ์์น ์ฝ๋์ ํ
์คํธ ๋ฉ์์ง๊ฐ ์กด์ฌํ๋ค.
// ์ฝ๋ ๊ฐ์ ๋ค์๊ณผ ๊ฐ๋ค.
// 1: ์ฌ์ฉ์๊ฐ ์์น ์ ๋ณด๋ฅผ ๊ณต์ ๊ถํ์ ์ ๊ณตํ์ง ์์.
// 2: ๋ธ๋ผ์ฐ์ ๊ฐ ์์น๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์.
// 3: ํ์์์์ด ๋ฐ์๋จ.
elt.innerHTML = "Geolocation ์ค๋ฅ "+e.code +": " + e.message;
}
// geolocation ์์ฒญ์ด ์ฑ๊ณตํ๋ฉด ์ด ํจ์๊ฐ ํธ์ถ๋๋ค.
function success(pos) {
console.log(pos); // [๋๋ฒ๊น
] Position ๊ฐ์ฒด ๋ด์ฉ ํ์ธ
// ํญ์ ๊ฐ์ ธ์ฌ ์ ์๋ ํ๋๋ค์ด๋ค. timestamp๋ coords ๊ฐ์ฒด ๋ด๋ถ์ ์์ง ์๊ณ ,
// ์ธ๋ถ์์ ๊ฐ์ ธ์ค๋ ํ๋๋ผ๋ ์ ์ ์ฃผ์ํ๋ค.
var msg = "๋น์ ์ " +
new Date(pos.timestamp).toLocaleString() + "์ " +
" ์๋ " + pos.coords.latitude +
" ๊ฒฝ๋ " + pos.coords.longitude + "์์ "+
" ์ฝ " + pos.coords.accuracy + " ๋ฏธํฐ ๋จ์ด์ง ๊ณณ์ ์์ต๋๋ค.";
// ํด๋น ๊ธฐ๊ธฐ๊ฐ ๊ณ ๋ (altitude)๋ฅผ ๋ฐํํ๋ฉด, ํด๋น ์ ๋ณด๋ฅผ ์ถ๊ฐํ๋ค.
if(pos.coords.altitude) {
msg += " ๋น์ ์ ํด๋ฐ " + pos.coords.altitude + " ± " +
pos.coords.altitudeAccuracy + " ๋ฏธํฐ์ ์์ต๋๋ค.";
}
// ํด๋น ๊ธฐ๊ธฐ๊ฐ ์๋์ ๋ถ์ชฝ ๊ธฐ์ค ๊ฐ (heading)์ ๋ฐํํ๋ค๋ฉด ์ญ์ ์ถ๊ฐํด์ค๋ค.
if(pos.coords.speed) {
msg += " ๋น์ ์ " + pos.coords.heading + " ๋ฐฉํฅ์ผ๋ก " +
"์ด์ " + pos.coords.speed + "(m/s)์ ์๋๋ก ์์ง์ด๊ณ ์์ต๋๋ค.";
}
elt.innerHTML = msg; // ๋ชจ๋ ์์น ์ ๋ณด๋ฅผ ์ถ๋ ฅํ๋ค.
}
}
// ๋์ ์์น์ ๋ณด๋ฅผ ์ถ๋ ฅํ ๊ฐ์ฒด ๊ตฌํ๊ธฐ
var elt = document.getElementById("myLocationInfo");
// ๋์ ์์น์ ๋ณด ์ถ๋ ฅํ๊ธฐ
whereami(elt);
์ ๊ธฐ์ ์ผ๋ก ์์น ์ ๋ณด ์ป๊ธฐ
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="http://code.jquery.com/jquery-1.11.0.js"></script>
<script>
$(function() {
// Geolocation API์ ์ก์ธ์คํ ์ ์๋์ง๋ฅผ ํ์ธ
if (navigator.geolocation) {
//์์น ์ ๋ณด๋ฅผ ์ ๊ธฐ์ ์ผ๋ก ์ป๊ธฐ
var id = navigator.geolocation.watchPosition(
function(pos) {
$('#latitude').html(pos.coords.latitude); // ์๋
$('#longitude').html(pos.coords.longitude); // ๊ฒฝ๋
});
// ๋ฒํผ ํด๋ฆญ์ผ๋ก ๊ฐ์๋ฅผ ์ค์ง
$('#btnStop').click(function() {
navigator.geolocation.clearWatch(id);
});
} else {
alert("์ด ๋ธ๋ผ์ฐ์ ์์๋ Geolocation์ด ์ง์๋์ง ์์ต๋๋ค.")
}
});
</script>
</head>
<body>
<ul>
<li>์๋:<span id="latitude"></span></li>
<li>๊ฒฝ๋:<span id="longitude"></span></li>
</ul>
<input id="btnStop" type="button" value="๊ฐ์๋ฅผ ๋๋ธ๋ค" />
</body>
</html>
๋ด ์์น์ ๋ ์จ, ์จ๋ ๊ฐ์ ธ์ค๊ธฐ
api๋ฅผ ์ฐ๊ธฐ์ํด ํด๋น ์น์ฌ์ดํธ์ ๋ค์ด๊ฐ์ ํ์๊ฐ์ ํด์ฃผ์. ๊ทธ๋ฆฌ๊ณ api key๋ฅผ ์ป์.
์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ api๋ Current Weather Data๋ผ๋ api์ด๋ค.
๋ค์ํ rest api์์ฒญ ๋ค์ด ์๊ณ , ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ ๊ฒ์, ๊ฒฝ๋์ ์๋๋ฅผ ํตํด ํด๋น ๋ ์จ ์ ๋ณด๋ฅผ ์ป๋ ๊ฒ์ด๋ค.
ํด๋น uri๋ก ๋ค์ด๊ฐ๋ฉด jsonํํ์ ๋ฐ์ดํฐ๋ฅผ ์ป์์ ์๋ค. ์ฐ๋ฆฌ๋ fetch๋ฅผ ํตํด ajaxํต์ ์ผ๋ก ํด๋น json๋ฐ์ดํฐ ๊ฐ์ ๊ฐ์ ธ์ ์ฌ์ฉํ ๊ฒ์ด๋ค.
[์ต์ข ์ฝ๋]
const API_KEY = '๋น์ ์ API ํค๋ฅผ ์ฌ๊ธฐ์ ๊ธฐ์ฌํ์ธ์';
function onGeoOk(position) {
const latitude = position.coords.latitude;
const longitude = position.coords.longitude;
// console.log(`You live in ${latitude} and ${longitude}`);
fetch(
`https://api.openweathermap.org/data/2.5/weather?lat=${latitude}&lon=${longitude}&appid=${API_KEY}&units=metric`,
)
.then(response => response.json())
.then(data => console.log(`์จ๋ : ${data.main.temp}, ๋ ์จ : ${data.weather[0].main}`));
}
function onGeoError() {
alert("Can't find you. No weather for you.");
}
navigator.geolocation.getCurrentPosition(onGeoOk, onGeoError);