通过第一篇,我们已经成功的加载了高德地图:https://www.cnblogs.com/zhouxiao123/p/18469933
现在,我们来往地图上加点东西。
Gmap.Net中,提供了标注类GmapMarker,通过创建标注,在将其添加到地图上,可以实现在地图上标点的功能。
准备一张地图标注图,推荐去阿里矢量图库选取,有不少免费的可用。
这里我用的图如下:
现在我们新建一个标注
GMapMarker marker = new GMapMarker(new PointLatLng(lat,lng));
设置一下标注的属性,比如tag
marker.Tag = "Point";
和shape
这里我们新建一个方法用来调整标注图片
点击查看代码
public static Image CreatePinImage(GMapMarker marker)
{
Image img = new Image();
img.Tag = marker;
img.Width = 32;
img.Height = 32;
if (_pinSrcImage == null)
{
//多个标注共用一个图像源,节省内存。
_pinSrcImage = new BitmapImage(new Uri("pack://application:,,,/Images/Marker2.png"));
_pinSrcImage.Freeze();
}
img.Source = _pinSrcImage;
//鼠标热点位置
marker.Offset = new Point(-img.Width / 2, -img.Height/10*9);
return img;
}
线
Gmap.Net提供的GMapRoute类来实现地图上画线的功能
GMapRoute route = new GMapRoute(LineOrPolygon);
LineOrPolygon是一个经纬度坐标的List,同样,可以用过修改GMapRoute的Shape属性来修改线条的样式
添加到地图上
mapControl.Markers.Add(marker);
多边形
Gmap.Net提供的GMapPolygon类来实现地图上画多边形的功能
GMapPolygon mapPolygon = new GMapPolygon(LineOrPolygon);
一样的添加到地图上即可
矩形
Gmap.Net没有提供现成的矩形类,但是矩形其实就是特殊的多边形,所以我们可以直接使用GMapPolygon来实现,当然,最好封装一下。
点击查看代码
public class GMapMarkerRectangle : GMapPolygon
{
public PointLatLng StartLatLng;
public PointLatLng EndLatLng;
public GMapMarkerRectangle(PointLatLng StartLatLng, PointLatLng EndLatLng) : base(GetRectanglePoints(StartLatLng, EndLatLng))
{
Tag = "Rectangle";
}
private static List<PointLatLng> GetRectanglePoints(PointLatLng StartLatLng, PointLatLng EndLatLng)
{
List<PointLatLng> points = new List<PointLatLng>();
// 确定左上角点和右下角点
PointLatLng topLeft = new PointLatLng(Math.Min(StartLatLng.Lat, EndLatLng.Lat), Math.Min(StartLatLng.Lng, EndLatLng.Lng));
PointLatLng bottomRight = new PointLatLng(Math.Max(StartLatLng.Lat, EndLatLng.Lat), Math.Max(StartLatLng.Lng, EndLatLng.Lng));
points.Add(StartLatLng);
points.Add(topLeft);
points.Add(EndLatLng);
points.Add(bottomRight);
return points;
}
}
点击查看代码
public class GmapCirclePolygon : GMapPolygon
{
private const int PointsCount = 100; // 圆周上点的数量
public System.Windows.Media.Color StrokeColor { get; set; }
public float StrokeWidth { get; set; }
public GmapCirclePolygon(PointLatLng center, PointLatLng edgePoint, System.Windows.Media.Color strokeColor, float strokeWidth)
: base(CreateCirclePoints(center, edgePoint))
{
StrokeColor = strokeColor;
StrokeWidth = strokeWidth;
Tag = "Circle";
Initialize();
}
private void Initialize()
{
// 设置线条颜色和宽度
this.StrokeColor = StrokeColor;
this.StrokeWidth = StrokeWidth;
}
private static List<PointLatLng> CreateCirclePoints(PointLatLng center, PointLatLng edgePoint)
{
// 计算圆的半径(单位:米)
double radius = CalculateDistance(center, edgePoint);
List<PointLatLng> points = new List<PointLatLng>();
for (int i = 0; i < PointsCount; i++)
{
double angle = 2 * Math.PI * i / PointsCount;
double latitude = center.Lat + (radius / 111320) * Math.Cos(angle);
double longitude = center.Lng + (radius / (111320 * Math.Cos(center.Lat * Math.PI / 180))) * Math.Sin(angle);
points.Add(new PointLatLng(latitude, longitude));
}
return points;
}
private static double CalculateDistance(PointLatLng point1, PointLatLng point2)
{
// 使用 Haversine 公式计算两点之间的距离(单位:米)
var R = 6371000; // 地球半径(米)
var lat1 = point1.Lat * Math.PI / 180;
var lat2 = point2.Lat * Math.PI / 180;
var deltaLat = (point2.Lat - point1.Lat) * Math.PI / 180;
var deltaLon = (point2.Lng - point1.Lng) * Math.PI / 180;
var a = Math.Sin(deltaLat / 2) * Math.Sin(deltaLat / 2) +
Math.Cos(lat1) * Math.Cos(lat2) *
Math.Sin(deltaLon / 2) * Math.Sin(deltaLon / 2);
var c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));
return R * c; // 返回距离(米)
}
}