DuraMap-Xr의 Mouse Wheel 이벤트를 이용해 지도를 확대 축소하는 이벤트에 대한 글을 정리합니다. 배경지도는 TMS 형식으로 활용할 수 있는 VWorld를 이용합니다. 먼저 VWorld의 배경지도에 대한 Layer는 아래처럼 추가할 수 있는데요. 저는 아래의 코드를 폼(Form)이 Shown 이벤트에 추가하였습니다.
XrMapLib.ValueList URLs = new XrMapLib.ValueList(); URLs.AddValueByString(VWORLD_TMS_URL); XrMapLib.Extent MaxMBR = new XrMapLib.Extent(); MaxMBR.MinX = -20037508.342789244; MaxMBR.MinY = -20037508.342789244; MaxMBR.MaxX = 20037508.342789244; MaxMBR.MaxY = 20037508.342789244; double[] upps = { 78000, 39000, 19600, 9800, 4900, 2400, //Dummy 1222.9924523925781, 611.4962261962891, 305.74811309814453, 152.87405654907226, 76.43702827453613, 38.218514137268066, 19.109257068634033, 9.554628534317017, 4.777314267158508, 2.388657133579254, 1.194328566789627, 0.5971642833948135, 0.5971642833948135/2 }; XrMapLib.ValueList UPPs = new XrMapLib.ValueList(); Scales.Clear(); for (int iUPP = 0; iUPP < upps.Length; ++iUPP) { double UPP = upps[iUPP]; double MapScale = axXr1.GetMapScaleFromUPP(UPP); UPPs.AddValueByFloat(UPP, 14); if (iUPP > 5) // upps 배열에서 0~4번째는 한국에서는 사용되지 않음 { Scales.Add(MapScale); } } axXr1.Layers.AddTMSLayer("basemap", URLs, MaxMBR, UPPs, true); axXr1.WaitForAllConnections(); XrMapLib.Coord MapPt = new XrMapLib.Coord(); MapPt.X = 14145315; MapPt.Y = 4514689; axXr1.MapCenter = MapPt; axXr1.MapScale = Scales[0]; axXr1.Update(); axXr1.MouseMode = XrMapLib.XrMapViewModeEnum.XrPanMode;
참고로 듀라맵 지도 뷰어 컨트롤의 변수는 axXr1입니다. 위의 코드를 보면 Scales라는 전역 변수가 보입니다. 이 Scales는 다음처럼 정의되어 있습니다. Scales 컨터이너 변수는 각 지도 줌 단계에 대한 축척값을 담고 있습니다.
private List<double> Scales = new List<double>();
이제 지도 컨트롤의 마우스 휠 이벤트를 등록합니다. 아래의 코드는 듀라맵 지도 뷰 컨트롤의 휠 이벤트에 할당된 이벤트 함수입니다.
private void axXr1_OnMouseWheel(object sender, AxXrMapLib._IXrMapControlEvents_OnMouseWheelEvent e) { double NewMapScale = axXr1.MapScale; // 현재 지도 축척값 중 가장 가까운 줌 레벨 얻기 int cntLevels = Scales.Count; double Gap = Double.MaxValue; int CurrentLevel = -1; for (int i = 0; i < cntLevels; i++) { double ThatGap = Math.Abs(NewMapScale - Scales[i]); if (Gap > ThatGap) { Gap = ThatGap; CurrentLevel = i; } } if(e.delta == 120) // Wheel Up { int idx = CurrentLevel + 1; if (idx >= Scales.Count) idx = Scales.Count - 1; axXr1.MapScale = Scales[idx]; } else // Wheel Down { int idx = CurrentLevel - 1; if (idx < 0) idx = 0; axXr1.MapScale = Scales[idx]; } axXr1.Update(); }