Daum map api 줌 레벨별 마커 이미지 변경 문의 드립니다

안녕하세요.

현재 시스템에서 Daum map api를 사용하고 있는데

서버에서 받아온 데이터를 각각

화면 좌측의 map, 화면 우측에 그리드 로 뿌려주고 있습니다.

이에 관련한 개발 도중

줌 1~4 레벨 대형이미지

줌 5~7 레벨 중형이미지

줌 8~10 레벨 소형이미지 이렇게 이미지 를 생성 후 마커에 넣어주려고 하는데

상단에서

var marker;

				// 마커를 생성합니다

				marker = new daum.maps.Marker({
					map: map, // 마커를 표시할 지도

					position: new daum.maps.LatLng(lat, lng), // 마커를 표시할 위치

					title : strNm, // 마커의 타이틀, 마커에 마우스를 올리면 타이틀이 표시됩니다

					image : markerImage, // 마커 이미지 

				});

와 같이 마커 객체 생성후

daum.maps.event.addListener(map, ‘zoom_changed’, function(){

				    // 지도의 현재 레벨을 얻어옵니다

				    var level = map.getLevel();

				    

				    if(0 < level < 5){
					    var imageSrc = brndIcoS;

	        			var imageSize = new daum.maps.Size(30, 30);

	        			// 이미지(소) 사이즈

// var imageSize = new daum.maps.Size(35, 35);

	        			var markerImage = new daum.maps.MarkerImage(imageSrc, imageSize);

				    }else if(4 < level < 8){
				    	var imageSrc = brndIcoM;

	        			// 이미지(중) 사이즈

	        			var imageSize   = new daum.maps.Size(35, 35);

	        			var markerImage = new daum.maps.MarkerImage(imageSrc, imageSize); 

				    }else if(7 < level < 11){
				    	var imageSrc = brndIcoL;

	        			// 이미지(대) 사이즈

	        			var imageSize   = new daum.maps.Size(40, 40);

	        			var markerImage = new daum.maps.MarkerImage(imageSrc, imageSize); 

				    }

				});

이런식으로 처리 해보려고 했는데 잘 안되서 몇 가지 질문들 드리려고 합니다.

  1. 줌 레벨 범위 지정을 위해 if(0 < level < 5){} 와 같이 범위 지정을 했는데 이 문법이 올바른 것인지

  2. 순서가 잘못 되었다고 하면 순서를 어떤 식으로 진행해야 하는지

많은 가르침 부탁드립니다. 감사합니다.

허… 넘나 파이썬 스타일인데요.

자바스크립트에서는

if(0 < level < 5) // (x)
if(0 < level && level < 5) // (o)

그리고 marker.setImage(markerImage); 만 해주시면
코드상의 자잘한 문제는 무시하고 일단 동작은 되겠네요.

markerImage는 zoom_changed 이벤트 handler 밖에서
각각 다른 이름으로 한 번만 선언하시고 사용하시는게 여러모로 좋을 겁니다.

그리고…

if(1 <= level && level <= 4) {

} else if(5 <= level && level <= 7) {

} else if(8 <= level && level <= 10) {

}

이렇게 하는게 기획 의도를 파악하기 더 쉬울거에요… ㅠ

자바스크립트 프로그래밍을 본격적으로 배우실 예정이시라면
자바스크립트의 hoisting, 변수 선언과 scope에 대해서 더 공부해 보세요.

1개의 좋아요

넵 좋은 가르침 감사합니다.

말씀하신대로 위의 문법대로

상단에 아래와 같이 마커 이미지를 지정 후
– brndIcoS, brndIcoM, brndIcoL 은 서버에 받아온 데이터를 객체화 한 변수

if(brndIcoS){
    var imageSrc = brndIcoS;
    var imageSize = new daum.maps.Size(10, 10);
    // 이미지(소) 사이즈
	//        			var imageSize   = new daum.maps.Size(35, 35);
    var BRND_ICON_S = new daum.maps.MarkerImage(imageSrc, imageSize);
	        			
    // 마커를 생성합니다
    marker = new daum.maps.Marker({
        map: statusStorMap, // 마커를 표시할 지도
        position: new daum.maps.LatLng(lat, lng), // 마커를 표시할 위치
        title : strNm, // 마커의 타이틀, 마커에 마우스를 올리면 타이틀이 표시됩니다
        image : BRND_ICON_S, // 마커 이미지 
    });
}
        			
if(brndIcoM){
    var imageSrc = brndIcoM;
    // 이미지(중) 사이즈
    var imageSize   = new daum.maps.Size(50, 50);
    var BRND_ICON_M = new daum.maps.MarkerImage(imageSrc, imageSize);
	        			
    // 마커를 생성합니다
    marker = new daum.maps.Marker({
        map: map, // 마커를 표시할 지도
        position: new daum.maps.LatLng(lat, lng), // 마커를 표시할 위치
        title : strNm, // 마커의 타이틀, 마커에 마우스를 올리면 타이틀이 표시됩니다
        image : BRND_ICON_M, // 마커 이미지 
    });
}
        			
if(brndIcoL){
    var imageSrc = brndIcoL;
    // 이미지(대) 사이즈
    var imageSize   = new daum.maps.Size(100, 100);
    var BRND_ICON_L = new daum.maps.MarkerImage(imageSrc, imageSize); 
	        			
    // 마커를 생성합니다
    marker = new daum.maps.Marker({
        map: map, // 마커를 표시할 지도
        position: new daum.maps.LatLng(lat, lng), // 마커를 표시할 위치
        title : strNm, // 마커의 타이틀, 마커에 마우스를 올리면 타이틀이 표시됩니다
        image : BRND_ICON_L, // 마커 이미지 
    });
}

*아래와같이 줌 체인지 이벤트 핸들러에 각각 줌 레벨별로 setImage 를 해주었는데, 첫 줌레벨 크기의 이미지만 계속 표시되고 해당 레벨 범위에 따라 이미지가 변화되지 않는데, 어떤 객체를 제대로 초기화 해주지 않아서 그런 것일까요?

daum.maps.event.addListener(map, 'zoom_changed', function(){
					    
    // 지도의 현재 레벨을 얻어옵니다
     var level = map.getLevel();
					    
    if(1 <= level && level <= 4) {
        marker.setImage(BRND_ICON_L);
    }else if(5 <= level && level <= 7) {
        marker.setImage(BRND_ICON_M);
    }else if(8 <= level && level <= 10) {
        marker.setImage(BRND_ICON_S);
    }
					    
					    
    var message   = '현재 지도 레벨은 ' + level + ' 입니다';
    var resultDiv = document.getElementById('result');  
    resultDiv.innerHTML = message;
});

자꾸 질문드려서 죄송합니다…
좋은 가르침 부탁드립니다!

var BRND_ICON_S = new daum.maps.MarkerImage(brndIcoS, new daum.maps.Size(10, 10));
var BRND_ICON_M = new daum.maps.MarkerImage(brndIcoM, new daum.maps.Size(50, 50));
var BRND_ICON_L = new daum.maps.MarkerImage(brndIcoL, new daum.maps.Size(100, 100));

var marker = new daum.maps.Marker({
    map: map,
    position: new daum.maps.LatLng(lat, lng),
    title : strNm
});

daum.maps.event.addListener(map, 'zoom_changed', function(){
					    
    var level = map.getLevel();

    var markerImage;
					    
    if (1 <= level && level <= 4) {
        markerImage = BRND_ICON_L;
    } else if (5 <= level && level <= 7) {
        markerImage = BRND_ICON_M;
    } else if (8 <= level && level <= 10) {
        markerImage = BRND_ICON_S;
    }

    marker.setImage(markerImage);
});
1개의 좋아요

말씀해주신데로 적용해보니 마커 기본 이미지로 적용이 됬네요… 무언가 제 소스에 전반적인 이상이 있는것 같습니다… 감사합니다.

기본 이미지가 나오는건 초기화를 안해서 그렇습니다.
제가 작성한 로직 자체는 한 번 줌레벨을 변경해야 그 때부터 적용됩니다.

초기화 처리된 코드는 아래와 같습니다.

var BRND_ICON_S = new daum.maps.MarkerImage(brndIcoS, new daum.maps.Size(10, 10));
var BRND_ICON_M = new daum.maps.MarkerImage(brndIcoM, new daum.maps.Size(50, 50));
var BRND_ICON_L = new daum.maps.MarkerImage(brndIcoL, new daum.maps.Size(100, 100));

var marker = new daum.maps.Marker({
    map: map,
    position: new daum.maps.LatLng(lat, lng),
    title : strNm
});

var changeMarkerImage = function(){
					    
    var level = map.getLevel();

    var markerImage;
					    
    if (1 <= level && level <= 4) {
        markerImage = BRND_ICON_L;
    } else if (5 <= level && level <= 7) {
        markerImage = BRND_ICON_M;
    } else if (8 <= level) { // 10레벨 이상에서도 마커이미지는 필요합니다. 예외처리 필요.
        markerImage = BRND_ICON_S;
    }

    marker.setImage(markerImage);
};

daum.maps.event.addListener(map, 'zoom_changed', changeMarkerImage);
changeMarkerImage(); // initialize
1개의 좋아요