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' 카테고리의 다른 글
[C#][WPF] Canvas에 부채꼴(파이) 그리기 (2) | 2022.04.27 |
---|---|
[C#][WPF] 오프라인에서 mbtiles 파일로 GMap 사용하기 (3) | 2021.12.07 |
[C#][WPF] DataGrid 예제 (0) | 2021.12.07 |
댓글