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

TestProject.zip
다운로드

▶ MainForm.cs

using System;
using System.Text;
using System.Windows.Forms;

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 BingGeocodeDataProvider bingGeocodeDataProvider;

        #endregion

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

        #region 생성자 - MainForm()

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

            Load                  += Form_Load;
            this.sendButton.Click += sendButton_Click;
        }

        #endregion

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

        #region 폼 로드시 처리하기 - Form_Load(sender, e)

        /// <summary>
        /// 폼 로드시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void Form_Load(object sender, EventArgs e)
        {
            this.bindMapDataProvider.BingKey = this.bingKey;

            this.bingGeocodeDataProvider = new BingGeocodeDataProvider();
            
            this.bingGeocodeDataProvider.BingKey               = this.bingKey;
            this.bingGeocodeDataProvider.MaxVisibleResultCount = 1;

            this.informationLayer.DataProvider = bingGeocodeDataProvider;

            this.bingGeocodeDataProvider.LocationInformationReceived += bingGeocodeDataProvider_LocationInformationReceived;
            this.bingGeocodeDataProvider.LayerItemsGenerating        += bingGeocodeDataProvider_LayerItemsGenerating;
        }

        #endregion
        #region 전송 버튼 클릭시 처리하기 - sendButton_Click(sender, e)

        /// <summary>
        /// 전송 버튼 클릭시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void sendButton_Click(object sender, EventArgs e)
        {
            GeoPoint geoPoint;

            if(GetGeoPoint(this.latitudeTextEdit.Text, this.longitudeTextEdit.Text, out geoPoint))
            {
                this.bingGeocodeDataProvider.RequestLocationInformation(geoPoint, 0);
            }
        }

        #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 == true)
            {
                return;
            }

            if(e.Result.ResultCode != RequestResultCode.Success)
            {
                this.resultMemoEdit.Text = "The Bing Geocode service does not work for this location.";

                return;
            }

            StringBuilder stringBuilder = new StringBuilder();

            int count = 1;

            foreach(LocationInformation information in e.Result.Locations)
            {
                stringBuilder.AppendFormat("Request Result {0} :", count                               );
                stringBuilder.AppendLine();
                stringBuilder.AppendFormat("{0}"                 , information.EntityType              );
                stringBuilder.AppendLine();
                stringBuilder.AppendFormat("{0}"                 , information.Address.FormattedAddress);
                stringBuilder.AppendLine();
                stringBuilder.AppendFormat("Coordinates : {0}"   , information.Location                );
                stringBuilder.AppendLine();
                stringBuilder.AppendLine  ("--------------------------------------------------");

                count++;
            }

            this.resultMemoEdit.Text = stringBuilder.ToString();
        }

        #endregion
        #region 빙 지오코드 데이터 공급자 레이어 항목 생성시 처리하기 - bingGeocodeDataProvider_LayerItemsGenerating(sender, e)

        /// <summary>
        /// 빙 지오코드 데이터 공급자 레이어 항목 생성시 처리하기 
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void bingGeocodeDataProvider_LayerItemsGenerating(object sender, LayerItemsGeneratingEventArgs e)
        {
            this.mapControl.ZoomToFit(e.Items, 0.4);
        }

        #endregion

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

        #region 값 구하기 - GetValue(valueString, minimumValue, maximumValue, valueName, value)

        /// <summary>
        /// 값 구하기
        /// </summary>
        /// <param name="valueString">값 문자열</param>
        /// <param name="minimumValue">최소 값</param>
        /// <param name="maximumValue">최대 값</param>
        /// <param name="valueName">값 명</param>
        /// <param name="value">값</param>
        /// <returns>처리 결과</returns>
        private bool GetValue(string valueString, double minimumValue, double maximumValue, string valueName, out double value)
        {
            double temporaryValue = string.IsNullOrEmpty(valueString) ? 0 : double.Parse(valueString);

            if((temporaryValue > maximumValue) || (temporaryValue < minimumValue))
            {
                MessageBox.Show
                (
                    string.Format
                    (
                        "The {0} must be less than or equal to {2} and greater than or equal to {1}. Correct the input value.",
                        valueName,
                        minimumValue,
                        maximumValue
                    )
                );

                value = 0;

                return false;
            }

            value = temporaryValue;

            return true;
        }

        #endregion
        #region 지리 위치 구하기 - GetGeoPoint(latitudeString, longitudeString, geoPoint)

        /// <summary>
        /// 지리 위치 구하기
        /// </summary>
        /// <param name="latitudeString">위도 문자열</param>
        /// <param name="longitudeString">경도 문자열</param>
        /// <param name="geoPoint">지리 위치</param>
        /// <returns>처리 결과</returns>
        private bool GetGeoPoint(string latitudeString, string longitudeString, out GeoPoint geoPoint)
        {
            double latitude;
            double longitude;

            if
            (
                GetValue(latitudeString ,  -90,  90, "Latitude" , out latitude ) && 
                GetValue(longitudeString, -180, 180, "Longitude", out longitude)
            )
            {
                geoPoint = new GeoPoint(latitude, longitude);

                return true;
            }

            geoPoint = null;

            return false;
        }

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

댓글을 달아 주세요