C# GMap.NET 강좌 : 제 4강 - 다각형 그리기
다각형(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;
namespace
에 GMap
, Markers
를 사용할 수 있도록 선언합니다.
public GMapOverlay PolygonOverlay = new GMapOverlay("polygons");
public List<PointLatLng> points = new List<PointLatLng>();
GMapOverlay
란 GMap에서 사용하는 오버레이(Overlay)
입니다.
마커(Maker)
에서 사용되는 클래스와 동일합니다.
GMapOverlay(string id)
의 구조를 가지며, 위 예제에서는 id
를 polygons
로 적용합니다.
points
변수는 다각형
에 저장할 좌표 배열을 의미합니다.
// Event Binding
this.App.MouseDown += MouseDown;
App
에 대한 이벤트를 연결합니다.
MouseDown
이벤트는 지도에서 마우스 다운 이벤트가 발생할 때, 실행됩니다.
다각형 그리기
private void MouseDown(object sender, MouseEventArgs e)
{
PolygonOverlay.Clear();
App.Overlays.Clear();
...
}
마우스가 눌릴 때마다 다각형이 그려지므로, 기존 데이터에 누적되지 않도록 PolygonOverlay
와 Overlays
를 초기화합니다.
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)
의 구조를 가지며, 위 예제에서는 name
를 polygon
로 적용합니다.
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()
)하기 때문에, 원은 그대로 유지됩니다.
출력 결과
다각형 그리기
원 그리기
공유하기


댓글 남기기