[DEVEXPRESS/WINFORM] BingRouteDataProvider 클래스 : GIS 공급자를 사용해 경로 계산기 구현하기
DevExpress/WinForm 2020. 6. 26. 00:05728x90
반응형
728x170
▶ 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
반응형
그리드형(광고전용)
댓글을 달아 주세요