MyException - 我的异常网
当前位置:我的异常网» C# » C# SharpMap的简略使用

C# SharpMap的简略使用

www.MyException.Cn  网友分享于:2013-10-11  浏览:0次
C# SharpMap的简单使用

本文是利用ShapMap实现GIS的简单应用的小例子,以供学习分享使用。关于SharpMap的说明,网上大多是以ShapeFile为例进行简单的说明,就连官网上的例子也不多。本文是自己参考了源代码进行整理的,主要是WinForm的例子。原理方面本文也不过多论述,主要是实例演示,需要的朋友还是以SharpMap源码进行深入研究。

什么是SharpMap ?

SharpMap是一个基于.net 2.0使用C#开发的Map渲染类库,可以渲染各类GIS数据(目前支持ESRI Shape和PostGIS格式),可应用于桌面和Web程序。代码行数近10000行,可以算是一个实现了最基本功能的GIS系统,有利于研究学习使用。

涉及知识点:

  • SharpMap的基本概念:Layer(图层,常用图层:VectorLayer,LabelLayer) , IProvider(数据提供者,常用数据源:Ogr(对应MapInfo),ShapFile,DataTablePoint(对应DataSet))
  • 坐标转换:主要用于经纬度和地图坐标的转换。

SharpMap知识结构图:

效果图如下:

(一)车辆轨迹图:数据源:Excel数据

(二)定点数据(数据源:Excel)将河南省十七个城市,全部插上小红旗

(三)使用MapInfo做背景文件(此处通过程序调整了比例尺)

(四)使用ShapFile做背景图

 

核心代码

  1 using BruTile.Predefined;
  2 using GeoAPI.CoordinateSystems.Transformations;
  3 using ProjNet.CoordinateSystems;
  4 using ProjNet.CoordinateSystems.Transformations;
  5 using SharpMap;
  6 using SharpMap.Data.Providers;
  7 using SharpMap.Layers;
  8 using SharpMap.Rendering;
  9 using SharpMap.Rendering.Thematics;
 10 using SharpMap.Styles;
 11 using System;
 12 using System.Collections.Generic;
 13 using System.Data;
 14 using System.Data.OleDb;
 15 using System.Drawing;
 16 using System.Drawing.Drawing2D;
 17 using System.Drawing.Text;
 18 using System.Linq;
 19 using System.Text;
 20 using Point = GeoAPI.Geometries.Coordinate;
 21 namespace DemoSharpMap
 22 {
 23     public class SharpMapHelper
 24     {
 25 
 26         private const string XlsConnectionString = "Provider={2};Data Source={0}\\{1};Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\"";
 27 
 28         public static Map InitializeMap(MapType tt,float angle)
 29         {
 30             Map map = null;
 31             switch (tt)
 32             {
 33                 case MapType.RunLine:
 34                     map = InitializeMapOsmWithXls(angle);
 35                     break;
 36                 case MapType.MapInfo:
 37                     map = InitializeMapinfo(angle);
 38                     break;
 39                 case MapType.ShapeFile:
 40                     map = InitializeMapOrig(angle);
 41                     break;
 42                 case MapType.Static:
 43                     map = InitializeMapOsmWithXls2(angle);
 44                     break;
 45                 default:
 46                     map = InitializeMapOsmWithXls(angle);
 47                     break;
 48             }
 49             return map;
 50         }
 51 
 52         /// <summary>
 53         /// MapInfo格式的地图文件
 54         /// </summary>
 55         /// <param name="angle"></param>
 56         /// <returns></returns>
 57         private static Map InitializeMapinfo(float angle)
 58         {
 59             //Initialize a new map of size 'imagesize'
 60             Map map = new Map();
 61 
 62             //Set up the countries layer
 63             VectorLayer layCountries = new VectorLayer("Countries");
 64             //Set the datasource to a shapefile in the App_data folder
 65             try
 66             {
 67                 layCountries.DataSource = new Ogr("GeoData/MapInfo/countriesMapInfo.tab");
 68             }
 69             catch (TypeInitializationException ex)
 70             {
 71                 if (ex.Message == "The type initializer for 'OSGeo.OGR.Ogr' threw an exception.")
 72                 {
 73                     throw new Exception(
 74                         String.Format(
 75                             "The application threw a PINVOKE exception. You probably need to copy the unmanaged dll's to your bin directory. They are a part of fwtools {0}. You can download it from: http://home.gdal.org/fwtools/",
 76                             GdalRasterLayer.FWToolsVersion));
 77                 }
 78                 throw;
 79             }
 80 
 81             //Set fill-style to green
 82             layCountries.Style.Fill = new SolidBrush(Color.Green);
 83             //Set the polygons to have a black outline
 84             layCountries.Style.Outline = Pens.Black;
 85             layCountries.Style.EnableOutline = true;
 86             layCountries.SRID = 4326;
 87 
 88             //Set up a river layer
 89             VectorLayer layRivers = new VectorLayer("Rivers");
 90             //Set the datasource to a shapefile in the App_data folder
 91             layRivers.DataSource = new Ogr("GeoData/MapInfo/riversMapInfo.tab");
 92             //Define a blue 1px wide pen
 93             layRivers.Style.Line = new Pen(Color.Blue, 1);
 94             layRivers.SRID = 4326;
 95 
 96             //Set up a river layer
 97             VectorLayer layCities = new VectorLayer("Cities");
 98             //Set the datasource to a shapefile in the App_data folder
 99             layCities.DataSource = new Ogr("GeoData/MapInfo/citiesMapInfo.tab");
100             layCities.Style.SymbolScale = 0.8f;
101             layCities.MaxVisible = 40;
102             layCities.SRID = 4326;
103 
104             //Set up a country label layer
105             LabelLayer layLabel = new LabelLayer("Country labels");
106             layLabel.DataSource = layCountries.DataSource;
107             layLabel.Enabled = true;
108             layLabel.LabelColumn = "Name";
109             layLabel.Style = new LabelStyle();
110             layLabel.Style.ForeColor = Color.White;
111             layLabel.Style.Font = new Font(FontFamily.GenericSerif, 12);
112             layLabel.Style.BackColor = new SolidBrush(Color.FromArgb(128, 255, 0, 0));
113             layLabel.MaxVisible = 90;
114             layLabel.MinVisible = 30;
115             layLabel.Style.HorizontalAlignment = LabelStyle.HorizontalAlignmentEnum.Center;
116             layLabel.SRID = 4326;
117             layLabel.MultipartGeometryBehaviour = LabelLayer.MultipartGeometryBehaviourEnum.Largest;
118 
119             //Set up a city label layer
120             LabelLayer layCityLabel = new LabelLayer("City labels");
121             layCityLabel.DataSource = layCities.DataSource;
122             layCityLabel.Enabled = true;
123             layCityLabel.LabelColumn = "Name";
124             layCityLabel.Style = new LabelStyle();
125             layCityLabel.Style.ForeColor = Color.Black;
126             layCityLabel.Style.Font = new Font(FontFamily.GenericSerif, 11);
127             layCityLabel.MaxVisible = layLabel.MinVisible;
128             layCityLabel.Style.HorizontalAlignment = LabelStyle.HorizontalAlignmentEnum.Left;
129             layCityLabel.Style.VerticalAlignment = LabelStyle.VerticalAlignmentEnum.Bottom;
130             layCityLabel.Style.Offset = new PointF(3, 3);
131             layCityLabel.Style.Halo = new Pen(Color.Yellow, 2);
132             layCityLabel.TextRenderingHint = TextRenderingHint.AntiAlias;
133             layCityLabel.SmoothingMode = SmoothingMode.AntiAlias;
134             layCityLabel.SRID = 4326;
135             layCityLabel.LabelFilter = LabelCollisionDetection.ThoroughCollisionDetection;
136             layCityLabel.Style.CollisionDetection = true;
137 
138             //Add the layers to the map object.
139             //The order we add them in are the order they are drawn, so we add the rivers last to put them on top
140             map.Layers.Add(layCountries);
141             map.Layers.Add(layRivers);
142             map.Layers.Add(layCities);
143             map.Layers.Add(layLabel);
144             map.Layers.Add(layCityLabel);
145             //增加Layers
146             var xlsPath = string.Format(XlsConnectionString, System.IO.Directory.GetCurrentDirectory(), "GeoData\\Henan.xls", Properties.Settings.Default.OleDbProvider);
147             var ds = GetDataFromExcel(xlsPath, "Cities");
148             //var ct = GetCoordinateTransformation();
149             //TransCoordinate(ds, ct);
150             string columeName = "Rotation";
151             //Add Rotation Column
152             AddColumeToDataSet(ds, columeName, -angle);
153 
154             var xlsLayer = GetLayerFromDataSet2(ds, Color.GreenYellow);//Set up provider
155            
156             map.Layers.Add(xlsLayer); //Add layer to map
157             map.Center = xlsLayer.Envelope.Centre;// new Point(0, 0);
158             map.MapScale = 350;
159             //map.Center = new Point(0, 0);
160 
161             //_ogrSampleDataset = "MapInfo";
162 
163             //Matrix mat = new Matrix();
164             //mat.RotateAt(angle, map.WorldToImage(map.Center));
165             //map.MapTransform = mat;
166 
167             //map.ZoomToBox(xlsLayer.Envelope);
168             return map;
169         }
170 
171         /// <summary>
172         /// ShapeFile
173         /// </summary>
174         /// <param name="angle"></param>
175         /// <returns></returns>
176         private static Map InitializeMapOrig(float angle)
177         {
178             //Initialize a new map of size 'imagesize'
179             Map map = new Map();
180 
181             //Set up the countries layer
182             VectorLayer layCountries = new VectorLayer("Countries");
183             //Set the datasource to a shapefile in the App_data folder
184             layCountries.DataSource = new ShapeFile("GeoData/World/countries.shp", true);
185             //Set fill-style to green
186             layCountries.Style.Fill = new SolidBrush(Color.FromArgb(64, Color.Green));
187             //Set the polygons to have a black outline
188             layCountries.Style.Outline = Pens.Black;
189             layCountries.Style.EnableOutline = true;
190             layCountries.SRID = 4326;
191 
192             //Set up a river layer
193             VectorLayer layRivers = new VectorLayer("Rivers");
194             //Set the datasource to a shapefile in the App_data folder
195             layRivers.DataSource = new ShapeFile("GeoData/World/rivers.shp", true);
196             //Define a blue 1px wide pen
197             layRivers.Style.Line = new Pen(Color.Blue, 1);
198             layRivers.SRID = 4326;
199 
200             //Set up a cities layer
201             VectorLayer layCities = new VectorLayer("Cities");
202             //Set the datasource to a shapefile in the App_data folder
203             layCities.DataSource = new ShapeFile("GeoData/World/cities.shp", true);
204             layCities.Style.SymbolScale = 0.8f;
205             layCities.MaxVisible = 40;
206             layCities.SRID = 4326;
207 
208             //Set up a country label layer
209             LabelLayer layLabel = new LabelLayer("Country labels");
210             layLabel.DataSource = layCountries.DataSource;
211             layLabel.Enabled = true;
212             layLabel.LabelColumn = "Name";
213             layLabel.Style = new LabelStyle();
214             layLabel.Style.ForeColor = Color.White;
215             layLabel.Style.Font = new Font(FontFamily.GenericSerif, 12);
216             layLabel.Style.BackColor = new SolidBrush(Color.FromArgb(128, 255, 0, 0));
217             layLabel.MaxVisible = 90;
218             layLabel.MinVisible = 30;
219             layLabel.Style.HorizontalAlignment = LabelStyle.HorizontalAlignmentEnum.Center;
220             layLabel.SRID = 4326;
221             layLabel.MultipartGeometryBehaviour = LabelLayer.MultipartGeometryBehaviourEnum.Largest;
222             layLabel.LabelFilter = LabelCollisionDetection.ThoroughCollisionDetection;
223             layLabel.Style.CollisionDetection = true;
224             layLabel.LabelPositionDelegate = fdr => fdr.Geometry.InteriorPoint.Coordinate;
225             layLabel.PriorityColumn = "POPDENS";
226 
227             //Set up a city label layer
228             LabelLayer layCityLabel = new LabelLayer("City labels");
229             layCityLabel.DataSource = layCities.DataSource;
230             layCityLabel.Enabled = true;
231             layCityLabel.LabelColumn = "Name";
232             layCityLabel.Style = new LabelStyle();
233             layCityLabel.Style.ForeColor = Color.Black;
234             layCityLabel.Style.Font = new Font(FontFamily.GenericSerif, 11);
235             layCityLabel.MaxVisible = layLabel.MinVisible;
236             layCityLabel.Style.HorizontalAlignment = LabelStyle.HorizontalAlignmentEnum.Left;
237             layCityLabel.Style.VerticalAlignment = LabelStyle.VerticalAlignmentEnum.Bottom;
238             layCityLabel.Style.Offset = new PointF(3, 3);
239             layCityLabel.Style.Halo = new Pen(Color.Yellow, 2);
240             layCityLabel.TextRenderingHint = TextRenderingHint.AntiAlias;
241             layCityLabel.SmoothingMode = SmoothingMode.AntiAlias;
242             layCityLabel.SRID = 4326;
243             layCityLabel.LabelFilter = LabelCollisionDetection.ThoroughCollisionDetection;
244             layCityLabel.Style.CollisionDetection = true;
245             layCityLabel.PriorityColumn = "POPULATION";
246             layCityLabel.Theme = new GradientTheme(layCityLabel.PriorityColumn, 250000, 5000000,
247                 new LabelStyle
248                 {
249                     MaxVisible = 10,
250                     CollisionBuffer = new Size(0, 0),
251                     CollisionDetection = true,
252                     Enabled = true,
253                     ForeColor = Color.LightSlateGray,
254                     Halo = new Pen(Color.Silver, 1),
255                     HorizontalAlignment = LabelStyle.HorizontalAlignmentEnum.Center,
256                     VerticalAlignment = LabelStyle.VerticalAlignmentEnum.Middle,
257                     Font = new Font(GenericFontFamilies.SansSerif.ToString(), 8f, FontStyle.Regular)
258                 },
259                 new LabelStyle
260                 {
261                     MaxVisible = layLabel.MinVisible,
262                     CollisionBuffer = new Size(3, 3),
263                     CollisionDetection = true,
264                     Enabled = true,
265                     ForeColor = Color.LightSlateGray,
266                     Halo = new Pen(Color.Silver, 5),
267                     HorizontalAlignment = LabelStyle.HorizontalAlignmentEnum.Center,
268                     VerticalAlignment = LabelStyle.VerticalAlignmentEnum.Middle,
269                     Font = new Font(GenericFontFamilies.SansSerif.ToString(), 16f, FontStyle.Bold)
270                 });
271 
272             bool ignoreLength = false;
273 
274             var layRiverLabel = new LabelLayer("River labels")
275             {
276                 DataSource = layRivers.DataSource,
277                 Enabled = true,
278                 LabelColumn = "Name",
279                 TextRenderingHint = TextRenderingHint.AntiAlias,
280                 SmoothingMode = SmoothingMode.AntiAlias,
281                 SRID = 4326,
282                 LabelFilter = LabelCollisionDetection.ThoroughCollisionDetection,
283                 MultipartGeometryBehaviour = LabelLayer.MultipartGeometryBehaviourEnum.CommonCenter,
284                 Style =
285                                            new LabelStyle
286                                            {
287                                                ForeColor = Color.DarkBlue,
288                                                Font = new Font(FontFamily.GenericSansSerif, 11),
289                                                HorizontalAlignment = LabelStyle.HorizontalAlignmentEnum.Center,
290                                                VerticalAlignment = LabelStyle.VerticalAlignmentEnum.Middle,
291                                                //CollisionDetection = true,
292                                                Halo = new Pen(Color.Azure, 2),
293                                                IgnoreLength = ignoreLength,
294                                                Offset = new PointF(0, -10)
295 
296                                            },
297             };
298 
299             //Add the layers to the map object.
300             //The order we add them in are the order they are drawn, so we add the rivers last to put them on top
301             //map.BackgroundLayer.Add(AsyncLayerProxyLayer.Create(layCountries));
302             map.Layers.Add(layCountries);
303             map.Layers.Add(layRivers);
304             map.Layers.Add(layCities);
305             map.Layers.Add(layLabel);
306             map.Layers.Add(layCityLabel);
307             map.Layers.Add(layRiverLabel);
308 
309             //增加Layers
310             var xlsPath = string.Format(XlsConnectionString, System.IO.Directory.GetCurrentDirectory(), "GeoData\\Henan.xls", Properties.Settings.Default.OleDbProvider);
311             var ds = GetDataFromExcel(xlsPath, "Cities");
312             //var ct = GetCoordinateTransformation();
313             //TransCoordinate(ds, ct);
314             string columeName = "Rotation";
315             //Add Rotation Column
316             AddColumeToDataSet(ds, columeName, -angle);
317 
318             var xlsLayer = GetLayerFromDataSet2(ds, Color.GreenYellow);//Set up provider
319 
320             map.Layers.Add(xlsLayer); //Add layer to map
321                                       //limit the zoom to 360 degrees width
322                                       //map.MaximumZoom = 360;
323                                       //map.BackColor = Color.LightBlue;
324 
325             //map.Zoom = 360;
326             map.Center = xlsLayer.Envelope.Centre;// new Point(0, 0);
327             map.MapScale = 350;
328             //Matrix mat = new Matrix();
329             //mat.RotateAt(angle, map.WorldToImage(map.Center));
330             //map.MapTransform = mat;
331             //map.ZoomToBox(xlsLayer.Envelope);
332             return map;
333         }
334 
335         /// <summary>
336         /// 在线显示,圆点显示轨迹
337         /// </summary>
338         /// <param name="angle"></param>
339         /// <returns></returns>
340         private static Map InitializeMapOsmWithXls(float angle)
341         {
342             var map = new Map();
343 
344             var tileLayer = new TileAsyncLayer(
345                 KnownTileSources.Create(KnownTileSource.OpenStreetMap), "TileLayer - OSM with XLS");
346             tileLayer.SRID = 4326;
347             map.BackgroundLayer.Add(tileLayer);
348 
349             //Get data from excel
350             var xlsPath = string.Format(XlsConnectionString, System.IO.Directory.GetCurrentDirectory(), "GeoData\\Cities.xls", Properties.Settings.Default.OleDbProvider);
351             var ds = GetDataFromExcel(xlsPath, "Cities");
352             var ds1 = GetDataFromExcel(xlsPath, "Cities2");
353             var ct = GetCoordinateTransformation();
354             TransCoordinate(ds, ct);
355             TransCoordinate(ds1, ct);
356             string columeName = "Rotation";
357             //Add Rotation Column
358             AddColumeToDataSet(ds, columeName, -angle);
359             AddColumeToDataSet(ds1, columeName, -angle);
360 
361             var xlsLayer = GetLayerFromDataSet(ds, Color.GreenYellow);//Set up provider
362             map.Layers.Add(xlsLayer); //Add layer to map
363 
364             var xlsLayer1 = GetLayerFromDataSet(ds1, Color.Red);
365             map.Layers.Add(xlsLayer1);
366 
367             var xlsLabelLayer = GetLabelLayerByVectorLayer(xlsLayer, "XLSLabel");
368 
369             xlsLabelLayer.Theme = new SharpMap.Rendering.Thematics.FontSizeTheme(xlsLabelLayer, map) { FontSizeScale = 1000f };
370             map.Layers.Add(xlsLabelLayer);
371             map.ZoomToBox(xlsLayer.Envelope.ExpandedBy(xlsLayer1.Envelope));
372             return map;
373         }
374 
375         /// <summary>
376         /// 在线显示,图标显示轨迹
377         /// </summary>
378         /// <param name="angle"></param>
379         /// <returns></returns>
380         private static Map InitializeMapOsmWithXls2(float angle)
381         {
382             var map = new Map();
383 
384             var tileLayer = new TileAsyncLayer(
385                 KnownTileSources.Create(KnownTileSource.OpenStreetMap), "TileLayer - OSM with XLS");
386             tileLayer.SRID = 4326;
387             map.BackgroundLayer.Add(tileLayer);
388 
389             //Get data from excel
390             var xlsPath = string.Format(XlsConnectionString, System.IO.Directory.GetCurrentDirectory(), "GeoData\\Henan.xls", Properties.Settings.Default.OleDbProvider);
391             var ds = GetDataFromExcel(xlsPath, "Cities");
392             var ct = GetCoordinateTransformation();
393             TransCoordinate(ds, ct);
394             string columeName = "Rotation";
395             //Add Rotation Column
396             AddColumeToDataSet(ds, columeName, -angle);
397 
398             var xlsLayer = GetLayerFromDataSet2(ds, Color.GreenYellow);//Set up provider
399             map.Layers.Add(xlsLayer); //Add layer to map
400 
401             var xlsLabelLayer = GetLabelLayerByVectorLayer(xlsLayer, "XLSLabel");
402 
403             xlsLabelLayer.Theme = new FontSizeTheme(xlsLabelLayer, map) { FontSizeScale = 1000f };
404             map.Layers.Add(xlsLabelLayer);
405             map.ZoomToBox(xlsLayer.Envelope);
406             return map;
407         }
408 
409         /// <summary>
410         /// 从Excel中读取数据
411         /// </summary>
412         private static DataSet GetDataFromExcel(string xlsPath, string sheetName)
413         {
414             DataSet ds = new DataSet("XLS");
415             string sql = string.Format("SELECT * FROM [{0}$];", sheetName);
416             using (var cn = new OleDbConnection(xlsPath))
417             {
418                 cn.Open();
419                 using (var da = new OleDbDataAdapter(new OleDbCommand(sql, cn)))
420                 {
421                     da.Fill(ds);
422                 }
423             }
424             return ds;
425         }
426 
427         /// <summary>
428         /// 获取坐标转换对象
429         /// </summary>
430         /// <returns></returns>
431         private static ICoordinateTransformation GetCoordinateTransformation()
432         {
433             //The SRS for this datasource is EPSG:4326, therefore we need to transfrom it to OSM projection
434             var ctf = new CoordinateTransformationFactory();
435             var cf = new CoordinateSystemFactory();
436             var epsg4326 = cf.CreateFromWkt("GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.01745329251994328,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]]");
437             var epsg3857 = cf.CreateFromWkt("PROJCS[\"Popular Visualisation CRS / Mercator\", GEOGCS[\"Popular Visualisation CRS\", DATUM[\"Popular Visualisation Datum\", SPHEROID[\"Popular Visualisation Sphere\", 6378137, 0, AUTHORITY[\"EPSG\",\"7059\"]], TOWGS84[0, 0, 0, 0, 0, 0, 0], AUTHORITY[\"EPSG\",\"6055\"]],PRIMEM[\"Greenwich\", 0, AUTHORITY[\"EPSG\", \"8901\"]], UNIT[\"degree\", 0.0174532925199433, AUTHORITY[\"EPSG\", \"9102\"]], AXIS[\"E\", EAST], AXIS[\"N\", NORTH], AUTHORITY[\"EPSG\",\"4055\"]], PROJECTION[\"Mercator\"], PARAMETER[\"False_Easting\", 0], PARAMETER[\"False_Northing\", 0], PARAMETER[\"Central_Meridian\", 0], PARAMETER[\"Latitude_of_origin\", 0], UNIT[\"metre\", 1, AUTHORITY[\"EPSG\", \"9001\"]], AXIS[\"East\", EAST], AXIS[\"North\", NORTH], AUTHORITY[\"EPSG\",\"3857\"]]");
438             var ct = ctf.CreateFromCoordinateSystems(epsg4326, epsg3857);
439             return ct;
440         }
441 
442         /// <summary>
443         /// 转换地球经纬度到坐标
444         /// </summary>
445         /// <param name="ds"></param>
446         /// <param name="ct"></param>
447         private static void TransCoordinate(DataSet ds, ICoordinateTransformation ct)
448         {
449             foreach (System.Data.DataRow row in ds.Tables[0].Rows)
450             {
451                 if (row["X"] == DBNull.Value || row["Y"] == DBNull.Value) continue;
452                 var coords = new[] { Convert.ToDouble(row["X"]), Convert.ToDouble(row["Y"]) };
453                 coords = ct.MathTransform.Transform(coords);
454                 row["X"] = coords[0];
455                 row["Y"] = coords[1];
456             }
457         }
458 
459         /// <summary>
460         /// 增加列
461         /// </summary>
462         /// <param name="ds"></param>
463         /// <param name="columeName"></param>
464         /// <param name="columeValue"></param>
465         private static void AddColumeToDataSet(DataSet ds, string columeName, float columeValue)
466         {
467             ds.Tables[0].Columns.Add(columeName, typeof(float));
468             foreach (System.Data.DataRow row in ds.Tables[0].Rows)
469             {
470                 row["Rotation"] = -columeValue;
471             }
472         }
473 
474         /// <summary>
475         /// 轨迹用点表示
476         /// </summary>
477         /// <param name="ds"></param>
478         /// <param name="c"></param>
479         /// <returns></returns>
480         private static VectorLayer GetLayerFromDataSet(DataSet ds, Color c)
481         {
482             var xlsProvider = new DataTablePoint(ds.Tables[0], "OID", "X", "Y");
483             var xlsLayer = new VectorLayer("XLS", xlsProvider)
484             { Style = new VectorStyle() { PointColor = new SolidBrush(c) } };
485             return xlsLayer;
486         }
487 
488         /// <summary>
489         /// 获取带图标的图层
490         /// </summary>
491         /// <param name="ds"></param>
492         /// <param name="c"></param>
493         /// <returns></returns>
494         private static VectorLayer GetLayerFromDataSet2(DataSet ds, Color c)
495         {
496             var xlsProvider = new DataTablePoint(ds.Tables[0], "OID", "X", "Y");
497             var xlsLayer = new VectorLayer("XLS", xlsProvider)
498             { Style = { Symbol=Properties.Resources.redflag} };
499             return xlsLayer;
500         }
501 
502         private static LabelLayer GetLabelLayerByVectorLayer(VectorLayer xlsLayer, string layerName)
503         {
504             var xlsLabelLayer = new LabelLayer(layerName)
505             {
506                 DataSource = xlsLayer.DataSource,
507                 LabelColumn = "NAME",
508                 //PriorityColumn = "Population",
509                 Style =
510                     {
511                         CollisionBuffer = new System.Drawing.SizeF(2f, 2f),
512                         CollisionDetection = true
513                     },
514                 LabelFilter = LabelCollisionDetection.ThoroughCollisionDetection
515             };
516             return xlsLabelLayer;
517         }
518     }
519 
520     public enum MapType {
521         ShapeFile = 0,
522         MapInfo = 1,
523         RunLine = 2,//运行轨迹
524         Static = 3 //定点数据
525 
526     }
527 }
View Code

 

源码下载链接

 

备注:

1. 因用的MapInfo和Shape源文件为源码里面的,所有为英文显示。

 

2楼杨恒连
不知道实际项目中用在那些场景
1楼沈赟
谢谢分享

文章评论

不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
中美印日四国程序员比较
中美印日四国程序员比较
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
程序员必看的十大电影
程序员必看的十大电影
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
程序员应该关注的一些事儿
程序员应该关注的一些事儿
10个调试和排错的小建议
10个调试和排错的小建议
鲜为人知的编程真相
鲜为人知的编程真相
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
我的丈夫是个程序员
我的丈夫是个程序员
如何成为一名黑客
如何成为一名黑客
编程语言是女人
编程语言是女人
代码女神横空出世
代码女神横空出世
Java程序员必看电影
Java程序员必看电影
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
漫画:程序员的工作
漫画:程序员的工作
程序员的鄙视链
程序员的鄙视链
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
那些争议最大的编程观点
那些争议最大的编程观点
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
总结2014中国互联网十大段子
总结2014中国互联网十大段子
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
我是如何打败拖延症的
我是如何打败拖延症的
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
旅行,写作,编程
旅行,写作,编程
为什么程序员都是夜猫子
为什么程序员都是夜猫子
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
程序员和编码员之间的区别
程序员和编码员之间的区别
程序员都该阅读的书
程序员都该阅读的书
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
一个程序员的时间管理
一个程序员的时间管理
每天工作4小时的程序员
每天工作4小时的程序员
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有