JavaScript

[JavaScript] Kakao Map API

๋ฒผ๋ฆฌ01 2024. 9. 19. 16:12

 

๐Ÿ“Œ ์นด์นด์˜ค๋งต api ์‹œ์ž‘ํ•˜๊ธฐ

 

Kakao Developers

์นด์นด์˜ค API๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•ด๋ณด์„ธ์š”. ์นด์นด์˜ค ๋กœ๊ทธ์ธ, ๋ฉ”์‹œ์ง€ ๋ณด๋‚ด๊ธฐ, ์นœ๊ตฌ API, ์ธ๊ณต์ง€๋Šฅ API ๋“ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

developers.kakao.com

 

 

๐ŸŒ ์ง€๋„ ๋„์šฐ๊ธฐ

Kakao Map API๋ฅผ ๋ฐœ๊ธ‰ ๋ฐ›์•˜๋‹ค๋ฉด ์ด์ œ ์ง€๋„๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. `html` ํŒŒ์ผ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

 <script type="text/javascript" src="//dapi.kakao.com/v2/maps/sdk.js?appkey=YOUR_API_KEY&libraries=services"></script>

 

 

`html`์— `map`์„ ๋„์šธ ์ ๋‹นํ•œ ์š”์†Œ๋ฅผ ๋งŒ๋“ ๋‹ค.

 <div class="map"></div>

 

 

๋‹ค์Œ๊ณผ ๊ฐ™์ด js ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์ง€๋„๋ฅผ ๋„์šธ ์ˆ˜ ์žˆ๋‹ค.

  const mapContainer = document.querySelector(".map"); // ์ง€๋„๋ฅผ ํ‘œ์‹œํ•  div

  const mapOption = {
    center: new kakao.maps.LatLng(latitude, longitude), // ์ง€๋„์˜ ์ค‘์‹ฌ์ขŒํ‘œ (์œ„๋„, ๊ฒฝ๋„)
    level: 6, // ์ง€๋„์˜ ํ™•๋Œ€ ๋ ˆ๋ฒจ. ํด์ˆ˜๋ก ๋ฉ€๋ฆฌ ๋ณด์ž„
  };

  // ์ง€๋„ ์ƒ์„ฑ
  const map = new kakao.maps.Map(mapContainer, mapOption);

 

์จ˜

 

[์ง€๋„ ์ƒ์„ฑํ•˜๊ธฐ]

https://apis.map.kakao.com/web/sample/basicMap/

 

 

 

๐ŸŒ  ์ง€๋„์— ๋งˆ์ปค ์ถ”๊ฐ€ํ•˜๊ธฐ

const mapContainer = document.querySelector(".map"); // ์ง€๋„๋ฅผ ํ‘œ์‹œํ•  div

const mapOption = {
center: new kakao.maps.LatLng(latitude, longitude), // ์ง€๋„์˜ ์ค‘์‹ฌ์ขŒํ‘œ (์œ„๋„, ๊ฒฝ๋„)
level: 6, // ์ง€๋„์˜ ํ™•๋Œ€ ๋ ˆ๋ฒจ. ํด์ˆ˜๋ก ๋ฉ€๋ฆฌ ๋ณด์ž„
};

// ์ง€๋„ ๊ฐ์ฒด ์ƒ์„ฑ
const map = new kakao.maps.Map(mapContainer, mapOption);
  
  
const marker = new kakao.maps.Marker({
  map: map,
  position: new kakao.maps.LatLng(latitude, longitude),
});

 

 


[๋งˆ์ปค ๋„์šฐ๊ธฐ]

https://apis.map.kakao.com/web/sample/basicMarker/

 

 

 

๐ŸŒ  ์ปค์Šคํ…€ ๋งˆ์ปค ๋งŒ๋“ค๊ธฐ

  const mapContainer = document.querySelector(".map"); // ์ง€๋„๋ฅผ ํ‘œ์‹œํ•  div

  const mapOption = {
    center: new kakao.maps.LatLng(latitude, longitude), // ์ง€๋„์˜ ์ค‘์‹ฌ์ขŒํ‘œ (์œ„๋„, ๊ฒฝ๋„)
    level: 6, // ์ง€๋„์˜ ํ™•๋Œ€ ๋ ˆ๋ฒจ. ํด์ˆ˜๋ก ๋ฉ€๋ฆฌ ๋ณด์ž„
  };

  // ์ง€๋„ ์ƒ์„ฑ
  const map = new kakao.maps.Map(mapContainer, mapOption);


// ์ปค์Šคํ…€ ๋งˆ์ปค ๋งŒ๋“ค๊ธฐ
const customMarkerImage = new kakao.maps.MarkerImage(
  "images/marker-red.png", // ๋งˆ์ปค ์ด๋ฏธ์ง€ URL
  new kakao.maps.Size(35, 35), // ๋งˆ์ปค ์ด๋ฏธ์ง€ ํฌ๊ธฐ
  {
    offset: new kakao.maps.Point(17, 35), // ๋งˆ์ปค์˜ ์ค‘์‹ฌ์  ์œ„์น˜
  }
);


// ๋‚ด ์œ„์น˜ ๋งˆ์ปค ์ถ”๊ฐ€
new kakao.maps.Marker({
  position: new kakao.maps.LatLng(
    latitude,
    longitude
  ),
  map: map,
  clickable: true,
  image: customMarkerImage,
});

 

 

 

 

 

[์ปค์Šคํ…€ ๋งˆ์ปค ๋งŒ๋“ค๊ธฐ]

https://apis.map.kakao.com/web/sample/basicMarkerImage/

 

 

 

 

๐ŸŒ  ๋งˆ์ปค์— ์ด๋ฒคํŠธ ์ถ”๊ฐ€ํ•˜๊ธฐ

  kakao.maps.event.addListener(marker, "mouseover", function () {
      infowindow.open(map, marker);
      spot.style.outline = "solid 2px #96b9ff";
    });

 

    kakao.maps.event.addListener(marker, "click", () => {
      spot.style.backgroundColor = "#96b9ff";
      spot.style.outline = "";
      spot.style.color = "white";

      const spotDiv = document.querySelector(`[data-id="${place.id}"]`);
      if (spotDiv) {
        spotDiv.scrollIntoView({
          behavior: "smooth", // ์Šคํฌ๋กค ์• ๋‹ˆ๋ฉ”์ด์…˜ (๋ถ€๋“œ๋Ÿฝ๊ฒŒ)
          block: "start", // ์š”์†Œ์˜ ์ƒ๋‹จ์œผ๋กœ ์Šคํฌ๋กค ์ •๋ ฌ
          inline: "nearest", // ์ˆ˜ํ‰ ์œ„์น˜๋„ ๋งž์ถค
        });
      }
    });

 

 

 

[๋งˆ์ปค ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ ์ถ”๊ฐ€ํ•˜๊ธฐ]

https://apis.map.kakao.com/web/sample/addMarkerMouseEvent/

 

[๋งˆ์ปค ํด๋ฆญ ์ด๋ฒคํŠธ ์ถ”๊ฐ€ํ•˜๊ธฐ]

https://apis.map.kakao.com/web/sample/addMarkerClickEvent/

 

 

 

๐ŸŒ  ์ง€๋„ ์ค‘์‹ฌ ๋ณ€๊ฒฝํ•˜๊ธฐ

// ์ด๋™ํ•  ์œ„๋„ ๊ฒฝ๋„ ์œ„์น˜๋ฅผ ์ƒ์„ฑ
var moveLatLon = new kakao.maps.LatLng(latitude, longitude);
// ์ง€๋„ ์ค‘์‹ฌ ์ด๋™
map.panTo(moveLatLon); // ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์ด๋™. ๋‹จ, ์ง€๋„ ๋‚ด์— ํ•ด๋‹น ์œ„์น˜๊ฐ€ ์—†๋‹ค๋ฉด ์ผ๋ฐ˜ ์ด๋™

 

 

 

 

๐ŸŒ  ํ‚ค์›Œ๋“œ๋กœ ๊ฒ€์ƒ‰ํ•˜๊ธฐ

  // ์žฅ์†Œ ๊ฒ€์ƒ‰ ๊ฐ์ฒด ์ƒ์„ฑ
  const ps = new kakao.maps.services.Places();

  // ํ‚ค์›Œ๋“œ ๊ฒ€์ƒ‰
  ps.keywordSearch(
    // keywordSearch(keyword, callback(data, status, pagination), locationInfo)
    "ํ‚ค์›Œ๋“œ",
    (data, status, pagination) => {
     // ์—ฌ๊ธฐ์— ๊ฒ€์ƒ‰ ํ›„ ๋กœ์ง
    }, // callback ํ•จ์ˆ˜
    {
      location: new kakao.maps.LatLng(
        myLocation.latitude,
        myLocation.longitude
      ), // ์ค‘์‹ฌ ์œ„์น˜
      radius: 1000, // ๋ฐ˜๊ฒฝ 1km
      sort: "distance", // ๊ฑฐ๋ฆฌ์ˆœ ์ •๋ ฌ
    } // ์ค‘์‹ฌ์ด ๋  ์œ„์น˜ ์ •๋ณด
  );

 

 

`radius` ์ฐพ๊ณ ์ž ํ•˜๋Š” ์ค‘์‹ฌ ์œ„์น˜์™€ ๋ฐ˜๊ฒฝ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. 

`sort` ๊ฑฐ๋ฆฌ์ˆœ, ์ด๋ฆ„์ˆœ, ๊ด€๋ จ๋„์ˆœ์œผ๋กœ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

`keywordSearch` ๋Š” `data` `status` `pagination`์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. `data`์—๋Š” ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ 15๊ฐœ๊ฐ€ ๋‹ด๊ฒจ์žˆ๊ณ , ๊ฒฐ๊ณผ๊ฐ€ 15๊ฐœ ์ด์ƒ์ผ ๊ฒฝ์šฐ `pagination` ์„ ํ†ตํ•ด ์ ‘๊ทผํ•ด์•ผํ•œ๋‹ค. 

 

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์กฐ๊ฑด๋ฌธ์œผ๋กœ ์ƒํƒœ๊ฐ€ ์˜ฌ๋ฐ”๋ฅผ ๋•Œ๋งŒ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

if (status === kakao.maps.services.Status.OK)

 

 

`data` ์—๋Š” ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ(1ํŽ˜์ด์ง€)๊ฐ€ ๋‹ด๊ฒจ์žˆ๋‹ค. 

 

 

`pagination` ์€ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์˜ ํŽ˜์ด์ง€ ๊ฐ์ฒด๋‹ค.

`hasNextPage`๋Š” ๋‹ค์Œ ํŽ˜์ด์ง€์˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

`nextPage()` ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋‹ค์Œ ํŽ˜์ด์ง€๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋Š” `keywordSearch`์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์ž๋™์œผ๋กœ ๋‹ค์‹œ ํ˜ธ์ถœํ•œ๋‹ค.

 

 

[ํ‚ค์›Œ๋“œ๋กœ ์žฅ์†Œ ๊ฒ€์ƒ‰ํ•˜๊ธฐ]

https://apis.map.kakao.com/web/sample/keywordBasic/