첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
728x90
반응형
728x170

TestProject.zip
다운로드

▶ RouteData.cs

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
    }
}

 

728x90

 

▶ RouteProvider.cs

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
    }
}

 

300x250

 

▶ MainForm.cs

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
    }
}
728x90
반응형
그리드형(광고전용)
Posted by icodebroker

댓글을 달아 주세요