- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章GMap.Net开发之自定义Marker使用方法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
自定义Marker,可以理解为在地图上自定义图标(Custom Marker),先看看GMap的地图和图标的显示方式:
Map控件上可以添加Overlay(图层),可以添加多个图层,先添加的图层在下面显示.
图层上可以添加GMapMarker,当然也可以添加GMapPolygon和GMapRoute,后续介绍.
在地图的使用中常要求的功能就是添加自定义图标,可以点击图标、删除图标、拖动图标、高亮图标等.
下面介绍这些功能的实现(主要是基于WinForm的,WPF的可以参考官方Demo实现):
1、自定义图标,使用官方的Marker:
。
。
直接使用GMap.NET.WindowsForms.Markers中的GMarkerGoogle,传入一个Bitmap,就可以使用自定义的图片来做图标.
2、继承GMapMarker,自定义Marker:
。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using GMap.NET; using GMap.NET.WindowsForms; using System.Drawing,
。
namespace GMapWinFormDemo { class GMapMarkerImage : GMapMarker { private Image image; public Image Image { get { return image; } set { image = value; if (image != null) { this.Size = new Size(image.Width, image.Height); } } } 。
public Pen Pen { get; set; } 。
public Pen OutPen { get; set; } 。
public GMapMarkerImage(GMap.NET.PointLatLng p, Image image) : base(p) { Size = new System.Drawing.Size(image.Width, image.Height); Offset = new System.Drawing.Point(-Size.Width / 2, -Size.Height / 2); this.image = image; Pen = null; OutPen = null; } 。
public override void OnRender(Graphics g) { if (image == null) return,
Rectangle rect = new Rectangle(LocalPosition.X, LocalPosition.Y, Size.Width, Size.Height); g.DrawImage(image, rect),
if (Pen != null) { g.DrawRectangle(Pen, rect); } 。
if (OutPen != null) { g.DrawEllipse(OutPen, rect); } } 。
public override void Dispose() { if (Pen != null) { Pen.Dispose(); Pen = null; } 。
if (OutPen != null) { OutPen.Dispose(); OutPen = null; } 。
base.Dispose(); } } } 。
。
介绍下GMapMarkerImage三个属性的作用:
Image:保存图标的图片.
Pen:在图片外围画DrawRectangle的Pen,当其不为null的时候,会在图片的外围画一个矩形,实现高亮(highlight)的效果.
OutPen:在图片外围画DrawEllipse的Pen,当其不为null的时候,会在图片外围画一个一个椭圆,设置这个值可以实现闪动.
3、移动图标(Move Marker)的实现:
在MapControl中添加如下事件的响应:
。
mapControl.MouseDown += new MouseEventHandler(mapControl_MouseDown); mapControl.MouseUp += new MouseEventHandler(mapControl_MouseUp); mapControl.MouseMove += new MouseEventHandler(mapControl_MouseMove),
。
mapControl.OnMarkerClick += new MarkerClick(mapControl_OnMarkerClick); mapControl.OnMarkerEnter += new MarkerEnter(mapControl_OnMarkerEnter); mapControl.OnMarkerLeave += new MarkerLeave(mapControl_OnMarkerLeave),
。
MouseDown和MouseUp中判断左键是否按下(用左键来移动图标).
OnMarkerEnter中设置选中的Marker,同时设置Pen的值,实现高亮.
OnMarkerLeave中取消选中的Marker,取消Pen的值,取消高亮.
MouseMove中更新选中选中Marker的Position就可以了.
4、图标闪动的实现:
需要一个定时器:使用的是Form下的Timer,定时器响应的事件:
。
。
更新所有Marker的OutPen的值(当然你也可以只更新某个Marker),通过在图标上画圈圈来实现闪动,当然你也可以通过设置Marker的IsVisible属性来实现自己想要的效果。。.
效果图如下:
全部代码如下:
。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using GMap.NET; using GMap.NET.WindowsForms; using GMap.NET.MapProviders; using GMap.NET.WindowsForms.Markers,
。
namespace GMapWinFormDemo { public partial class MainForm : Form { private GMapOverlay objects = new GMapOverlay("objects"); //放置marker的图层 private GMapMarkerImage currentMarker; private bool isLeftButtonDown = false,
private Timer blinkTimer = new Timer(),
public MainForm() { InitializeComponent(),
try { System.Net.IPHostEntry e = System.Net.Dns.GetHostEntry("www.google.com.hk"); } catch { mapControl.Manager.Mode = AccessMode.CacheOnly; MessageBox.Show("No internet connection avaible, going to CacheOnly mode.", "GMap.NET Demo", MessageBoxButtons.OK, MessageBoxIcon.Warning); } 。
mapControl.CacheLocation = Environment.CurrentDirectory + "\\GMapCache\\"; //缓存位置 mapControl.MapProvider = GMapProviders.GoogleChinaMap; //google china 地图 mapControl.MinZoom = 2; //最小比例 mapControl.MaxZoom = 17; //最大比例 mapControl.Zoom = 5; //当前比例 mapControl.ShowCenter = false; //不显示中心十字点 mapControl.DragButton = System.Windows.Forms.MouseButtons.Left; //左键拖拽地图 mapControl.Position = new PointLatLng(32.064,118.704); //地图中心位置:南京 。
mapControl.OnMapZoomChanged += new MapZoomChanged(mapControl_OnMapZoomChanged); mapControl.MouseClick += new MouseEventHandler(mapControl_MouseClick); mapControl.MouseDown += new MouseEventHandler(mapControl_MouseDown); mapControl.MouseUp += new MouseEventHandler(mapControl_MouseUp); mapControl.MouseMove += new MouseEventHandler(mapControl_MouseMove),
mapControl.OnMarkerClick += new MarkerClick(mapControl_OnMarkerClick); mapControl.OnMarkerEnter += new MarkerEnter(mapControl_OnMarkerEnter); mapControl.OnMarkerLeave += new MarkerLeave(mapControl_OnMarkerLeave),
mapControl.Overlays.Add(objects); } 。
void mapControl_MouseMove(object sender, MouseEventArgs e) { if (e.Button == System.Windows.Forms.MouseButtons.Left && isLeftButtonDown) { if (currentMarker != null) { PointLatLng point = mapControl.FromLocalToLatLng(e.X, e.Y); currentMarker.Position = point; currentMarker.ToolTipText = string.Format("{0},{1}", point.Lat, point.Lng); } } } 。
void mapControl_MouseUp(object sender, MouseEventArgs e) { if (e.Button == System.Windows.Forms.MouseButtons.Left) { isLeftButtonDown = false; } } 。
void mapControl_MouseDown(object sender, MouseEventArgs e) { if (e.Button == System.Windows.Forms.MouseButtons.Left) { isLeftButtonDown = true; } } 。
void mapControl_OnMarkerLeave(GMapMarker item) { if (item is GMapMarkerImage) { currentMarker = null; GMapMarkerImage m = item as GMapMarkerImage; m.Pen.Dispose(); m.Pen = null; } } 。
void mapControl_OnMarkerEnter(GMapMarker item) { if (item is GMapMarkerImage) { currentMarker = item as GMapMarkerImage; currentMarker.Pen = new Pen(Brushes.Red, 2); } } 。
void mapControl_OnMarkerClick(GMapMarker item, MouseEventArgs e) { } 。
void mapControl_MouseClick(object sender, MouseEventArgs e) { if(e.Button == System.Windows.Forms.MouseButtons.Right) { //objects.Markers.Clear(); PointLatLng point = mapControl.FromLocalToLatLng(e.X,e.Y); //GMapMarker marker = new GMarkerGoogle(point, GMarkerGoogleType.green); Bitmap bitmap = Bitmap.FromFile("F:\\Projects\\GMapDemo\\GMapDemo\\Image\\A.png") as Bitmap; //GMapMarker marker = new GMarkerGoogle(point, bitmap); GMapMarker marker = new GMapMarkerImage(point, bitmap); marker.ToolTipMode = MarkerTooltipMode.OnMouseOver; marker.ToolTipText = string.Format("{0},{1}", point.Lat, point.Lng); objects.Markers.Add(marker); } } 。
void mapControl_OnMapZoomChanged() { } 。
private void buttonBeginBlink_Click(object sender, EventArgs e) { blinkTimer.Interval = 1000; blinkTimer.Tick += new EventHandler(blinkTimer_Tick); blinkTimer.Start(); } 。
void blinkTimer_Tick(object sender, EventArgs e) { foreach (GMapMarker m in objects.Markers) { if (m is GMapMarkerImage) { GMapMarkerImage marker = m as GMapMarkerImage; if (marker.OutPen == null) marker.OutPen = new Pen(Brushes.Red, 2); else { marker.OutPen.Dispose(); marker.OutPen = null; } } } mapControl.Refresh(); } 。
private void buttonStopBlink_Click(object sender, EventArgs e) { blinkTimer.Stop(); foreach (GMapMarker m in objects.Markers) { if (m is GMapMarkerImage) { GMapMarkerImage marker = m as GMapMarkerImage; marker.OutPen.Dispose(); marker.OutPen = null; } } mapControl.Refresh(); } } } 。
。
最后此篇关于GMap.Net开发之自定义Marker使用方法的文章就讲到这里了,如果你想了解更多关于GMap.Net开发之自定义Marker使用方法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我在使用 JSF2.0 的 Primefaces 3.5 的 Gmap 组件的项目上遇到问题。我有这个命令按钮,可以对标记进行过滤和最重要的更新 mapForm map 形式:
我使用的是 Gmap.NET 的 WinForm 版本。我正在做的是为每个标记创建 1 个叠加层,然后将其添加到我的 map 控件中。这显着减少了我程序中的延迟。现在唯一的问题是,如果我想隐藏一个覆盖
我正在尝试创建一个应用程序位置,但它向我显示错误 gmaps (com.formation.gmaps) 的应用程序已意外停止。 请注意,我已经卸载了eclipse,但总是出现此错误。 这是我的错误日
我在使用 angular-google-maps 时遇到问题。我只想将基本的信息窗口附加到 map 上的每个标记。我正在使用 ui-gmap-markers 并在每个标记指令内放置一个 ui-gmap
自定义Marker,可以理解为在地图上自定义图标(Custom Marker),先看看GMap的地图和图标的显示方式: Map控件上可以添加Overlay(图层),可以添加多个图层,先添加的图
我正在尝试制作一个能够显示 map 的小应用程序。我遇到了 GMap.Net,它非常适合我的目的,除了 map 没有完全显示在控件中。我附上了一张图片,希望你能理解我的问题。 我的加载按钮代码是 pr
我想使用 GMap.Net 的路线方法绘制路线。但是,当我用新颜色将任何点添加到路线列表中时,所有路线的颜色都发生了变化。因此,一条路线似乎只能使用一种颜色。有没有办法在一条 route 使用两种或多
我打算使用GMap.Net设计Windows窗体应用程序,以查看供个人使用的离线地图。我已经有一些mapdata,可以使用通用映射downloader下载,可以将其转换为sqlite db格式。但是G
我在我的 Windows 应用程序 (C#) GMAP API 中使用,我需要显示 map 的地形特征,因此,我尝试按如下方式分配 map 的提供者: Map.MapProvider = GMapP
我需要处理 map 上的每个标记,所以我想要的是这样的: var marker[5] = new google.maps.Marker({ position: new google.maps.La
我正在尝试实现此功能( GMap - Info Window)在我的网站上。 标记有效,但信息窗口从未显示。我尝试在 applicationContext.xml 中为 InfoWindowView.
我可以在悬停时更改标记大小吗?我需要在悬停时增加标记大小 (2-3 px) 并在鼠标移开时减小到默认大小。 最佳答案 如果您使用自定义图标,您可以轻松地在鼠标悬停时更改图像: [...] var ma
IsMouseOverMarker 属性检测点击标记就好了,但是当尝试使用 GMap 控件的 IsMouseOverPolygon 属性检测用户是否点击多边形时行 - 它似乎不起作用。 注意:GMap
我正在使用 gmap.net 控件在 Windows 窗体上显示 map 。到目前为止,除了 map 拖动功能外,一切正常。一般来说,左鼠标按钮支持 map 拖动,但在 gmap.net 控件中鼠标右
我正在尝试从该位置输出路线时间,由于某种原因该路线从未经过。 jQuery(document).ready(function () { $.get('api/index.php', funct
我有一个关于 jQuery Google map 代码的简单问题。 我已向 map 添加了标记,但信息窗口在开始时不会显示,仅在鼠标悬停后才显示。 这是代码: (function ($) { var
我正在尝试创建一个位置输入字段,用户将在其中选择一个位置。因此 map 上应该只存在一个标记。 我当前的代码在点击时添加了一个标记: var map = new GMaps({
我正在使用 gmaps.js,我可以使用此代码绘制多边形 var paths = []; function drawPoly(p1, p2) { paths.push([p1, p2]); c
当我拖动标记时,是否可以禁用 google mal (v3) 内部的移动?我不想使用静态 map 。我需要一般的移动功能,但是当我拖动标记时, map 不应该移动。 非常感谢! 最佳答案 标记有 dr
我们在创建多边形时遇到问题,因为它们没有出现在 map 上。我们按照本教程来实现我们的解决方案: http://googlemaps.subgurim.net/ejemplos/ejemplo_941
我是一名优秀的程序员,十分优秀!