[DEVEXPRESS/WINFORM] MapDataProviderBase 클래스 : 커스텀 데이터 공급자를 사용해 이미지 타일 로드하기
DevExpress/WinForm 2020. 6. 21. 00:34728x90
반응형
728x170
▶ CustomMapTileSource.cs
using System;
using System.IO;
using DevExpress.XtraMap;
namespace TestProject
{
/// <summary>
/// 커스텀 맵 타일 소스
/// </summary>
public class CustomMapTileSource : MapTileSourceBase
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Public
#region Field
/// <summary>
/// 타일 크기
/// </summary>
public new const int TileSize = 256;
/// <summary>
/// 최대 확대/축소 레벨
/// </summary>
public const int MaximumZoomLevel = 2;
#endregion
////////////////////////////////////////////////////////////////////////////////////////// Private
#region Field
/// <summary>
/// 디렉토리 경로
/// </summary>
private string directoryPath;
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 생성자 - CustomMapTileSource(cacheOptionsProvider)
/// <summary>
/// 생성자
/// </summary>
/// <param name="cacheOptionsProvider">캐시 옵션 공급자</param>
public CustomMapTileSource(ICacheOptionsProvider cacheOptionsProvider) : base
(
(int)CalculateTotalImageSize(MaximumZoomLevel),
(int)CalculateTotalImageSize(MaximumZoomLevel),
TileSize,
TileSize,
cacheOptionsProvider
)
{
DirectoryInfo directoryInfo = new DirectoryInfo(Directory.GetCurrentDirectory());
directoryPath = directoryInfo.Parent.Parent.FullName;
}
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Public
#region 전체 이미지 크기 계산하기 - CalculateTotalImageSize(zoomLevel)
/// <summary>
/// 전체 이미지 크기 계산하기
/// </summary>
/// <param name="zoomLevel">확대/축소 레벨</param>
/// <returns>전체 이미지 크기</returns>
public static double CalculateTotalImageSize(double zoomLevel)
{
if(zoomLevel < 1.0)
{
return zoomLevel * TileSize * 2;
}
return Math.Pow(2.0, zoomLevel) * TileSize;
}
#endregion
////////////////////////////////////////////////////////////////////////////////////////// Instance
//////////////////////////////////////////////////////////////////////////////// Public
#region 확대/축소 레벨에 따라 타일 구하기 - GetTileByZoomLevel(zoomLevel, tilePositionX, tilePositionY)
/// <summary>
/// 확대/축소 레벨에 따라 타일 구하기
/// </summary>
/// <param name="zoomLevel">확대/축소 레벨</param>
/// <param name="tilePositionX">타일 위치 X</param>
/// <param name="tilePositionY">타일 위치 Y</param>
/// <returns>타일 URI</returns>
public override Uri GetTileByZoomLevel(int zoomLevel, int tilePositionX, int tilePositionY)
{
if(zoomLevel <= MaximumZoomLevel)
{
Uri uri = new Uri
(
string.Format
(
"file://" + directoryPath + "\\openstreetmap.org\\Hybrid_{0}_{1}_{2}.png",
zoomLevel,
tilePositionX,
tilePositionY
)
);
return uri;
}
return null;
}
#endregion
}
}
728x90
▶ CustomMapDataProvider.cs
using System;
using System.Drawing;
using DevExpress.XtraMap;
namespace TestProject
{
/// <summary>
/// 커스텀 맵 데이터 공급자
/// </summary>
public class CustomMapDataProvider : MapDataProviderBase
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Private
#region Field
/// <summary>
/// 투영법
/// </summary>
private readonly SphericalMercatorProjection projection = new SphericalMercatorProjection();
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Property
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 투영법 - Projection
/// <summary>
/// 투영법
/// </summary>
public override ProjectionBase Projection
{
get
{
return this.projection;
}
}
#endregion
////////////////////////////////////////////////////////////////////////////////////////// Protected
#region 픽셀 단위 기본 크기 - BaseSizeInPixels
/// <summary>
/// 픽셀 단위 기본 크기
/// </summary>
protected override Size BaseSizeInPixels
{
get
{
return new Size
(
Convert.ToInt32(CustomMapTileSource.TileSize * 2),
Convert.ToInt32(CustomMapTileSource.TileSize * 2)
);
}
}
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 생성자 - CustomMapDataProvider()
/// <summary>
/// 생성자
/// </summary>
public CustomMapDataProvider()
{
TileSource = new CustomMapTileSource(this);
}
#endregion
}
}
300x250
▶ MainForm.cs
using System;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using DevExpress.XtraMap;
namespace TestProject
{
/// <summary>
/// 메인 폼
/// </summary>
public partial class MainForm : XtraForm
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 생성자 - MainForm()
/// <summary>
/// 생성자
/// </summary>
public MainForm()
{
InitializeComponent();
Load += Form_Load;
}
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Private
#region 폼 로드시 처리하기 - Form_Load(sender, e)
/// <summary>
/// 폼 로드시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void Form_Load(object sender, EventArgs e)
{
#region 맵 컨트롤을 설정한다.
MapControl mapControl = new MapControl();
mapControl.Parent = this;
mapControl.Dock = DockStyle.Fill;
#endregion
#region 이미지 레이어를 설정한다.
ImageLayer imageLayer = new ImageLayer();
imageLayer.DataProvider = new CustomMapDataProvider();
mapControl.Layers.Add(imageLayer);
#endregion
}
#endregion
}
}
728x90
반응형
그리드형(광고전용)
댓글을 달아 주세요