March 18, 2020
๋ค์ด๋ฒ ์ง๋ API์ ๊ณต์ ๋ง์คํฌ ํ๋งค ํํฉ ์กฐํ API๋ฅผ ์ด์ฉํด์ ๋ง๋ ์ฝ๋ก๋ ๋ง์คํฌ ํ๋งค์ฒ ์ฐพ๊ธฐ ์ดํ๋ฆฌ์ผ์ด์
์ ์ฒด ํ๋ฉดํฌ๊ธฐ์ ๋ง๊ฒ ๋ค์ด๋ฒ์ง๋๋ก ์ฑ์ฐ๊ณ , ํ๋ฉด ์ข์ธก์
<BackgroundContainer>
<ContentsMenubar name="maskmap" />
<Description>
<button onClick={mylocationHandler}>๋ด ์์น</button>
<div>
<span
style={{
textAlign: 'center',
color: 'black',
background: 'rgba(255,255,255,0.7)',
}}
>
<div style={{ fontSize: '20px', fontFamily: 'escore8' }}>
{weekArr[week]}์์ผ
</div>
<div style={{ marginTop: '5px' }}>{weekMask[week]}</div>
</span>
<span style={{ background: 'green' }}>100๊ฐ์ด์</span>
<span style={{ background: 'orange' }}>30~100๊ฐ</span>
<span style={{ background: 'red' }}>2~30๊ฐ</span>
<span style={{ background: 'black' }}>์์</span>
</div>
</Description>
<MapContainer id="map"></MapContainer>
</BackgroundContainer>
์ปดํฌ๋ํธ๋ ํฌ๊ฒ
๋ ๊ฐ๋ก ๊ตฌ์ฑํ์๊ณ ๋ ์ปดํฌ๋ํธ ๋ชจ๋ styled-component
๋ก ๊ตฌ์ฑํ์๋ค.
let map = null
const week = new Date().getDay()
const weekArr = ['์ผ', '์', 'ํ', '์', '๋ชฉ', '๊ธ', 'ํ ']
const weekMask = [
'๋๊ตฌ๋',
'1,6๋
์',
'2,7๋
์',
'3,8๋
์',
'4,9๋
์',
'5,0๋
์',
'๋๊ตฌ๋',
]
map
: ๋ค์ด๋ฒ ์ง๋ API naver.maps.Map ๊ฐ์ฒด๊ฐ ๋ด๊ธธ ๋ณ์
week
: ํ์ฌ ์์ผ
weekArr
: ํ์ฌ ์์ผ์ ๋ํ ํ๊ธ์ถ๋ ฅ
weekMask
: ์์ผ์ ๋ํ ๋ง์คํฌ 5๋ถ์ ์ ๋ณด
<MapContainer id="map"></MapContainer>
๋จผ์ ์ง๋๊ฐ ๋ค์ด๊ฐ ์๋ฆฌ๋จผํธ๋ฅผ ์ง์ ํ๊ณ id ๊ฐ์ ๋ถ์ฌ, DOM์ ์ ๊ทผํ ์ ์๋๋ก ํด์ฃผ์๋ค.
useEffect(() => {
map = new naver.maps.Map('map', {
center: new naver.maps.LatLng(37.5666805, 126.9784147),
zoom: 10,
mapTypeId: naver.maps.MapTypeId.NORMAL
})
์ง๋๋ ๋ง์ดํธ๋ ํ์ ์คํ๋๋ useEffect
ํจ์๋ฅผ ํตํด ์์ฑํด์ฃผ์๋ค.
๊ธฐ๋ณธ์ ์ธ ์ ๋ณด(์ง๋ํ์ฌ์์น, ์ค, ํ์ )์ ๋ค์ด๋ฒ์ง๋์์ ์ ๊ณตํ ๊ธฐ๋ณธ์ ์ธ ์ ๋ณด๋ก ์ฌ์ฉํ์๋ค. (์์ธ์์ฒญ)
<button onClick={mylocationHandler}>๋ด ์์น</button>
์ฐ์ button ํด๋ฆญ ์ด๋ฒคํธํธ๋ค๋ฌ์ mylocationHandler ํจ์๋ฅผ ๋ฑ๋กํ๊ณ ,
const onSuccessGeolocation = position => {
var location = new naver.maps.LatLng(
position.coords.latitude,
position.coords.longitude
)
map.setCenter(location)
map.setZoom(16)
}
const onErrorGeolocation = () => {
// ์๋ฌ!!
}
const mylocationHandler = () => {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(
onSuccessGeolocation,
onErrorGeolocation
)
} else {
// ์๋ฌ
}
}
์ ์ ๊ฐ ์์น๊ถํ์ ํ์ฉํ๋ค๋ฉด getCurrentPosition ๋ฉ์๋๋ฅผ ํตํ์ฌ ํ์ฌ ์์น์ ๋ณด๋ฅผ map ๊ฐ์ฒด๋ณ์์ ๋ฃ์ด์ฃผ์๋ค.
naver.maps.Event.addListener(map, 'dragend', function(e) {
// ...
})
๋จผ์ API ํต์ ์ ์ ์ ๊ฐ ์ง๋๋ฅผ ๋๋๊ทธํ ๋๋ง๋ค ์์ฒญํ๊ฒ๋ ๊ตฌํํด๋ณด์๋๋ฐ
maps.Event์ addListener ๋ฉ์๋ parameter ์์ ํ์ฌ์ง๋ map
, dragend
์ด๋ฒคํธ, ์ฝ๋ฐฑํจ์
๋ฅผ ๋ฃ์ด์ฃผ์๋ค.
const url =
'https://8oi9s0nnth.apigw.ntruss.com/corona19-masks/v1/storesByGeo/json'
const query = `?lat=${map.getCenter().y}&lng=${map.getCenter().x}`
fetch(url + query)
.then(res => {
return res.json()
})
.then(json => {
// ...
})
API ํต์ ์ fetch๋ฅผ ์ด์ฉํ๊ณ then ๋ฉ์๋ ์ฒด์ด๋์ ํตํด ์์ฒญ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํด์ฃผ์๋ค.
๊ทธ๋ฆฌ๊ณ ๊ณต์ ๋ง์คํฌ ํ๋งค ํํฉ ์กฐํ API ์ ํ์ํ parameter๋ ์ ๋ฌ๋ฐ์ JSON ๋ฐ์ดํฐ ํ์์ด ์ ๋์์์ด์ ์ฐธ๊ณ ํ๋ฉฐ url์ ๊ตฌ์ฑํ์๋ค.
const remain_stat = {
plenty: 'green',
some: 'orange',
few: 'red',
empty: 'black',
break: 'black',
}
for (let i = 0; i < json.count; i++) {
var marker = new naver.maps.Marker({
icon: {
content: `<div style="font-size:10px; font-family:escore6; border:1px solid lightgrey; color:white; background:${
remain_stat[json.stores[i].remain_stat]
}; border-radius:5px; padding:4px;">${json.stores[i].name}</div>`,
},
position: new naver.maps.LatLng(json.stores[i].lat, json.stores[i].lng),
map: map,
})
}
๋ง์ง๋ง์ผ๋ก ๋ง์คํฌํ๋งคํ๋ ๊ณณ์ ํ๋งคํํฉ์ ํ์ํ๋ ๋ง์ปค๋ฅผ ๋ฃ์ด์ฃผ์๋๋ฐ ๊ณต์ ๋ง์คํฌ ํ๋งค ํํฉ ์กฐํ API ์์๋ ๋ง์คํฌ๊ฐฏ์์ ๋ฐ๋ฅธ ์๊น์ ํต์ผํด์ฃผ๋ ๊ฒ์ ๊ถ์ฅํ์ฌ์ ๊ทธ์ ๋ง๊ฒ ์๊น์ ์ง์ ํด์ฃผ์๋ค.
๋ น์(100๊ฐ ์ด์)/๋ ธ๋์(30~99๊ฐ)/๋นจ๊ฐ์(2~29๊ฐ)/ํ์(0~1๊ฐ)
ํด๋น ์ฑ์์ ์ง๋์ ๋ง์คํฌ ํํฉ ๋ง์ปค๋ฅผ ํ์ํ๋ ค๋ฉด ์ฐ์ ์ฌ์ฉ์๋ ์ง๋๋ฅผ ๋๋๊ทธํด์ผํ๋ค.
dragend
์ด๋ฒคํธ๋ผ ๋๋๊ทธ๊ฐ ์๋ฃ๋ ์์ ์ ํ๋ฒ๋ง api๋ฅผ ํธ์ถํ๋ค๋ ์ ์์ ํจ์จ์ ์ด์ง๋ง ux์ ์ผ๋ก๋ ๋ณ๋ก ์ข์ง ๋ชปํ ๊ฒ ๊ฐ๋ค.
์ด๊ธฐ ์ง๋ ๊ตฌ์ฑ์ (ํน์, ํ์ฌ์์น ๋ฒํผ์ ์ฒ์ ํด๋ฆญํ ์์ )์๋ ๋ง์ปค๋ฅผ ํ์ํด์ฃผ๋ ๊ธฐ๋ฅ์ ๋ฃ์ผ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค.
์ด๊ฑฐ๋ ์ง๋ API์ ๋ฌธ์ ์ง ๋ด ์ฝ๋์ ๋ฌธ์ ์ง ์์ง ํ์ ์ ๋ชปํ์ง๋ง ๋ด ์์น๊ฐ ์ ํํ ํ์๋์ง ์๋ ๊ฒ ๊ฐ๋ค.
๊ทธ๋๋ ๋ด ์์น ๊ทผ๋ฐฉ๊น์ง๋ ์ ํ์ํด์ฃผ๋ ๊ฒ ๊ฐ์์ ์ ์ ๊ฐ ํท๊ฐ๋ฆฌ์ง ์๊ฒ ๊ทธ๋ฅ๋ด์์น ๋ง์ปค๋ฅผ ๋นผ๋ฒ๋ ธ๋ค!