Gmap.net搜集

GMap.NET是一个强大、免费、跨平台、开源的.NET控件,它在Windows Forms 和WPF环境中能够通过Google, Yahoo!, Bing, OpenStreetMap, ArcGIS, Pergo, SigPac等实现寻找路径、地理编码以及地图展示功能,并支持缓存和运行在Mobile环境中。

GMap.NET是一个开源的GEO地图定位和跟踪程序。就像谷歌地图、雅虎地图一样,可以自动计算两地的距离,定位经纬度,与Google地图不同的是,该项目是建立在C#语言WinForm基础上的。可以对地图放大缩小,进行城市标记等。

Gmap.net项目原地址(http://greatmaps.codeplex.com/

博客:http://www.cnblogs.com/enjoyeclipse/archive/2013/01/31/2882254.html

Manager.Mode : 数据访问模式,一般设置为AccessMode.ServerAndCache
MapProvider : 地图提供商,一般使用GMapProviders.GoogleChinaMap

DragButton : 移动地图的鼠标按键,默认为右键,通常将其设置为 MouseButtons.Left

MaxZoom : 最大倍数,为一个int
MinZoom : 最小倍数,为一个int
Zoom : 当前倍数,为一个int

Position : 地图的聚焦点,为一个PointLatLng

PointLatLng :包含两个两个double表示经纬度的点,Lat表示纬度,Lng表示纬度
(30.55,114.29)武汉的一个点

GMapOverlay : 图层,通过gMap.Overlays.Add方法添加到地图中,可存放标记、路径等

GMarkerGoogle : 标记,存放在层中,新建时需要一个PointLatLng表示其位置信息和一个Bitmap表示其在地图上显示的图片
常用属性有
Tag,常用来存放一个唯一值,以便调用该标记
ToolTipText,标记显示的文本
ToolTipMode,设置ToolTip显示的模式,有始终显示、从不显示、鼠标停留时显示三种
IsVisible,标记是否可见

GMapRoute : 路径,可画出两点之间的线路、直线

SelectedArea : 当前选择区域,Shift+拖动右键 可以设置
LocationTopLeft,左上角的点,为一个PointLatLng
LocationRightBottom,右下角的点 为一个PointLatLng
gMap.SelectedArea = RectLatLng.Empty 可将其设置为空
通过新建一个RectLatLng并赋值,可以设置当前选择区域:
RectLatLng area = new RectLatLng();
area.LocationTopLeft = new PointLatLng(leftLat,leftLon);
area.Size = new SizeLatLng(leftLat-rightLat,rightLon-leftLon);
mainMap.SelectedArea = area;
mainMap.Position = area.LocationMiddle;

地图初始化

//地图由三层组成。最上层:GMapMarker.中间层:GMapOverlay。最底层:GMapControl。  
GMapOverlay objects;
GMapControl MainMap;
List<GMapMarker> markerList = new List<GMapMarker>();
PointLatLng currentPositionLat ;
public showMap()
{
InitializeComponent();
//获得地图信息,默认北京位置。
SuspendLayout();
MainMap = new GMapControl();
{
//Google中国地图。
MainMap.MapProvider = GMapProviders.GoogleChinaMap;
MainMap.Position = new PointLatLng(23.129163, 113.264435);
currentPositionLat = MainMap.Position;
MainMap.MinZoom = 1;
MainMap.MaxZoom = 19;
MainMap.Zoom = 10;
this.trackBar.Value = (int)MainMap.Zoom;
MainMap.Dock = DockStyle.Fill;
MainMap.MarkersEnabled = true;

}

//this.MainMap.ReloadMap();//重新加载地图。
GMapProvider.Language = LanguageType.ChineseSimplified;

//最上层的图标显示。

MainMap.Cursor = Cursors.Hand;
var current = new PointLatLng(MainMap.Position.Lat, MainMap.Position.Lng);
var currentMark = new GMarkerGoogle(current, GMarkerGoogleType.green);
var overlay = new GMapOverlay("current");

//overlay.Markers.Add(currentMark);
MainMap.Overlays.Add(overlay);

Cursor.Current = Cursors.Hand;

//用户双击标记选中点。并获得当前的经纬度。
{
MainMap.MouseDoubleClick += new MouseEventHandler(MainMap_MouseDoubleClick);
MainMap.MouseWheel += new MouseEventHandler(MainMap_MouseWheel);
MainMap.MouseDown+=new MouseEventHandler(MainMap_MouseDown);
}
ResumeLayout(true);
objects = new GMapOverlay("objects");
MainMap.Overlays.Add(objects);
gMapControl1.Controls.Add(MainMap);
//GMapMarkerRect rect = new GMapMarkerRect(MainMap.Position);
//rect.Size = new System.Drawing.Size(0, 0);
//rect.ToolTipText = "北京市";
//rect.ToolTipMode = MarkerTooltipMode.Always;
//overlay.Markers.Add(rect);

MainMap.DragButton = MouseButtons.Left;
txtAddress.Focus();

 

 

//用户选中地图位置,获得经纬度。
public void MainMap_MouseDoubleClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
//图标显示。
Cursor.Current = Cursors.Hand;
PointLatLng latLng = MainMap.FromLocalToLatLng(e.X, e.Y);
//var current = new PointLatLng(Math.Abs(latLng.Lat), latLng.Lng);
//var currentMark = new GMarkerGoogle(current, GMarkerGoogleType.green);
//var overlay = new GMapOverlay("current");
//MainMap.MarkersEnabled = false;
//overlay.Markers.Clear();
//MainMap.Overlays.Clear();
//overlay.Markers.Add(currentMark);
//MainMap.Overlays.Add(overlay);
//MainMap.MarkersEnabled = true;
//Cursor.Current = Cursors.Hand;

MainMap.Position = latLng;
setMainMapZoom(true);
//this.positionLabel.Text = string.Format("经度:{0}, 纬度:{1} ", latLng.Lng, latLng.Lat);

showAlarmFrm frm = new showAlarmFrm(latLng.Lat,latLng.Lng,"你好");
frm.Show();
}
}

//鼠标点击事件获取地图当前坐标

private void MainMap_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
PointLatLng latLng = MainMap.FromLocalToLatLng(e.X, e.Y);
currentPositionLat = latLng;
}
}

//搜索
private void button1_Click(object sender, EventArgs e)
{
if (this.txtAddress.Text.Length == 0)
{
this.txtAddress.Focus();
MessageBox.Show("请输入查询的地址");
}
else
{
searchAddressMap(this.txtAddress.Text);
}
}

private void searchAddressMap(string address)
{
this.MainMap.ReloadMap();
GMapProvider.Language = LanguageType.ChineseSimplified;
string search = string.Format("{0}", address);

//判断地址键是否存在。
GeoCoderStatusCode code = MainMap.SetCurrentPositionByKeywords(search);
if (code != GeoCoderStatusCode.G_GEO_SUCCESS)
{
MessageBox.Show("地址没有找到:'" + address + "', 原因:" + code.ToString(), "GMap.NET", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
else
{
objects = new GMapOverlay("objects");
objects.Markers.Clear();
this.MainMap.Overlays.Clear();
AddLocation(search);
}
}

/// <summary>
/// 根据具体地址名称来显示此地址的地图:由地址获得经纬度,再显示地图位置。
/// </summary>
/// <param name="place">地址名称</param>
private void AddLocation(string place)
{
GeoCoderStatusCode unknow = GeoCoderStatusCode.Unknow;
PointLatLng? latLngFromGeocoder = GMap.NET.MapProviders.GMapProviders.GoogleChinaMap.GetPoint(place, out unknow);
if (latLngFromGeocoder.HasValue && (unknow == GeoCoderStatusCode.G_GEO_SUCCESS))
{
GMapMarker item = new GMarkerGoogle(latLngFromGeocoder.Value, GMarkerGoogleType.green);
objects = new GMapOverlay("objects");
objects.Markers.Add(item);
MainMap.Overlays.Add(objects);

}
}

//放大地图
private void buttonZoomUp_Click(object sender, EventArgs e)
{
setMainMapZoom(true);

}
//缩小地图
private void buttonZoomDown_Click(object sender, EventArgs e)
{
setMainMapZoom(false);

}
/// <summary>
/// 放大地图或者缩小地图
/// </summary>
/// <param name="smallOrBig">true放大,false缩小</param>
private void setMainMapZoom(bool smallOrBig)
{
if (smallOrBig == false)
{
if (MainMap.Zoom > MainMap.MinZoom)
{
MainMap.Zoom -= 1;
}

if (this.trackBar.Value > this.trackBar.Minimum)
{
this.trackBar.Value = this.trackBar.Value - 1;
}
}
else
{
if (MainMap.Zoom < MainMap.MaxZoom)
{
MainMap.Zoom += 1;
}
if (this.trackBar.Value < this.trackBar.Maximum)
{
this.trackBar.Value = this.trackBar.Value + 1;
}
}
}


public void MainMap_MouseWheel(object sender, MouseEventArgs e)
{
PointLatLng latLng = MainMap.FromLocalToLatLng(e.X, e.Y);
MainMap.Position = latLng;
if (e.Delta > 0)
setMainMapZoom(true);
else
setMainMapZoom(false);

}

//画出两点之间的线路

//设定开始点
private void startPositionItem_Click(object sender, EventArgs e)
{
var start = new PointLatLng(currentPositionLat.Lat, currentPositionLat.Lng);
var startMarker = new GMarkerGoogle(start, GMarkerGoogleType.green);
startMarker.IsHitTestVisible = true;
startMarker.ToolTipMode = MarkerTooltipMode.Always;
startMarker.ToolTipText = "起点";
objects.Markers.Add(startMarker);
markerList.Add(startMarker);

this.startPositionItem.Enabled = false;
}
//设定终点
private void endPositionItem_Click(object sender, EventArgs e)
{
var end = new PointLatLng(currentPositionLat.Lat, currentPositionLat.Lng);
var endMarker = new GMarkerGoogle(end, GMarkerGoogleType.red);
endMarker.IsHitTestVisible = true;
endMarker.ToolTipMode = MarkerTooltipMode.Always;
endMarker.ToolTipText = "终点";
objects.Markers.Add(endMarker);
markerList.Add(endMarker);
this.endPositionItem.Enabled = false;

DrawPathToMap();
}

/// <summary>
/// 根据起点和终点绘制路径
/// </summary>
private void DrawPathToMap()
{
RoutingProvider rp = MainMap.MapProvider as RoutingProvider;
if (rp == null)
{
rp = GMapProviders.GoogleMap; // use google if provider does not implement routing
}
if (markerList.Count >= 2)
{
for (int i = 0; i < markerList.Count; i+=2)
{
MapRoute route = rp.GetRoute(markerList[i].Position, markerList[i+1].Position, false, false, (int)MainMap.Zoom);
if (route != null)
{
// add route
GMapRoute r = new GMapRoute(route.Points, route.Name);
r.IsHitTestVisible = true;
objects.Routes.Add(r);
// add route start/end marks
objects.Markers.Add(markerList[i]);
objects.Markers.Add(markerList[i+1]);

MainMap.ZoomAndCenterRoute(r);

}
}
markerList.Clear();
this.startPositionItem.Enabled = true;
this.endPositionItem.Enabled = true;

}
else
{
markerList.Clear();
this.startPositionItem.Enabled = true;
this.endPositionItem.Enabled = true;
}
}

//清除路径及标注
private void clearRute_Click(object sender, EventArgs e)
{
objects.Routes.Clear();
objects.Markers.Clear();

}

//放大地图
private void buttonZoomUp_Click(object sender, EventArgs e)
{
setMainMapZoom(true);

}
//缩小地图
private void buttonZoomDown_Click(object sender, EventArgs e)
{
setMainMapZoom(false);


}
/// <summary>
/// 放大地图或者缩小地图
/// </summary>
/// <param name="smallOrBig">true放大,false缩小</param>
private void setMainMapZoom(bool smallOrBig)
{
if (smallOrBig == false)
{
if (MainMap.Zoom > MainMap.MinZoom)
{
MainMap.Zoom -= 1;
}

if (this.trackBar.Value > this.trackBar.Minimum)
{
this.trackBar.Value = this.trackBar.Value - 1;
}
}
else
{
if (MainMap.Zoom < MainMap.MaxZoom)
{
MainMap.Zoom += 1;
}
if (this.trackBar.Value < this.trackBar.Maximum)
{
this.trackBar.Value = this.trackBar.Value + 1;
}
}
}


  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值