大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全家桶1年46,售后保障稳定
将在地图上用鼠标左键点击的点绘制出来(两点之间用直线连接),并且能够随地图一起实现等比例缩放和拖拽。
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;
}
}
}
Jetbrains全家桶1年46,售后保障稳定
主界面代码
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;
}
}
}
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/209964.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...