카카오 지도 API 중심좌표 관련하여 문제 발생


카카오 MAP Api 직접해보기에서는 해당데이터를 직접 넣어서 했을때는 중심좌표가 맞춰서 잘 나오는데,


코드작성하면…자꾸상단위에 가있네요…

코드는

<script>
    window.onload = function () {
      var lng = ${deviceLocInfo.xcrd};
      var lat =  ${deviceLocInfo.ycrd};
      var dvcId =  ${deviceLocInfo.dvcId};
      var userId = '${deviceLocInfo.userId}';
      var userName = '${deviceLocInfo.userName}';
      var connectDateStr = '${deviceLocInfo.connectDateStr}';

      var mapContainer = document.getElementById('map'),
          mapOption = {
            center: new kakao.maps.LatLng(lat, lng), // 지도의 중심좌표
            level: 4 // 지도의 확대 레벨
          };

      var map = new kakao.maps.Map(mapContainer, mapOption); // 지도를 생성

      //지도 범위 재배치
      var points = new kakao.maps.LatLng(lat, lng);
      var bounds = new kakao.maps.LatLngBounds();

      var marker = new kakao.maps.Marker({position: points});
      marker.setMap(map);

      bounds.extend(points);

      // 라벨 생성 및 표시
      var label = new kakao.maps.CustomOverlay({
        map: map,
        content: '<div style="height: 20px; padding:2px 5px;background:#fff; border: solid 1.5px #666;">ID:' + dvcId + '</div>',
        position: marker.getPosition(),
        xAnchor: 0.5,
        yAnchor: -0.5
      });

      // 인포윈도우 내용
      var content =
          '<div class="wrap">' +
          '    <div class="info">' +
          '        <div class="title">' + dvcId + '</div>' +
          '        <div class="body">' +
          '            <div class="desc">' +
          '                <div class="ellipsis">' + userName + '(' + userId + ')' + '</div>' +
          '                <div class="ellipsis">' + connectDateStr + '</div>' +
          '            </div>' +
          '        </div>' +
          '    </div>' +
          '</div>';

      // 인포윈도우 표시
      var infoWindow = new kakao.maps.CustomOverlay({
        clickable: true, // 커스텀 오버레이 클릭 시 지도에 이벤트를 전파하지 않도록 설정
        content: content,
        map: map,
        position: marker.getPosition()
      });

      infoWindow.setMap(null);

      kakao.maps.event.addListener(marker, 'mouseover', showOverlayListener(map, marker, infoWindow));
      kakao.maps.event.addListener(marker, 'mouseout', hideOverlayListener(infoWindow));

      function showOverlayListener(map, marker, infoWindow) {
        return function () {
          infoWindow.setMap(map);
        };
      }

      function hideOverlayListener(infoWindow) {
        return function () {
          infoWindow.setMap(null);
        };
      }

       map.setBounds(bounds);

    };
  </script>

디버깅을 한번 해보시기 바랍니다.

특정 로직에 debugger; 를 입력하고 크롬에서 실행해보면 크롬 개발자도구가 디버깅 모드를 활성화 시키기에 데이터가 어떻게 들어가는지 확인해 주시기 바랍니다.

그려지는 지도의 width,height값이 제대로 설정되어 있는지, 중간에 지도의 크기가 변경된다거나 등, 확인해 보시기 바랍니다.
Map객체를 만들때 처음에 들어가는 값은 중심좌표로 셋팅되는 코드는 맞습니다.

예시로 테스트한 코드와, 실제 구현코드가 다른데, 실제 구현코드도 저희가 샘플로 제공하는 코드와 비슷한데, 비슷한 환경에서 테스트 해보시기 바랍니다.

그리고 좌표가 하나인데 bounds 객체를 이용하실 필요는 딱히 없으실것 같기도 합니다.

다른거 다 지우고, only 지도생성 코드만…해도
좌측상단으로 올라가있네요… style문제일까요…? 디버깅해서…값이 잘 넘어오는데…ㅜㅜ

위와 같은 문제는 거의 높은 확률로 지도가 렌더링 되는 화면의 크기 문제일 확률이 큰데;

해당 로직의 마지막에 map.relayout()을 넣어보시거나(원래 지도의 크기가 변하면 실행해야 되는 로직)
100%가 아닌 특정 사이즈 값을 주고 실행을 해보시기 바랍니다.

window.onload 대신 $(document).ready로…하니깐…제대로 중심좌표 작동이 되네요…

ㅜㅜㅜ

그럼 타이밍 문제였군요 ㅎㅎ
jQuery의 ready 함수는 여러가지를 고려하는 것으로 알고 있습니다. (저도 안쓴지 오래되서;; 요즘은 기억이 가물가물하지만;:wink:

즉 DOM이 사이즈를 잡기전에 스크립트가 실행되서 발생한 문제로 보입니다.

위 적어주신 코드에서 한가지 추가를 해드리자면,
head 태그 안에다가 스크립트를 실행하는 것보다,

태그, 즉 바디가 끝나는 부분에 스크립트를 넣는것이 여러모로 더 좋습니다.

어차피 페이지는 순차적으로 해석되기 때문에, body 맨 아래에 넣으면 이 윗부분은 처리가 끝났다고 볼 수 있거든요. (물론 몇가지 케이스가 있긴 하지만)

그래서 되도록이면 head보다는 body 하단에 작성을 해보시는걸 추천드립니다.
특별한 방법은 아니며,

이미 몇년전부터, 스크립트 해석보다 DOM파싱을 먼저해서 원치않는 논리오류를 막고 (스크립트에서 DOM에 접근하는 기능을 이용할시), 스크립트 해석을 제일 나중에 하는 것으로, 페이지의 렌더링 흐름을 최적화 할 수 있습니다. DOM이 그려지기 전에 덩치가 큰 스크립트가 실행되면, 그 만큼 뒤에 DOM이 해석이 늦게 되니까요.

한번 참고해 보세요~