상위 목록: 하위 목록: 작성 날짜: 읽는 데 18 분 소요

다각형(Polygon)

다각형(Polygon)란 지도 위에 그려지는 도형을 의미합니다.

사각형을 비롯하여 임의의 도형을 지도 위에 표시할 수 있습니다.

주로, 특정 영역이나 공간을 표현할 때 사용합니다.



클래스 코드

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Collections.Generic;
using GMap.NET;
using GMap.NET.MapProviders;
using GMap.NET.WindowsForms;

namespace Project
{
    class Map
    {
        public GMapControl App;
        public List<PointLatLng> points = new List<PointLatLng>();
        public GMapOverlay PolygonOverlay = new GMapOverlay("polygons");

        public Map(GMapControl app)
        {
            // App Connection
            this.App = app;
            this.App.MapProvider = GMapProviders.GoogleMap;

            // Default Zoom Level
            this.App.Zoom = 16;
            this.App.MaxZoom = 25;
            this.App.MinZoom = 10;

            // Default Position
            this.App.Position = new PointLatLng(37.497872, 127.0275142);

            // Event Binding
            this.App.MouseDown += MouseDown;
        }

        private void MouseDown(object sender, MouseEventArgs e)
        {
            PolygonOverlay.Clear();
            App.Overlays.Clear();

            PointLatLng p = App.FromLocalToLatLng(e.X, e.Y);
            if (e.Button == MouseButtons.Left)
            {
                points.Add(p);
            }
            else if(e.Button == MouseButtons.Right)
            {
                if (points.Count > 0)
                {
                    points.RemoveAt(points.Count - 1);
                }
            }

            GMapPolygon polygon = new GMapPolygon(points, "polygon");
            polygon.Fill = new SolidBrush(Color.FromArgb(50, Color.Black));
            polygon.Stroke = new Pen(Color.Red, 1);

            PolygonOverlay.Polygons.Add(polygon);
            App.Overlays.Add(PolygonOverlay);
        }
    }
}


세부 코드

using System;
using System.Drawing;
using System.Windows.Forms;
using GMap.NET;
using GMap.NET.MapProviders;
using GMap.NET.WindowsForms;
using GMap.NET.WindowsForms.Markers;

namespaceGMap, Markers를 사용할 수 있도록 선언합니다.


public GMapOverlay PolygonOverlay = new GMapOverlay("polygons");
public List<PointLatLng> points = new List<PointLatLng>();

GMapOverlay란 GMap에서 사용하는 오버레이(Overlay)입니다.

마커(Maker)에서 사용되는 클래스와 동일합니다.

GMapOverlay(string id)의 구조를 가지며, 위 예제에서는 idpolygons로 적용합니다.

points 변수는 다각형에 저장할 좌표 배열을 의미합니다.


// Event Binding
this.App.MouseDown += MouseDown;

App에 대한 이벤트를 연결합니다.

MouseDown 이벤트는 지도에서 마우스 다운 이벤트가 발생할 때, 실행됩니다.


다각형 그리기

private void MouseDown(object sender, MouseEventArgs e)
{
    PolygonOverlay.Clear();
    App.Overlays.Clear();

    ...
}

마우스가 눌릴 때마다 다각형이 그려지므로, 기존 데이터에 누적되지 않도록 PolygonOverlayOverlays를 초기화합니다.

PolygonOverlay는 다각형들이 저장될 오버레이 변수이며, Overlays는 앞에서 저장된 오버레이들을 표시하는 변수입니다.

즉, PolygonOverlay는 다각형들의 묶음이며, Overlays는 다각형들의 묶음들을 표시하는 변수입니다.


PointLatLng p = App.FromLocalToLatLng(e.X, e.Y);
if (e.Button == MouseButtons.Left)
{
    points.Add(p);
}
else if(e.Button == MouseButtons.Right)
{
    if (points.Count > 0)
    {
        points.RemoveAt(points.Count - 1);
    }
}

좌측 마우스가 눌렸을 때, 마우스 좌표에 따른 위도와 경도를 points 변수에 추가합니다.

우측 마우스가 눌렸을 때, points 변수에서 가장 마지막에 추가된 좌표를 제거합니다.

  • Tip : points 변수에 데이터가 하나도 없다면, 오류가 발생하므로 조건문(if)을 추가하여 변수의 길이를 확인합니다.


GMapPolygon polygon = new GMapPolygon(points, "polygon");
polygon.Fill = new SolidBrush(Color.FromArgb(50, Color.Black));
polygon.Stroke = new Pen(Color.Red, 1);


GMapPolygon 클래스로 points 변수를 다각형화 시킵니다.

GMapPolygon(points, name)의 구조를 가지며, 위 예제에서는 namepolygon로 적용합니다.


Fill 필드는 다각형의 채우기 방법을 의미합니다.

Stroke 필드는 다각형의 테두리를 의미합니다.


PolygonOverlay.Polygons.Add(polygon);
App.Overlays.Add(PolygonOverlay);

PolygonOverlay.Polygons.Add 메서드를 활용하여 마우스로 그린 다각형을 추가합니다.

PolygonOverlay.Polygons.Add 메서드에 여러 개의 다각형을 오버레이에 추가할 수 있습니다.

App.Overlays.Add 메서드로 다각형 오버레이를 추가합니다.

App.Overlays.Add 메서드에 여러 개의 오버레이를 지도 앱에 추가할 수 있습니다.


원 그리기

private void MouseDown(object sender, MouseEventArgs e)
{
    App.Overlays.Clear();

    int radius = 36;
    int segments = 18;
    double seg = Math.PI * 2 / segments;
    List<PointLatLng> pts = new List<PointLatLng>();

    for (int i = 0; i < segments; i++)
    {
        double theta = seg * i;
        int x = (int)(e.X + Math.Cos(theta) * radius);
        int y = (int)(e.Y + Math.Sin(theta) * radius);

        PointLatLng point = App.FromLocalToLatLng(x, y);
        pts.Add(point);
    }
    GMapPolygon circle = new GMapPolygon(pts, "circle");
    circle.Fill = new SolidBrush(Color.FromArgb(50, Color.Blue));
    
    PolygonOverlay.Polygons.Add(circle);
    App.Overlays.Add(PolygonOverlay);
}

원을 그리는 방법도 다각형을 그리는 방법과 동일합니다.

이 방법은 마우스를 누를 때 마다 반지름이 36이며, 지점을 18 개를 갖는 뭉툭한 원이 그려집니다.

지도 앱의 오버레이만 초기화(App.Overlays.Clear())하기 때문에, 원은 그대로 유지됩니다.



출력 결과

다각형 그리기


원 그리기

댓글 남기기