GMAP.NET控件画圆

关于GMAP.NET地图控件在地图上操作的例子很多,但是关于画圆形的描述很少,我找到了GMAP官方的例子并在此基础上进行了部分的改动,实现了对GMAP地图控件的画圆操作。

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Threading.Tasks;
  6 using System.Drawing;
  7 using System.Runtime.Serialization;
  8 using GMap.NET;
  9 using GMap.NET.WindowsForms;
 10
 11 namespace tgmap
 12 {
 13 #if !PocketPC
 14     [Serializable]
 15     public class GMapMarkerCircle : GMapMarker, ISerializable
 16 #else
 17    public class GMapMarkerCircle : GMapMarker
 18 #endif
 19     {
 20         /// <summary>
 21         /// In Meters 用米数确定圆
 22         /// </summary>
 23         public int Radius;
 24
 25         /// <summary>
 26         /// 用两个点确定圆
 27         /// </summary>
 28         public PointLatLng P2;
 29
 30         /// <summary>
 31         /// 是否用米数确定圆
 32         /// </summary>
 33         public bool IsMeter = true;
 34
 35
 36         /// <summary>
 37         /// specifies how the outline is painted
 38         /// </summary>
 39         [NonSerialized]
 40 #if !PocketPC
 41         public Pen Stroke = new Pen(Color.FromArgb(155, Color.MidnightBlue));
 42 #else
 43       public Pen Stroke = new Pen(Color.MidnightBlue);
 44 #endif
 45
 46         /// <summary>
 47         /// background color
 48         /// </summary>
 49         [NonSerialized]
 50 #if !PocketPC
 51         public Brush Fill = new SolidBrush(Color.FromArgb(155, Color.AliceBlue));
 52 #else
 53       public Brush Fill = new System.Drawing.SolidBrush(Color.AliceBlue);
 54 #endif
 55
 56         /// <summary>
 57         /// is filled
 58         /// </summary>
 59         public bool IsFilled = true;
 60
 61         public GMapMarkerCircle(PointLatLng p)
 62            : base(p)
 63         {
 64             Radius = 0; // 0m
 65             P2 = p;
 66             IsHitTestVisible = false;
 67         }
 68
 69         public override void OnRender(Graphics g)
 70         {
 71             if (!IsMeter)
 72                 Radius = (int)Overlay.Control.MapProvider.Projection.GetDistance(Position, P2) * 1000;
 73
 74             int R = (int)((Radius) / Overlay.Control.MapProvider.Projection.GetGroundResolution((int)Overlay.Control.Zoom, Position.Lat)) * 2;
 75
 76             if (IsFilled)
 77             {
 78                 g.FillEllipse(Fill, new System.Drawing.Rectangle(LocalPosition.X - R / 2, LocalPosition.Y - R / 2, R, R));
 79             }
 80             g.DrawEllipse(Stroke, new System.Drawing.Rectangle(LocalPosition.X - R / 2, LocalPosition.Y - R / 2, R, R));
 81         }
 82
 83         public override void Dispose()
 84         {
 85             if (Stroke != null)
 86             {
 87                 Stroke.Dispose();
 88                 Stroke = null;
 89             }
 90
 91             if (Fill != null)
 92             {
 93                 Fill.Dispose();
 94                 Fill = null;
 95             }
 96
 97             base.Dispose();
 98         }
 99
100         public bool IsInside(PointLatLng p)
101         {
102             return (int)Overlay.Control.MapProvider.Projection.GetDistance(Position, p) * 1000 < Radius;
103         }
104
105 #if !PocketPC
106
107         #region ISerializable Members
108
109         void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
110         {
111             base.GetObjectData(info, context);
112
113             // TODO: Radius, IsFilled
114         }
115
116         protected GMapMarkerCircle(SerializationInfo info, StreamingContext context)
117            : base(info, context)
118         {
119             // TODO: Radius, IsFilled
120         }
121
122         #endregion
123
124 #endif
125     }
126 }

里面描述了两种画圆的方法,一种是根据半径(米)和Marker的Position来画圆,一种是根据Marker的Position和另外一个PointLatLng点来画圆。添加了IsInside方法来确认另一个点是否在圆内。第二种方法是为了实现鼠标点击拖动画圆,鼠标事件代码如下

 1 private GMapOverlay circles = new GMapOverlay("circle"); //放置circle的图层
 2         private GMapMarkerCircle drawingCircle = null; //正在画的circle
 3         private bool IsDrawingCircle = false;
 4
 5         private void MapControl_MouseDown(object sender, MouseEventArgs e)
 6         {
 7             circles.Markers.Clear();
 8             IsDrawingCircle = true;
 9             drawingCircle = new GMapMarkerCircle(mapControl.FromLocalToLatLng(e.X, e.Y));
10             drawingCircle.IsMeter = false;
11             circles.Markers.Add(drawingCircle);
12
13             //polygons.Polygons.Clear();
14             //IsDrawingPolygon = true;
15             //startX = e.X;
16             //startY = e.Y;
17             //drawingPolygon = new GMapPolygon(new List<PointLatLng>() { mapControl.FromLocalToLatLng(e.X,e.Y)}, "polygon");
18             //polygons.Polygons.Add(drawingPolygon);
19         }
20
21         private void MapControl_MouseUp(object sender, MouseEventArgs e)
22         {
23             IsDrawingCircle = false;
24             int count = 0;
25             markersOverlay.Markers.ToList().ForEach(ma=> {
26                 if (drawingCircle.IsInside(ma.Position))
27                 {
28                     count++;
29                 }
30             });
31             MessageBox.Show("区域内一共有" + count + "个marker(s)");
32
33             //IsDrawingPolygon = false;
34             //int count = 0;
35             //markersOverlay.Markers.ToList().ForEach(ma => {
36             //    if (drawingPolygon.IsInside(ma.Position))
37             //    {
38             //        count++;
39             //    }
40             //});
41             //MessageBox.Show("区域内一共有" + count  +"个marker(s)");
42         }
43
44         private void MapControl_MouseMove(object sender, MouseEventArgs e)
45         {
46             if (IsDrawingCircle)
47             {
48                 drawingCircle.P2 = mapControl.FromLocalToLatLng(e.X,e.Y);
49                 mapControl.UpdateMarkerLocalPosition(drawingCircle);
50                 mapControl.Refresh();
51             }
52
53             //if (IsDrawingPolygon)
54             //{
55             //    drawingPolygon.Points.Clear();
56             //    drawingPolygon.Points.Add(mapControl.FromLocalToLatLng(startX,startY));
57             //    drawingPolygon.Points.Add(mapControl.FromLocalToLatLng(startX, e.Y));
58             //    drawingPolygon.Points.Add(mapControl.FromLocalToLatLng(e.X, e.Y));
59             //    drawingPolygon.Points.Add(mapControl.FromLocalToLatLng(e.X, startY));
60             //    mapControl.UpdatePolygonLocalPosition(drawingPolygon);
61             //    mapControl.Refresh();
62             //}
63         }

注释的代码是我当初写拖动画矩形的部分,最终实现了鼠标放开后自动数出所画区域内Marker的数量,其实以后也可以对所有区域内的Marker进行进一步操作。

测试结果如下:

时间: 2024-11-08 05:15:36

GMAP.NET控件画圆的相关文章

[控件] 画饼状图的控件

画饼状图的控件 效果 注意:支持遮罩效果 源码 https://github.com/YouXianMing/CircleView // // CircleView.h // YXMWeather // // Created by XianMingYou on 15/5/12. // Copyright (c) 2015年 XianMingYou. All rights reserved. // #import <UIKit/UIKit.h> @interface CircleView : U

子对话框 TextControl 控件画坐标闪屏的问题

在子对话框的TextControl控件中画了坐标轴并填充的底色,一开始在 OnInit()中重绘textcontrol控件显示不出坐标轴,百度之,重写PreTranslateMessage函数搞定,但是存在闪屏问题,只要鼠标动就会闪屏,也找不到好的解决办法,最后设置了一个flag,控制PreTranslateMessage函数的执行次数得以解决问题.重写Onpaint和双缓冲技术连现实都显示不出来,不知道为什么.有更好解决办法的留言给个建议,谢谢. int flag=1;//控制PreTrans

C# Gmap.net控件的使用

1,首先要先添加引用Gmap.net的动态链接库.dll文件 2,初始化地图信息 public void MapShow() { try { System.Net.IPHostEntry ela = System.Net.Dns.GetHostEntry("www.google.com.hk"); } catch { gMap_control.Manager.Mode = AccessMode.ServerAndCache; MessageBox.Show("No inter

转载几篇别人写的皮肤类控件的技术文章

原连接:http://blog.sina.com.cn/s/blog_4c3538470100ezhu.html 实现控件的透明背景 很多情况下,我们需要控件 的背景是透明的,就是要求直接看到控件父窗口的背景颜色.背景位图,比如标签控件.单选Radio控件.复选Check控件,通常都要求在父窗口的背景上 进行绘制.然而要求控件的画布透明,这个技术在GDI的文档中没有看到Microsoft作任何说明,当然还是有别的办法. 其一: 如果程序支持桌面主题服务的话,则可调用主题服务的API来实现背景.我

WPF控件到图片的转换

在实际的项目开发中,经常需要将信息保存成图片的形式,如屏幕截图.地图快照等操作,我中最近一个项目中便有这样的需求,项目(WPF)中用到GMap.NET控件,中地图上展示一些信息,过程中可能用户需要将地图信息保存下来,也就是地图快照,我的界面如下所示: 网上查了GMap相关的资料,没有找到GMap怎么截图的方法,最后找到网友提供的方法:将WPF控件转换成图片. 具体实现如下: namespace QACDR2.Common { internal enum ImageType { Bmp, Gif,

自定义可视控件

由于本软件为音乐软件,需要大量绘图,现有的基于DC的API及BCB的画布均不能完成要求(速度慢,绘制特定图案困难),为了节省时间,派生了现有的TWinControl可视窗口控件,组合特定的绘图类,形成一个新的类,图案绘制在可视区域,重载控件的鼠标及键盘事件处理,形成标准的控制,这一切都实现了,但结果失败了,原因是自绘图完成后,系统刷新了一下控件,结果悲催了,改变窗体尺寸也要刷下一,可视窗口控件这一动作是正常的,问题是系统不认我的自绘图.解决问题的办法是系统刷后再绘,那么就截获WM_SIZE消息,

定制控件背景颜色与背景位图

本文讲述如何定制控件的背景颜色和背景位图的技巧. 首先要说一下控件的绘制过程:当控件的某个区域需要重绘时,都会触发WM_ERASEBKGND和WM_PAINT消息.比如控件的某个区域被另一个程序的窗口挡住了,而后那个窗口又被移走了,这时控件被挡住的内容就需要重新绘制了. 第一步:系统向控件发送WM_ERASEBKGND消息以实现背景的擦除工作(有时不发送,比如用户可能调用InvalidateRect(),其参数却指定不擦除背景,这样就没有这个消息): 第二步:系统向控件的窗口过程发送WM_PAI

支持Tooltips的控件包MindFusion.WinForms Pack

MindFusion.WinForms Pack是一款专业的控件包,包含了流程图绘制控件.图表和仪表控件.日历日程安排控件.报表控件.可以很容易地整合控件到应用程序中. 具体功能: 流程图控件: 支持文档视图结构 支持滚动和放大 支持Tooltips 支持多个选择 支持undo/redo.复制和粘贴操作 支持路径查找和循环检测 支持导出为图片.PDf.DXF.Visio 2003和SVG格式 支持容器节点 合并表单元格 锁定图形元素 扩展或者收缩多层对象 8种自动布局 可格式化的Html文本 支

(转)深入理解最强桌面地图控件GMAP.NET --- 原理篇

前几篇介绍了一些国内地图的案例, 深入理解最强桌面地图控件GMAP.NET --- SOSO地图 深入理解最强桌面地图控件GMAP.NET --- 百度地图 我们以Google地图为例,这章介绍下地图加载的原理. 投影(Projection) 谷歌地图采用的是墨卡托投影法,这里转载(http://www.cnblogs.com/willwayer/archive/2010/06/11/1756446.html) 下墨卡托投影的定义:墨卡托(Mercator)投影,又名“等角正轴圆柱投影”,荷兰地