zoukankan      html  css  js  c++  java
  • 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源文件为源码里面的,所有为英文显示。

  • 相关阅读:
    SharePoint 2010学习笔记之一:创建”最新动态”WebPart
    IE6 Png 图片透明
    C# Url 过滤特殊字符
    委托的几个实例用法
    MVC中Code First编程一些小技巧
    Javascript 学习
    NET下XML的读写操作
    C#位运算讲解与示例[转]
    DB2导入导出命令(工作中使用)
    上海长期招聘c#/c++软件工程师
  • 原文地址:https://www.cnblogs.com/hsiang/p/7440950.html
Copyright © 2011-2022 走看看