本文是利用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 }
源码下载链接
备注:
1. 因用的MapInfo和Shape源文件为源码里面的,所有为英文显示。