C# SharpMap的简单使用_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > C# SharpMap的简单使用

C# SharpMap的简单使用

 2017/8/27 19:08:45  飞翔的月亮  程序员俱乐部  我要评论(0)
  • 摘要:本文是利用ShapMap实现GIS的简单应用的小例子,以供学习分享使用。关于SharpMap的说明,网上大多是以ShapeFile为例进行简单的说明,就连官网上的例子也不多。本文是自己参考了源代码进行整理的,主要是WinForm的例子。原理方面本文也不过多论述,主要是实例演示,需要的朋友还是以SharpMap源码进行深入研究。什么是SharpMap?SharpMap是一个基于.net2.0使用C#开发的Map渲染类库,可以渲染各类GIS数据(目前支持ESRIShape和PostGIS格式)
  • 标签:C# 使用 Map ARP

本文是利用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做背景图

 

核心代码

class="code_img_closed" src="/Upload/Images/2017082719/0015B68B3C38AA5B.gif" alt="">
  1 using BruTile.Predefined;
  2 using GeoAPI.Coordinatesystems.html" target="_blank">Systems.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 }
logs_code_collapse">View Code

 

源码下载链接

 

备注:

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

 

上一篇: 外卖“抢路”6小时:“用命在拼”,最怕超时被投诉 下一篇: 没有下一篇了!
发表评论
用户名: 匿名