2009-11-17 6 views
5

내 코드는 .pantolatlong 다음 .showinfobox를 수행합니다.빙지도에 infobox를 배치하고 표시하려면 어떻게합니까?

pantolatlong을 제거하지 않으면 정보 상자가 나타나지 않습니다. 나는 그것이 그것을 멈추고 있다고 생각한다. 나는 엔드 팬 이벤트에 추가하려고 시도했지만 작동하지 않았습니다.

압정으로 이동하고 정보창을 표시하는 가장 간단한 방법은 무엇입니까?

나는 setcenter를 사용하고 있었지만 때로는 setcenter가 흔들리는 것을 발견했다.

답변

4

미친 듯이 인터넷 검색을하다가 해결 방법을 찾았습니다. 다른 사람들이 내가 겪은 슬픔을 잘 이해할 수 있도록 여기에서 공유 할 것입니다.

순수한 자바 스크립트, SDK 또는 iframe 솔루션을 사용하여 내 빙지도를 만들고 전원을 공급했습니다. 내 코드에서는지도에 원하는 모든 핀을 추가하고 asp.net 레이블을 사용하여 삽입하는 자바 스크립트를 생성합니다.

Bing Map에서 setCenter() 메서드를 호출하면 지정한 좌표로 즉각 깜짝 놀랍게도지도가 설정됩니다. 그리고 그것은 대부분의 경우 않습니다. 때로는 점 사이를 이동하기로 결정합니다. SetCenter를 수행 한 다음 ShowInfoBox를 수행하면 화면 이동하기로 결정하지 않으면 큰 효과를 발휘합니다.

해결책? 우리는 위대한 프로그래머이기 때문에 SDK에 뛰어 들어서이를 처리 할 수있는 이벤트가 있음을 알 수 있습니다. 팬 이벤트가 끝난 후에 트리거되는 onendpan 이벤트가 있습니다. 지도가 점프 할 때 트리거하는 onchangeview 이벤트도 있습니다.

그래서 우리는 이러한 이벤트에 연결하고 고정 핀 모양을위한 정보창을 표시하려고합니다 ...하지만 아무 일도 발생하지 않습니다. 왜 안돼?

이벤트가 호출 될 때 알려지지 않은 이유로 숨을 쉬기 위해서는 몇 밀리 초가 필요합니다. 10 밀리 초로 setTimeout을 사용하는 것이 좋습니다. 그 후에 상자가 잘 보일 것입니다.

다음 문제는 푸시 핀 (내 경우에는 onclick 메서드가있는 테이블) 사이를 가볍게 치기 위해 사용한 모든 것을 통해 이동할 때만 나타납니다. 전역 변수를 사용하여 사용자가 패닝인지 추적하거나 시스템이 클릭에 응답하여 패닝하는 것과 같은 다른 옵션이 있지만 이벤트 처리기를 즉시 작성/삭제합니다.

마지막으로이 버그가 하나 있습니다. 목록에서 장소를 클릭하고 해당 위치로 이동/이동하면 infobox가 정상적으로 표시됩니다. 사용자가이를 기각 한 다음 목록 항목을 다시 클릭하면지도가 이동하지 않으므로 이벤트가 트리거되지 않습니다.

내 해결책은지도가 이동했는지 여부를 감지하는 것입니다. 긴/위도를 기록하고 다른 setTimeout 메서드를 사용하여 100ms 후에 바뀌 었는지 감지합니다. 그들이하지 않았다면, infobox를 표시하십시오.

이벤트 핸들러에 매개 변수를 전달할 수있는 방법이 없으므로 추적 할 필요가있는 다른 사항이 있으므로 전역 자바 스크립트 변수를 사용합니다. 표시 할 고정 핀 모양을 알고 있어야합니다. 또한 변경되었는지 확인하기 전에 이전 mapcoordinates를 추적하십시오.

이 모든 것을 함께 처리하는 데 다소 시간이 걸렸지 만 작동하는 것 같습니다.여기

// An array of our pins to allow panning to them 
var myPushPins = []; 

// Used by the eventhandler 
var eventPinIndex; 
var oldMapCenter; 

// Zoom in and center on a pin, then show its information box 
function ShowPushPin(pinIndex) { 
    eventPinIndex = pinIndex; 
    oldMapCenter = map.GetCenter(); 
    map.AttachEvent("onendpan", EndPanHandler); 
    map.AttachEvent("onchangeview", ChangeViewHandler); 
    setTimeout("DetectNoMapChange();", 200); 

    map.SetZoomLevel(9); 
    map.SetCenter(myPushPins[pinIndex].GetPoints()[0]); 

} 


function EndPanHandler(e) { 
    map.DetachEvent("onendpan", EndPanHandler); 

    setTimeout("map.ShowInfoBox(myPushPins[eventPinIndex]);", 10); 

} 

function ChangeViewHandler(e) { 
    map.DetachEvent("onchangeview", ChangeViewHandler); 

    setTimeout("map.ShowInfoBox(myPushPins[eventPinIndex]);", 10); 

} 

function DetectNoMapChange(centerofmap) { 

    if (map.GetCenter().Latitude == oldMapCenter.Latitude && map.GetCenter().Longitude == oldMapCenter.Longitude) { 
     map.ShowInfoBox(myPushPins[eventPinIndex]); 
    } 
} 
3

또 다른 방법입니다 :

function addPushpin(lat,lon,pinNumber) { 
    var pinLocation = new Microsoft.Maps.Location(lat, lon); 

    var pin = new Microsoft.Maps.Pushpin(map.getCenter(), { text: pinNumber.toString() }); 

    pinInfobox = new Microsoft.Maps.Infobox(pinLocation, 
      { title: 'Details', 
       description: 'Latitude: ' + lat.toString() + ' Longitude: ' + lon.toString(), 
       offset: new Microsoft.Maps.Point(0, 15) 
      }); 


    map.entities.push(pinInfobox); 
    map.entities.push(pin); 

    pin.setLocation(pinLocation); 
    map.setView({ center: pinLocation}); 
} 
여기에, 일부 섹션이 제거 내 코드입니다
관련 문제