본문으로 바로가기

일반적으로 C#을 이용해 WinForms 혹은 WPF 기반으로 지도 앱을 개발 하면 WebView를 통해서 html을 불러오는 방식으로 개발한다.

Google, Bing, Daum, Naver와 같은 포털 사이트들은 Map API를 제공한다.

하지만 이러한 MAP API들은 인터넷에 연결되어 있어야 하고 대부분 웹 기반(Javascript...)으로 동작한다.

여기서 생각해볼 점은 아래와 같다.

① 앱이 오프라인에서도 동작할 수 있는가?

② C#을 이용해 개발할 수 있는가?

이러한 문제들을 해결하려면 GMap.Net을 이용하면 된다.

GMap.Net

WinForms, WPF, Windows mobile 에서 사용할 수 있는 크로스플랫폼 오픈소스 .NET 컨트롤

Coogle, Yahoo !, Bing, OpenStreetMap, ArcGIS, Pergo, SigPac, Yendux, Mapy.cz, Maps.lt, iKarte.lv, NearMap, OviMap, CloudMade, WikiMapia, Windows의 MapQuest에서 라우팅, 지오 코딩, 길 찾기,지도 표시 기능 제공

수년간 존재하면서 처음에는 WinForm을 주로 지원했지만 지금은 WPF도 지원해주지만, WPF 온라인 개발 예제는 거의 없음.

 

Winform과 WPF는 데스크탑 프로그램 개발을위한 두 가지 주요 프레임 워크이다.

WPF를 이용한 GMap.Net 앱 예제는 현재 웹에서 찾기가 힘들지만 앞으로 WPF 가 더 많이 이용될 것이기 때문에 우선적으론 WPF을 이용하기로 했다.

아래는 인터넷에서 찾은 자료이다.

WPF는 많은 파괴적인 개념을 가진 최신 프레임 워크입니다. 많은 사람들이 WPF의 개념을 이해하기 어렵다고 생각하고 동시에 GMap.net의 WPF 패키지는 충분하지 않으며 winform 버전만큼 사용하기가 쉽지 않다고 생각합니다. winform 버전과 비교하여 GMap.net의 WPF 버전은 일부 기능을 생략합니다. 이는 WPF 자체가 매우 강력하고 유연하기 때문에 GMap.net이 이러한 기능을 추가하기 때문입니다. "마크 감지 "는 예입니다. Winform 버전에는 마크를 직접 감지하는 콜백 기능이 있으며 WPF 버전은 생략됩니다. WPF는 시각적 트리 HitTest 기능으로 확인할 수 있습니다.이 감지 방법은 더 유연합니다.

https://www.jqhtml.com/44910.html

 

1) Nuget 에서 GMap 패키지 설치

WPF 에서만 개발하려면 아마 위에 밑줄 친 2개만 설치해도 되는 것 같다. (이것저것 하느라 나는 많이 설치했지만...)

1) MapControl.cs 클래스 생성

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using GMap.NET.WindowsPresentation;

namespace Eunmi2
{
    class MapControl : GMapControl
    {

    }

2) MainWindow.xaml 변경

 <Grid>
        <GroupBox Name="mapgroup" VerticalContentAlignment="Stretch" HorizontalContentAlignment="Stretch">
            <local:MapControl x:Name="mapControl" Zoom="13" MaxZoom="24" MinZoom="1" />
        </GroupBox>
</Grid>

3) MainWindow.xaml.cs 변경

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using GMap.NET;
using GMap.NET.MapProviders;
using GMap.NET.WindowsPresentation;


namespace Eunmi2
{
    /// <summary>
    /// MainWindow.xaml에 대한 상호 작용 논리
    /// </summary>
    public partial class MainWindow : Window
    {
        PointLatLng start;
        PointLatLng end;

        // marker
        GMapMarker currentMarker;

        // zones list
        List<GMapMarker> Circles = new List<GMapMarker>();

        

        public MainWindow()
        {
            InitializeComponent();

            GoogleMapProvider.Instance.ApiKey = "AIzaSyCXJrDpszuNQfMEXKIifx5zYzhSq3Irpyg";

            // config map
            mapControl.MapProvider = GMapProviders.OpenStreetMap;
            mapControl.Position = new PointLatLng(35.696874, 128.457701);
            mapControl.MinZoom = 2;  
            mapControl.MaxZoom = 17;
            mapControl.Zoom = 13;
            mapControl.ShowCenter = false;
            mapControl.DragButton = MouseButton.Left;
            mapControl.Position = new PointLatLng(35.696874, 128.457701);

            mapControl.MouseLeftButtonDown += new MouseButtonEventHandler(mapControl_MouseLeftButtonDown);
        }

        void mapControl_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            Point clickPoint = e.GetPosition(mapControl);
            PointLatLng point = mapControl.FromLocalToLatLng((int)clickPoint.X, (int)clickPoint.Y);
            GMapMarker marker = new GMapMarker(point);
            marker.Shape = new Ellipse
            {
                Width = 10,
                Height = 10,
                Stroke = Brushes.Black,
                StrokeThickness = 1.5
            };
            mapControl.Markers.Add(marker);
        }

    }
}

 

마우스 클릭시 마커가 추가되는 기본적인 EventHandler 를 구현했으며,

maker 스타일을 검은색 Stroke로 주었기 때문에 아래 캡처와같이 까만 원으로 표시되는걸 확인할 수 있다.

 

 

※ 참고 URL

https://www.jqhtml.com/44910.html

https://yq.aliyun.com/articles/50439