C#과 같은 COM을 지원하는 언어에서 GIS 어플리케이션을 개발할 수 있는 GIS 엔진인 DuraMap-Xr에서 TMS 형식의 배경지도를 레이어로 활용할 수 있는 코드를 정리해 봅니다. VWorld에서 제공하는 배경지도를 예시로 하였습니다.
먼저 아래는 듀라맵에서 VWorld의 배경지도를 표시한 화면입니다.
위의 실행 화면에 대한 코드를 살펴보겠습니다. 먼저 TMS 레이어를 추가하는 코드입니다.
XrMapLib.ValueList URLs = new XrMapLib.ValueList();
URLs.AddValueByString(
"http://xdworld.vworld.kr:8080/2d/Base/201512/${z}/${x}/${y}.png");
XrMapLib.Extent MaxMBR = new XrMapLib.Extent();
MaxMBR.MinX = -20037508.342789244;
MaxMBR.MinY = -20037508.342789244;
MaxMBR.MaxX = 20037508.342789244;
MaxMBR.MaxY = 20037508.342789244;
double[] upps = {
78000, 39000, 19600, 9800, 4900, 2400, //Dummy
1222.9924523925781, 611.4962261962891, 305.74811309814453,
152.87405654907226, 76.43702827453613, 38.218514137268066,
19.109257068634033, 9.554628534317017, 4.777314267158508,
2.388657133579254, 1.194328566789627, 0.5971642833948135 };
XrMapLib.ValueList UPPs = new XrMapLib.ValueList();
for (int iUPP = 0; iUPP < upps.Length; ++iUPP)
{
double UPP = upps[iUPP];
double MapScale = axXr1.GetMapScaleFromUPP(UPP);
UPPs.AddValueByFloat(UPP, 14);
if (iUPP > 5)
{
Scales.Add(MapScale);
}
}
axXr1.Layers.AddTMSLayer("basemap", URLs, MaxMBR, UPPs, true);
axXr1.WaitForAllConnections();
XrMapLib.Coord MapCenter = new XrMapLib.Coord();
MapCenter.X = 14289580.202989;
MapCenter.Y = 4436964.90266281;
axXr1.MapCenter = MapCenter;
axXr1.MapScale = Scales[0];
axXr1.Update();
axXr1.MouseMode = XrMapLib.XrMapViewModeEnum.XrPanMode;
위의 코드 중 2번은 타일맵에 접근하기 위한 URL의 리스트입니다. VWorld는 TMS 이미지에 접근하기 위한 URL을 하나만 제공합니다. 5~9번 코드는 TMS의 전체 MBR 값입니다. 그리고 11번 코드에서 upps 배열에 저장된 값은 Units Per Pixel 값들로써, 1 픽셀당 몇 m인지에 대한 값입니다. 20번 코드의 반복문은 이 upps 배열을 통해 실제 지도 축척값을 계산하여 Scales라는 배열에 저장합니다. 33번 코드가서 TMS 레이어를 추가하는 코드이고, 37~40번 코드에서 첫 실행시 지도의 중심 위치와 지도 축척을 지정합니다. 앞서 UPP값을 지도 축척값으로 계산하여 Scales라는 배열에 저장한다고 하였는데, Scales 변수는 아래와 같습니다.
private List<double> Scales = new List<double>();
TMS를 통한 배경지도는 이미 정해진 축척 레벨이 존재합니다. 이 축척값으로 지도를 확대하고 축소할 경우에 가장 최상의 지도 품질을 사용자에게 제공할 수 있는데요. 듀라맵에서는 이를 위해 아래와 같은 코드가 필요합니다.
private void axXr1_OnBeforeMapDrawing(object sender, EventArgs e)
{
double NewMapScale = axXr1.MapScale;
int cntLevels = Scales.Count;
double Gap = Double.MaxValue;
int CurrentLevel = -1;
for (int i = 0; i < cntLevels; i++)
{
double ThatGap = Math.Abs(NewMapScale - Scales[i]);
if (Gap > ThatGap)
{
Gap = ThatGap;
CurrentLevel = i;
}
}
axXr1.MapScale = Scales[CurrentLevel];
}
위는 듀라맵의 OnBeforeMapDrawing 이벤트에 대한 코드로써, TMS에서 제공하는 가장 접합한 지도 축척값을 유지하도록 하고 있습니다. 위의 코드에 대한 Visual Studio 2013 프로젝트를 아래에 첨부합니다.
듀라맵 엔진은 제작사인 지오서비스의 자료실에서 다운로드 받으시기 바라며, 링크는 아래와 같습니다.
지오서비스 자료실