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

TestProject.zip
다운로드

▶ RoutingHelper.cs

using System.Collections.Generic;
using System.Drawing;

using DevExpress.XtraMap;

namespace TestProject
{
    /// <summary>
    /// 라우팅 헬퍼
    /// </summary>
    public class RoutingHelper
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region Field

        /// <summary>
        /// 맵 푸시핀 리스트
        /// </summary>
        private List<MapPushpin> pushpinList = new List<MapPushpin>();

        /// <summary>
        /// 다각선
        /// </summary>
        private MapPolyline polyline = new MapPolyline()
        {
            StrokeWidth         = 4,
            SelectedStrokeWidth = 4,
            Stroke              = Color.FromArgb(0xff, 0xfe, 0x72, 0xff)
        };

        /// <summary>
        /// 경로점 리스트
        /// </summary>
        private List<RouteWaypoint> waypointList = new List<RouteWaypoint>();

        /// <summary>
        /// 현재 후자
        /// </summary>
        private char currentLatter = 'A';

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Property
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 푸시핀 리스트 - PushpinList

        /// <summary>
        /// 푸시핀 리스트
        /// </summary>
        public List<MapPushpin> PushpinList
        {
            get
            {
                return this.pushpinList;
            }
        }

        #endregion
        #region 경로점 리스트 - WaypointList

        /// <summary>
        /// 경로점 리스트
        /// </summary>
        public List<RouteWaypoint> WaypointList
        {
            get
            {
                return this.waypointList;
            }
        }

        #endregion
        #region 다각선 - Polyline

        /// <summary>
        /// 다각선
        /// </summary>
        public MapPolyline Polyline
        {
            get
            {
                return this.polyline;
            }
            set
            {
                this.polyline = value;
            }
        }

        #endregion
        #region 카운트 - Count

        /// <summary>
        /// 카운트
        /// </summary>
        public int Count
        {
            get
            {
                return this.pushpinList.Count;
            }
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 경로 구축하기 - BuildRoute(pointEnumerable)

        /// <summary>
        /// 경로 구축하기
        /// </summary>
        /// <param name="pointEnumerable">포인트 열거 가능 목록</param>
        public void BuildRoute(IEnumerable<GeoPoint> pointEnumerable)
        {
            this.polyline.Points.Clear();

            foreach(GeoPoint point in pointEnumerable)
            {
                this.polyline.Points.Add(point);
            }
        }

        #endregion
        #region 항목 추가하기 - AddItem(pushpin)

        /// <summary>
        /// 항목 추가하기
        /// </summary>
        /// <param name="pushpin">푸시핀</param>
        public void AddItem(MapPushpin pushpin)
        {
            this.pushpinList.Add(pushpin);

            this.waypointList.Add
            (
                new RouteWaypoint
                (
                    ((LocationInformation)pushpin.Information).DisplayName,
                    (GeoPoint)pushpin.Location
                )
            );

            pushpin.Text = (this.currentLatter++).ToString();
        }

        #endregion
        #region 지우기 - Clear()

        /// <summary>
        /// 지우기
        /// </summary>
        public void Clear()
        {
            this.polyline.Points.Clear();

            this.pushpinList.Clear();

            this.waypointList.Clear();

            this.currentLatter = 'A';
        }

        #endregion
    }
}

 

728x90

 

▶ MainForm.cs

using System;
using System.Collections.Generic;

using DevExpress.XtraEditors;
using DevExpress.XtraMap;

namespace TestProject
{
    /// <summary>
    /// 메인 폼
    /// </summary>
    public partial class MainForm : XtraForm
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region Field

        /// <summary>
        /// 빙 맵 키
        /// </summary>
        private string bingKey = "INPUT YOUR BING KEY";

        /// <summary>
        /// 라우팅 헬퍼
        /// </summary>
        private RoutingHelper routingHelper = new RoutingHelper();

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - MainForm()

        /// <summary>
        /// 생성자
        /// </summary>
        public MainForm()
        {
            InitializeComponent();

            this.bingMapDataProvider.BingKey     = this.bingKey;
            this.bingGeocodeDataProvider.BingKey = this.bingKey;
            this.bingRouteDataProvider.BingKey   = this.bingKey;
            this.bingSearchDataProvider.BingKey  = this.bingKey;

            this.bingRouteDataProvider.RouteOptions.Mode              = BingTravelMode.Driving;
            this.bingRouteDataProvider.RouteOptions.RouteOptimization = BingRouteOptimization.MinimizeTime;

            this.clearButton.Click                                   += clearButton_Click;
            this.mapControl.MapItemClick                             += mapControl_MapItemClick;
            this.bingGeocodeDataProvider.LocationInformationReceived += bingGeocodeDataProvider_LocationInformationReceived;
            this.bingRouteDataProvider.RouteCalculated               += bingRouteDataProvider_RouteCalculated;
            this.bingSearchDataProvider.SearchCompleted              += bingSearchDataProvider_SearchCompleted;
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Private
        //////////////////////////////////////////////////////////////////////////////// Event

        #region Clear 버튼 클릭시 처리하기 - clearButton_Click(sender, e)

        /// <summary>
        /// Clear 버튼 클릭시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void clearButton_Click(object sender, EventArgs e)
        {
            this.routingHelper.Clear();

            UpdateStorage();
        }

        #endregion
        #region 맵 컨트롤 맵 항목 클릭시 처리하기 - mapControl_MapItemClick(sender, e)

        /// <summary>
        /// 맵 컨트롤 맵 항목 클릭시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void mapControl_MapItemClick(object sender, MapItemClickEventArgs e)
        {
            MapPushpin pushpin = e.Item as MapPushpin;

            if(pushpin == null)
            {
                return;
            }

            if(this.routingHelper.PushpinList.Contains(pushpin))
            {
                return;
            }

            this.routingHelper.AddItem(pushpin);

            CalculateRoute();

            e.Handled = true;
        }

        #endregion
        #region 빙 지오코드 데이터 공급자 위치 정보 수신시 처리하기 - bingGeocodeDataProvider_LocationInformationReceived(sender, e)

        /// <summary>
        /// 빙 지오코드 데이터 공급자 위치 정보 수신시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void bingGeocodeDataProvider_LocationInformationReceived(object sender, LocationInformationReceivedEventArgs e)
        {
            if(e.Cancelled)
            {
                return;
            }

            GenerateItem(e.Result.Locations);
        }

        #endregion
        #region 빙 경로 데이터 공급자 경로 계산시 처리하기 - bingRouteDataProvider_RouteCalculated(sender, e)

        /// <summary>
        /// 빙 경로 데이터 공급자 경로 계산시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void bingRouteDataProvider_RouteCalculated(object sender, BingRouteCalculatedEventArgs e)
        {
            if(e.Cancelled)
            {
                return;
            }

            if(e.CalculationResult.ResultCode == RequestResultCode.Success)
            {
                this.routingHelper.BuildRoute(e.CalculationResult.RouteResults[0].RoutePath);

                UpdateStorage();
            }
        }

        #endregion
        #region 빙 검색 데이터 공급자 검색 완료시 처리하기 - bingSearchDataProvider_SearchCompleted(sender, e)

        /// <summary>
        /// 빙 검색 데이터 공급자 검색 완료시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void bingSearchDataProvider_SearchCompleted(object sender, BingSearchCompletedEventArgs e)
        {
            if(e.Cancelled || (e.RequestResult.ResultCode != RequestResultCode.Success))
            {
                return;
            }

            if(e.RequestResult.SearchResults.Count != 0)
            {
                GenerateItem(e.RequestResult.SearchResults);
            }
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////// Function

        #region 경로 계산하기 - CalculateRoute()

        /// <summary>
        /// 경로 계산하기
        /// </summary>
        private void CalculateRoute()
        {
            if(this.routingHelper.Count < 2)
            {
                return;
            }

            this.bingRouteDataProvider.CalculateRoute(this.routingHelper.WaypointList);
        }

        #endregion
        #region 저장소 업데이트하기 - UpdateStorage()

        /// <summary>
        /// 저장소 업데이트하기
        /// </summary>
        private void UpdateStorage()
        {
            this.mapItemStorage.Items.Clear();

            this.mapItemStorage.Items.Add(this.routingHelper.Polyline);

            foreach(MapPushpin pushpin in this.routingHelper.PushpinList)
            {
                this.mapItemStorage.Items.Add(pushpin);
            }
        }

        #endregion
        #region 항목 생성하기 - GenerateItem(informationEnumerable)

        /// <summary>
        /// 항목 생성하기
        /// </summary>
        /// <param name="informationEnumerable">위치 정보 열거 가능 목록</param>
        private void GenerateItem(IEnumerable<LocationInformation> informationEnumerable)
        {
            UpdateStorage();

            foreach(LocationInformation location in informationEnumerable)
            {
                MapPushpin pushpin = new MapPushpin()
                {
                    Location    = location.Location,
                    Information = location
                };

                this.mapItemStorage.Items.Add(pushpin);
            }
        }

        #endregion
    }
}
728x90
반응형
그리드형(광고전용)
Posted by icodebroker

댓글을 달아 주세요