读取kml文件

回到首页  往前  往后

该范例程序会演示如何读取kml文件中的点线面数据。

注意1:太乐地图.NET控件 名称统一命名为:MapControl

注意2:该范例程序会调用Kml文件读取工具类:KmlUtil,支持读取对象包括:Point、LineString、Polygon读取后的输出类型为:Placemark

(Kml文件读取工具类有试用时间限制和读取数量限制,请购买授权版控件以解除限制)

注意3:该范例程序会涉及三方程序集:SharpKml.dll,不需要引用,但必须添加至程序输出目录

范例运行后界面如下图所示:

读取kml文件

源码

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;

           }

       }

   }

}