using AZMap;
using AZMap.CommonTypes;
using AZMap.MapProviders;
using AZMap.Util;
using AZMap.WindowsForms;
using AZMap.WindowsForms.Markers;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
// 对象绘制图层
private AZMapOverlay _graphicLayer = new AZMapOverlay("GRAPHIC_LAYER_" + Guid.NewGuid());
// 绘制时多边形的默认填充样式
public Brush DefaultPolygonFill;
// 绘制时多边形的默认线样式
public Pen DefaultPolygonStroke;
// 绘制时矩形的默认填充样式
public Brush DefaultRectangleFill;
// 绘制时矩形的默认线样式
public Pen DefaultRectangleStroke;
// 绘制时线的默认样式
public Pen DefaultRouteStroke;
public Form1()
{
InitializeComponent();
InitMapControl();
}
private void InitMapControl()
{
// 天地图2019年开始访问服务需要设置秘钥,若要使用天地图,请至官网申请开发许可
// http://lbs.tianditu.gov.cn/authorization/authorization.html
// 申请后,请修改输出目录的ConfigUser.xml文件里的KeyTianditu字段(软件默认设置了太乐地图申请的秘钥)
// 打开天地图卫星地图
MapControl.MapProvider = AZMapProviders.TiandituHybridMap3857;
// 设置鼠标左键拖动地图
MapControl.DragButton = MouseButtons.Left;
// 设置地图可以放大做小的最小级别和最大级别
MapControl.MinZoom = MapControl.MapProvider.MinZoom;
MapControl.MaxZoom = MapControl.MapProvider.MaxZoom == null ? 24 : (int)MapControl.MapProvider.MaxZoom;
// 设置初始化的级别和位置
MapControl.Zoom = 4;
MapControl.Position = new PointLatLng(35.1019340572461, 106.34765625); //定位在中国区域
// 在地图控件中对象绘制图层
MapControl.Overlays.Add(_graphicLayer);
// 设置地图控件的默认绘制样式
// 矩形
DefaultRectangleStroke = new Pen(Color.FromArgb(200, Color.Red))
{
Width = 3,
DashStyle = DashStyle.Dash
};
DefaultRectangleFill = new SolidBrush(Color.FromArgb(20, Color.Red));
// 多边形
DefaultPolygonStroke = new Pen(Color.FromArgb(200, Color.Red))
{
Width = 3,
DashStyle = DashStyle.Dash
};
DefaultPolygonFill = new SolidBrush(Color.FromArgb(20, Color.Red));
// 路径
DefaultRouteStroke = new Pen(Color.FromArgb(200, Color.Red))
{
Width = 3,
DashStyle = DashStyle.Solid
};
MapControl.DefaultRouteStroke = DefaultRouteStroke;
MapControl.DefaultRectangleStroke = DefaultRectangleStroke;
MapControl.DefaultRectangleFill = DefaultRectangleFill;
MapControl.DefaultPolygonStroke = DefaultPolygonStroke;
MapControl.DefaultPolygonFill = DefaultPolygonFill;
// 设置控件是否开启性能显示,开启后对象绘制会变快,但如果对象节点过多时不能进行鼠标交互
MapControl.FeaturesDispPerformanceEnabled = false;
}
/// <summary>
/// 打开kml文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, System.EventArgs e)
{
try
{
using (FileDialog dlg = new OpenFileDialog())
{
dlg.CheckPathExists = true;
dlg.CheckFileExists = false;
dlg.AddExtension = true;
dlg.ValidateNames = true;
dlg.Title = "选择文件(Kml格式)";
dlg.FilterIndex = 1;
dlg.RestoreDirectory = true;
dlg.Filter = "支持格式 (*.kml)|*.kml|Kml (*.kml)|*.kml";
if (dlg.ShowDialog() == DialogResult.OK)
{
if (dlg.FileName.EndsWith(".kml") || dlg.FileName.EndsWith(".Kml") || dlg.FileName.EndsWith(".KML"))
{
// 读取kml并绘制
DrawPlaceMarks(KmlUtil.GetPlaceMarksFromKmlFile(dlg.FileName));
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
/// <summary>
/// 解析kml的读取结果
/// </summary>
/// <param name="placeMarks"></param>
private void DrawPlaceMarks(List<KmlPlaceMark> placeMarks)
{
if (placeMarks == null || placeMarks.Count <= 0)
{
MessageBox.Show("未读取到任何数据!");
return;
}
var index = 0;
foreach (var placeMark in placeMarks)
{
index++;
// 绘制对象
DrawGeometry(placeMark.Geometry, index, placeMark.Name);
}
// 绘制完成后,定位到结果的中心位置
var bounds = new Polygon();
bounds.Points.AddRange(placeMarks[0].Geometry.Points);
var env = bounds.Envelope;
MapControl.SetZoomToFitRect(RectLatLng.FromLTRB(env.Left, env.Top, env.Right, env.Bottom));
MapControl.Position = new PointLatLng(env.Center.Y, env.Center.X);
}
/// <summary>
/// 最终的对象绘制方法
/// </summary>
/// <param name="geo">要绘制的对象</param>
/// <param name="index">索引号</param>
/// <param name="name">名称</param>
/// <param name="showToolTip">是否进行鼠标提示</param>
private void DrawGeometry(Geometry geo, int index, String name, bool showToolTip = true)
{
if (geo == null || geo.Points.Count == 0) return;
if (String.IsNullOrEmpty(name))
{
// 读取属性的中的名称好给Polygon命名,如果有的话
if (geo.Properties != null && geo.Properties.Count > 0)
{
if (geo.Properties.ContainsKey("Name"))
{
name = geo.Properties["Name"];
}
else if (geo.Properties.ContainsKey("name"))
{
name = geo.Properties["name"];
}
else if (geo.Properties.ContainsKey("NAME"))
{
name = geo.Properties["NAME"];
}
}
}
switch (geo.GeoType)
{
case GeometryType.Polygon:
{
// 绘制多边形
var finalName = String.IsNullOrEmpty(name) ? "polygon_" + index : name;
geo.Name = finalName;
var finalPolygon = new AZMapPolygon(geo.ToPointLatLngs(), finalName)
{
Stroke = DefaultPolygonStroke,
Fill = DefaultPolygonFill,
IsHitTestVisible = true,
Properties = geo.Properties
};
// 绘制鼠标提示
var area = String.Format("总面积:{0}平方千米", finalPolygon.Area.ToString("0.000000"));
var tooltipText = finalName + "\r\n" + area;
var marker = new AZMapMarkerEllipse(geo.Center.ToPointLatLngs()[0])
{
ToolTipText = tooltipText,
ToolTipMode = showToolTip ? MarkerTooltipMode.OnMouseOver : MarkerTooltipMode.Never
};
finalPolygon.ToolTipMarker = marker;
finalPolygon.ToolTipPosition = MapRouteToolTipPosition.Custom; // 鼠标提示画在矩形的中心点上
_graphicLayer.Polygons.Add(finalPolygon);
}
break;
case GeometryType.Polyline:
{
// 绘制线
var finalName = String.IsNullOrEmpty(name) ? "polyline_" + index : name;
geo.Name = finalName;
var line = new AZMapRoute(geo.ToPointLatLngs(), finalName)
{
Stroke = DefaultRouteStroke,
IsHitTestVisible = true,
Properties = geo.Properties
};
// 绘制鼠标提示
var length = String.Format("总长度:{0}千米", line.Distance.ToString("0.000000"));
var tooltipText = finalName + "\r\n" + length;
var ptCount = geo.Points.Count;
var centerIndex = ptCount / 2;
var center = geo.Points[centerIndex];
var marker = new AZMapMarkerEllipse(center.ToPointLatLngs()[0])
{
ToolTipText = tooltipText,
ToolTipMode = showToolTip ? MarkerTooltipMode.OnMouseOver : MarkerTooltipMode.Never
};
line.ToolTipMarker = marker;
line.ToolTipPosition = MapRouteToolTipPosition.Custom; // 鼠标提示画在多边形的中心点上
_graphicLayer.Routes.Add(line);
}
break;
case GeometryType.Point:
{
// 绘制点
var finalName = String.IsNullOrEmpty(name) ? "point_" + index : name;
geo.Name = finalName;
// AZMapMarkerGoogleType.pink_pushpin 为地标点的样式,可以随意指定
var marker = new AZMapMarkerGoogle(geo.ToPointLatLngs()[0], AZMapMarkerGoogleType.pink_pushpin)
{
IsHitTestVisible = true,
Properties = geo.Properties,
ToolTipText = finalName,
ToolTipMode = showToolTip ? MarkerTooltipMode.OnMouseOver : MarkerTooltipMode.Never
};
_graphicLayer.Markers.Add(marker);
}
break;
}
}
}
}
|