GMap —— 绘制点集
来源:互联网 发布:离线看书软件 编辑:程序博客网 时间:2024/06/05 10:38
将在地图上用鼠标左键点击的点绘制出来(两点之间用直线连接),并且能够随地图一起实现等比例缩放和拖拽。
GMap主要涉及到几个坐标的转换:
经纬度与GPoint的转换:GPoint是gMapControl控件坐标,坐标原点(0,0)位于控件的左上角,这个转换用函数FromLatLngToLocal()完成。
GPoint与经纬度的转换:将控件坐标转换成经纬度,用函数FromLocalToLatLng完成。
GPoint与Graphics绘图坐标转换:Graphics是OnRender的形参,用来绘制地图显示内容的,Graphics坐标系的原点在地图控件的对称中心点。所以如果直接将GPoint绘制出来会出现偏移,即:GPoint(0, 0)点在控件上其实是在(mapControl.Size.Width / 2,mapControl.Size.Width / 2)处。
注:在地图进行缩放时,如果控件的MouseWheelZoomType属性是MousePositionAndCenter,鼠标会自动跳到控件的对称中心点。
这里主要是用自定义类GmapMarkerRoute,这个类继承自GMapMarker。
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Drawing;using GMap.NET;using GMap.NET.WindowsForms;namespace GMap{ class GmapMarkerRoute : GMapMarker { //用户绘制在视窗中的点,是将经纬度转换成GPoint再加上偏移处理后的点 private List<Point> Point = new List<Point>(); //需要绘制的经纬度点集 private List<PointLatLng> PointLL = new List<PointLatLng>(); // 是否有新的点加入 private bool HasNewPoint = false; //新加入点的经纬度 private PointLatLng NewPointLatLng; /// <summary> /// 图层缩放比例是否变化 /// </summary> public bool IsZoomChanged = false; /// <summary> /// 拖拽地图后图层原点与视窗原点的偏差向量 /// </summary> public Point OriginOffset = new Point(); /// <summary> /// 视窗原点相对于图层原点的像素偏差向量 /// 视窗原点默认是视窗中心点 /// 图层原点默认是视窗左上角的点 /// </summary> public Point Origin = new Point(); /// <summary> /// 绘制点集的pen /// </summary> public Pen pen = new Pen(Color.Red,1); public GmapMarkerRoute(GMap.NET.PointLatLng p):base(p) { } public override void OnRender(Graphics g) { GPoint gp = new GPoint(); //地图拖拽 if (this.Overlay.Control.IsDragging) { pen.Color = Color.Green; } //地图缩放比例改变后需要重新计算Point else if (IsZoomChanged) { pen.Color = Color.Black; OriginOffset.X = 0; OriginOffset.Y = 0; if (PointLL.Count > 1) { Point.Clear(); { foreach (PointLatLng p in PointLL) { gp = this.Overlay.Control.FromLatLngToLocal(p); Point.Add(new Point((int)(gp.X - Origin.X), (int)(gp.Y - Origin.Y))); } } } IsZoomChanged = false; } //其他事件 else { pen.Color = Color.Red; } //判断是否有新的点加入,如果有将其添加进Point点集 //同时也添加相应的经纬度到相关点集 if (HasNewPoint) { gp = this.Overlay.Control.FromLatLngToLocal(NewPointLatLng); Point.Add(new Point((int)gp.X - Origin.X - OriginOffset.X, (int)gp.Y - Origin.Y - OriginOffset.Y)); PointLL.Add(NewPointLatLng); HasNewPoint = false; } if (Point.Count > 1) { g.DrawLines(pen, Point.ToArray()); } } public void AddPoint(PointLatLng p) { NewPointLatLng = p; HasNewPoint = true; } }}
主界面代码
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;using System.IO;namespace GMap{ public partial class Form1 : Form { private GMapOverlay RouteMark = new GMapOverlay("RouteMark");//放置区域标记图层 /// <summary> /// 路径轨迹 /// </summary> private List<PointLatLng> RoutePoints = new List<PointLatLng>(); private GmapMarkerRoute Route = null; private Point RightBDPoint; private string CurrentDir = new DirectoryInfo(Environment.CurrentDirectory).Parent.Parent.FullName; private Timer blinkTimer = new Timer(); private Point BeforeZoomChangeMousePoint = new Point(); public Form1() { InitializeComponent(); mapControl.Manager.Mode = AccessMode.CacheOnly; //mapControl.CacheLocation = CurrentDir + "\\GMapCache\\mapdata.gmdb"; //缓存位置 mapControl.Manager.ImportFromGMDB(CurrentDir + "\\GMapCache\\mapdata.gmdb"); //mapControl.MapProvider = GMapProviders.GoogleChinaMap; //google china 地图 mapControl.MapProvider = GMapProviders.OpenStreetMap; mapControl.MinZoom = 2; //最小比例 mapControl.MaxZoom = 17; //最大比例 mapControl.Zoom = 14; //当前比例 mapControl.ShowCenter = false; //不显示中心十字点 mapControl.DragButton = System.Windows.Forms.MouseButtons.Right; //右键拖拽地图 mapControl.Position = new PointLatLng(30.6658229803096, 104.0647315979); //地图中心位置 mapControl.OnMapZoomChanged += new MapZoomChanged(mapControl_OnMapZoomChanged); mapControl.MouseDown += new MouseEventHandler(mapControl_MouseDown); mapControl.MouseUp += new MouseEventHandler(mapControl_MouseUp); mapControl.MouseMove += new MouseEventHandler(mapControl_MouseMove); mapControl.Overlays.Add(RouteMark); } void mapControl_MouseMove(object sender, MouseEventArgs e) { PointLatLng point = mapControl.FromLocalToLatLng(e.X, e.Y); BeforeZoomChangeMousePoint.X = e.X; BeforeZoomChangeMousePoint.Y = e.Y; } /// <summary> /// 地图拖拽向量 /// 在进行地图的缩放后需要将该偏移量清零 /// </summary> private int DragOffsetX = 0, DragOffsetY = 0; void mapControl_MouseUp(object sender, MouseEventArgs e) { if (e.Button == System.Windows.Forms.MouseButtons.Right) { //在拖拽地图后地图原点和视窗原点的偏移量 DragOffsetX = DragOffsetX + e.X - RightBDPoint.X; DragOffsetY = DragOffsetY + e.Y - RightBDPoint.Y; if (Route != null) { //设置Route的中心偏移 Route.OriginOffset.X = DragOffsetX; Route.OriginOffset.Y = DragOffsetY; } } } void mapControl_MouseDown(object sender, MouseEventArgs e) { if (e.Button == System.Windows.Forms.MouseButtons.Left) { PointLatLng point = mapControl.FromLocalToLatLng(e.X, e.Y); if (Route == null) { Route = new GmapMarkerRoute(point); Route.Origin.X = mapControl.Size.Width / 2; Route.Origin.Y = mapControl.Size.Height / 2; Route.OriginOffset.X = DragOffsetX; Route.OriginOffset.Y = DragOffsetY; RouteMark.Markers.Add(Route as GMapMarker); } Route.AddPoint(point); } else if (e.Button == System.Windows.Forms.MouseButtons.Right) { //记录鼠标按下位置 RightBDPoint.X = e.X; RightBDPoint.Y = e.Y; } } void mapControl_OnMapZoomChanged() { //在进行地图的缩放后,视图的原点会重新回到MapControl控件的中心点 DragOffsetX = 0; DragOffsetY = 0; if (Route != null) { Route.IsZoomChanged = true; } } }}
0 1
- GMap —— 绘制点集
- C#项目之 GMap.net 标记点及 绘制多点之间的距离
- GMap.Net地图绘点
- GMap
- GMap 自定义Marker以及规则图形的绘制
- 黑马程序员—在c#中绘制点、线、面
- OpenGL——点的绘制(使用OpenGL来绘制可旋转坐标系的螺旋线)
- 摄像机模型与标定—棋盘、亚像素角点和绘制棋盘角点
- 摄像机模型与标定—棋盘、亚像素角点和绘制棋盘角点
- HelloWorld ——显示以大连星海广场为中心的600*600的地图网页【GMap学习笔记】
- [OpenGL]图元的绘制——空间点/直线;图元整理
- OpenGL入门示例4——黑色背景绘制彩色点画线
- 图像识别(11)——LED灯光点捕获+基于QT平台绘制轨迹(1)
- 图像识别(12)——LED灯光点捕获+基于QT平台绘制轨迹(2)
- 《WebGL编程指南》学习笔记——4.绘制一个点
- 绘制棋盘角点
- 使用GDI绘制点
- 使用GDI绘制点
- <Linux内核源码>文件系统VFS内核4.0.4版本基本概念源码
- 跨浏览器事件处理 EventUtil
- Python定制类
- 桥接模式
- C++ Vector 使用总结
- GMap —— 绘制点集
- android本地数据存贮之sqlite
- 【MyBatis框架】MyBatis入门程序第一部分
- ccccccccc
- => 运算符(C# 参考)
- 数据库 分布式系统的事务处理
- openfire+spark+smack实现即时通讯
- 智能家居通信协议已够乱,三星、Nest、ARM你们加个毛“线”(Thread)呀
- 黑马程序员_函数的两个特性(重写和重载)