■ InformationDataProviderBase 클래스를 사용해 커스텀 경로 공급자를 구현하는 방법을 보여준다.
▶ RouteData.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
using System; using System.Collections.Generic; using System.Drawing; using DevExpress.XtraMap; namespace TestProject { /// <summary> /// 경로 데이터 /// </summary> public class RouteData : IInformationData { //////////////////////////////////////////////////////////////////////////////////////////////////// Event ////////////////////////////////////////////////////////////////////////////////////////// Public #region 데이터 응답시 이벤트 - OnDataResponse /// <summary> /// 데이터 응답시 이벤트 /// </summary> public event EventHandler<RequestCompletedEventArgs> OnDataResponse; #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 포인트 리스트 /// </summary> private readonly List<GeoPoint> pointList = new List<GeoPoint>(); #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Property ////////////////////////////////////////////////////////////////////////////////////////// Public #region 포인트 리스트 - PointList /// <summary> /// 포인트 리스트 /// </summary> public List<GeoPoint> PointList { get { return this.pointList; } } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Public #region 경로 계산하기 - CalculateRoute(point1, point2) /// <summary> /// 경로 계산하기 /// </summary> /// <param name="point1">포인트 1</param> /// <param name="point2">포인트 2</param> public void CalculateRoute(GeoPoint point1, GeoPoint point2) { CalculateRouteCore(point1, point2); FireOnDataResponseEvent(); } #endregion ////////////////////////////////////////////////////////////////////////////////////////// Protected #region 데이터 응답시 이벤트 발생시키기 - FireOnDataResponseEvent() /// <summary> /// 데이터 응답시 이벤트 발생시키기 /// </summary> protected void FireOnDataResponseEvent() { OnDataResponse?.Invoke(this, CreateEventArgs()); } #endregion ////////////////////////////////////////////////////////////////////////////////////////// Private #region 이벤트 인자 생성하기 - CreateEventArgs() /// <summary> /// 이벤트 인자 생성하기 /// </summary> /// <returns>요청 완료시 이벤트 인자</returns> private RequestCompletedEventArgs CreateEventArgs() { MapItem[] mapItemArray = new MapItem[3]; mapItemArray[1] = new MapCallout() { Location = pointList[0], Text = pointList[0].ToString() }; mapItemArray[2] = new MapCallout() { Location = pointList[pointList.Count - 1], Text = pointList[pointList.Count - 1].ToString() }; MapPolyline polyline = new MapPolyline() { IsGeodesic = true, Stroke = Color.Red, StrokeWidth = 4 }; for(int i = 0; i < pointList.Count; i++) { polyline.Points.Add(pointList[i]); } mapItemArray[0] = polyline; return new RequestCompletedEventArgs(mapItemArray, null, false, null); } #endregion #region 경로 계산하기 (코어) - CalculateRouteCore(point1, point2) /// <summary> /// 경로 계산하기 (코어) /// </summary> /// <param name="point1">포인트 1</param> /// <param name="point2">포인트 2</param> private void CalculateRouteCore(GeoPoint point1, GeoPoint point2) { this.pointList.Clear(); this.pointList.Add(point1); this.pointList.Add(point2); } #endregion } } |
▶ RouteProvider.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
using System.Collections.Generic; using DevExpress.XtraMap; namespace TestProject { /// <summary> /// 경로 공급자 /// </summary> public class RouteProvider : InformationDataProviderBase { //////////////////////////////////////////////////////////////////////////////////////////////////// Property ////////////////////////////////////////////////////////////////////////////////////////// Public #region 포인트 열거 가능 목록 - PointEnumerable /// <summary> /// 포인트 열거 가능 목록 /// </summary> public IEnumerable<GeoPoint> PointEnumerable { get { return Data.PointList; } } #endregion ////////////////////////////////////////////////////////////////////////////////////////// Protected #region 데이터 - Data /// <summary> /// 데이터 /// </summary> protected new RouteData Data { get { return (RouteData)base.Data; } } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Public #region 경로 계산하기 - CalculateRoute(point1, point2) /// <summary> /// 경로 계산하기 /// </summary> /// <param name="point1">포인트 1</param> /// <param name="point2">포인트 2</param> public void CalculateRoute(GeoPoint point1, GeoPoint point2) { Data.CalculateRoute(point1, point2); } #endregion ////////////////////////////////////////////////////////////////////////////////////////// Protected #region 데이터 생성하기 - CreateData() /// <summary> /// 데이터 생성하기 /// </summary> /// <returns>정보 데이터 인터페이스</returns> protected override IInformationData CreateData() { return new RouteData(); } #endregion } } |
▶ MainForm.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
using DevExpress.XtraEditors; using DevExpress.XtraMap; namespace TestProject { /// <summary> /// 메인 폼 /// </summary> public partial class MainForm : XtraForm { //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - MainForm() /// <summary> /// 생성자 /// </summary> public MainForm() { InitializeComponent(); RouteProvider routeProvider = new RouteProvider(); this.informationLayer.DataProvider = routeProvider; routeProvider.CalculateRoute(new GeoPoint(70, 60), new GeoPoint(-60, -70)); this.openStreetMapDataProvider.WebRequest += openStreetMapDataProvider_WebRequest; } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Private #region OPEN STREET MAP 데이터 공급자 웹 요청시 처리하기 - openStreetMapDataProvider_WebRequest(sender, e) /// <summary> /// OPEN STREET MAP 데이터 공급자 웹 요청시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void openStreetMapDataProvider_WebRequest(object sender, MapWebRequestEventArgs e) { e.UserAgent = "XtraMap Getting Started - Connect to OpenStreetMap"; } #endregion } } |