본문 바로가기
C#/WPF

[C#][WPF] mbtiles 파일을 적용한 GMap에 Map Bound 추가하기

by 부먹짱 2022. 5. 11.
반응형

 

GMap에 mbtiles 맵을 적용 하여 지도를 구현하면

mbtiles 파일에 따라 지도 부분을 벗어났을 때 아래와 같이 공백 구간이 있을 수 있다.

 

 

이에 대한 해결책으로 사용자가 지도 범위를 벗어난 구간으로 드래그(화면 이동) 시,

자동으로 지도 범위의 끝으로 돌아오도록 Map Bound 기능을 추가해주었다.

 

  • Code
private void MapBound()
{
    if (mapControl.ViewArea == null) return;

    if (mapControl.ViewArea.Right >= 180)
    {
        if (mapControl.Zoom == 3) 
        	mapControl.Position = new PointLatLng(mapControl.Position.Lat, 75);
        else if (mapControl.Zoom == 4) 
        	mapControl.Position = new PointLatLng(mapControl.Position.Lat, 130);
        else if (mapControl.Zoom == 5) 
        	mapControl.Position = new PointLatLng(mapControl.Position.Lat, 150);
    }
    else if (mapControl.ViewArea.Left <= -180)
    {
        if (mapControl.Zoom == 3) 
        	mapControl.Position = new PointLatLng(mapControl.Position.Lat, -75);
        else if (mapControl.Zoom == 4) 
        	mapControl.Position = new PointLatLng(mapControl.Position.Lat, -130);
        else if (mapControl.Zoom == 5) 
        	mapControl.Position = new PointLatLng(mapControl.Position.Lat, --150);
    }

    if (mapControl.ViewArea.Top >= 90)
    {
        if (mapControl.Zoom == 3) 
        	mapControl.Position = new PointLatLng(70, mapControl.Position.Lng);
        else if (mapControl.Zoom == 4) 
        	mapControl.Position = new PointLatLng(80, mapControl.Position.Lng);
        else if (mapControl.Zoom == 5) 
        	mapControl.Position = new PointLatLng(85, mapControl.Position.Lng);
    }
    else if (mapControl.ViewArea.Bottom <= -90)
    {
        if (mapControl.Zoom == 3) 
        	mapControl.Position = new PointLatLng(-70, mapControl.Position.Lng);
        else if (mapControl.Zoom == 4) 
        	mapControl.Position = new PointLatLng(-80, mapControl.Position.Lng);
        else if (mapControl.Zoom == 5) 
        	mapControl.Position = new PointLatLng(-85, mapControl.Position.Lng);
    }
}

 

지도 화면의 현재 보이는 부분의 RectLatLng을 반환하는 ViewArea를 활용하였다.

 

단순하게 ViewArea의 Right, Left, Top, Bottom의 값이 180/-180/90/-90를 넘어가면

지도 화면의 Position을 바꿔주는 식으로 구현하였다.

ViewArea의 Right, Left, Top, Bottom 값을 바꿔줄 수 있다면 더 쉽겠지만 아쉽게도 읽기 전용이다.

 

Position은 중심점(위경도)이기 때문에 Zoom 크기 별로 다른 값을 넣어줘야한다.

Zoom 크기 별로 지도의 끝에 걸쳤을 때 Position 값을 찾아 넣어주었다.

 

위도가 지도 화면을 벗어났다면, 경도는 기존 값을 쓰고 위도 값만 찾아 변경해주면 되고

경도가 지도 화면을 벗어났다면, 위도는 기존 값을 쓰고 경도 값을 찾아 변경해주면 된다.

위경도가 모두 지도 화면을 벗어난 경우도 있을 수 있으므로, 양 쪽 다 검사하도록 조건문을 구현해준다.

 

반응형

 

MapBound() 함수를 구현했다면 해당 기능이 필요한 부분에 자유롭게 넣으면 된다.

만약 MapBound() 함수를 사용자의 동작에 따라 자동으로 실행되게 하고싶다면,

아래와 같은 함수를 만들어 지도 화면의 이벤트 함수에 추가해주면 된다.

 

private void PosChanged(object sender, MouseEventArgs e)
{
    MapBound();
}

 

mapControl.MouseLeftButtonUp += PosChanged; // 화면 이동
mapControl.MouseWheel += PosChanged; // zoom 변경

 

 

 

▽ 참고

[C#] [WPF] 오프라인에서 mbtiles 파일로 GMap 사용하기

 

[C#] [WPF] 오프라인에서 mbtiles 파일로 GMap 사용하기

WPF로 GMap을 구현하려고 하니 너무 자료가 없어서 힘들었다. 다른 분들은 편하게 구현하길 바라며 포스팅 하게 되었다. 먼저 Nuget에서 아래 두가지를 다운받는다. GMap.Net.Core GMap.NET.WinPresentation 그

bumukisbest.tistory.com

 

반응형

댓글