图片首先格式是可缩放的如PNG格式,缩放的时候,做简单的缩放方式,在mapControl_OnMapZoomChanged当中不断的改变图片的尺寸大小就可以了。
因为ImageMarker得OnRender函数是这样写的:
1 | public override void OnRender(Graphics g) |
6 | g.DrawImage(image, LocalPosition.X, LocalPosition.Y, Size.Width, Size.Height); |
每次缩放的时候,ImageMarker总会重写这个函数,输出图片,所以如果改变Size大小,图片也被限制在Size当中。
尺寸大小如何根据zoom改变,取决于你,如果图片的四个角的坐标是固定的,那就简单了,当zoom变化时,重新计算一下,左上角和右下角之间的Rect的大小就可以了。

1 | var tl = mapControl.FromLatLngToLocal(gtl); |
3 | var br = mapControl.FromLatLngToLocal(gbr); |
5 | imgMarker.Size = new System.Drawing.Size(( int )(br.X - tl.X), ( int )(br.Y - tl.Y)); |
完整的代码如下:
ImageMarker.cs
01 | public class GMapImage : GMapMarker |
15 | this .Size = new Size(image.Width, image.Height); |
20 | public GMapImage(GMap.NET.PointLatLng p) |
23 | DisableRegionCheck = true ; |
24 | IsHitTestVisible = false ; |
27 | public override void OnRender(Graphics g) |
32 | g.DrawImage(image, LocalPosition.X, LocalPosition.Y, Size.Width, Size.Height); |
在主窗体中,编写缩放控制
01 | public partial class MainForm : Form |
04 | readonly PointLatLng gtl = new PointLatLng(50.4066263673011, -127.620375523875); |
05 | readonly PointLatLng gbr = new PointLatLng(21.652538062803, -66.517937876818); |
07 | readonly GMapOverlay mainOverlay; |
08 | readonly GMapImage imageMarker; |
12 | InitializeComponent(); |
18 | System.Net.IPHostEntry e = System.Net.Dns.GetHostEntry( "www.bing.com" ); |
22 | mapControl.Manager.Mode = AccessMode.CacheOnly; |
23 | MessageBox.Show( "No internet connection avaible, going to CacheOnly mode." , "GMap.NET - imageMarkerDemo" , MessageBoxButtons.OK, MessageBoxIcon.Warning); |
26 | mapControl.MapProvider = GMapProviders.BingSatelliteMap; |
28 | mapControl.OnMapZoomChanged += new MapZoomChanged(mapControl_OnMapZoomChanged); |
30 | mainOverlay = new GMapOverlay( "top" ); |
31 | mapControl.Overlays.Add(mainOverlay); |
33 | imageMarker = new GMapImage(gtl); |
34 | imageMarker.Image = Properties.Resources.USOverlay; |
35 | mainOverlay.Markers.Add(imageMarker); |
39 | void mapControl_OnMapZoomChanged() |
41 | if (imageMarker != null ) |
43 | var tl = mapControl.FromLatLngToLocal(gtl); |
44 | var br = mapControl.FromLatLngToLocal(gbr); |
46 | imageMarker.Position = gtl; |
47 | imageMarker.Size = new System.Drawing.Size(( int )(br.X - tl.X), ( int )(br.Y - tl.Y)); |
51 | protected override void OnShown(EventArgs e) |
55 | mapControl.SetZoomToFitRect(RectLatLng.FromLTRB(gtl.Lng, gtl.Lat, gbr.Lng, gbr.Lat)); |
(22386)
标签: GMap.NET, 谷歌地图
有一种找到组织的感觉,楼主还有没有讲解,没有参考一个人走的真的好累
你有什么问题?
没什么大问题,就是一个人做比较恶心而已,网上资料也少
我现在也是在自己做,想实现类似“画图”的功能,并且能把方框里的图标的信息显示出来。这个估计得自己写了。没有封装好的控件可以用哈~
我也是一种找到组织的感觉~终于有个中文网站~大家可以在这里讨论了~~我的问题大神们可否给点提示??
不太理解你的画图功能指的是什么? 能否详细说明一下。
界面的左侧有画图的工具,选择“矩形”时,可以在地图上画出矩形,同时矩形内的标志显示出一些信息。
多谢多谢~~
// 图元的左上和右下边界
04
readonly
PointLatLng gtl =
new
PointLatLng(50.4066263673011, -127.620375523875);
//左上坐标
05
readonly
PointLatLng gbr =
new
PointLatLng(21.652538062803, -66.517937876818);
//右下
06
这两个坐标是怎么知道的?从地图上获取?还是先计算好图元的坐标?
当然是你从GPS,或者从数据库中获取到的坐标了。