本文是利用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 ///53 /// MapInfo格式的地图文件 54 /// 55 /// 56 ///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 layer105 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 layer120 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 top140 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 //增加Layers146 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 Column152 AddColumeToDataSet(ds, columeName, -angle);153 154 var xlsLayer = GetLayerFromDataSet2(ds, Color.GreenYellow);//Set up provider155 156 map.Layers.Add(xlsLayer); //Add layer to map157 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 /// 172 /// ShapeFile173 /// 174 /// 175 ///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 layer182 VectorLayer layCountries = new VectorLayer("Countries");183 //Set the datasource to a shapefile in the App_data folder184 layCountries.DataSource = new ShapeFile("GeoData/World/countries.shp", true);185 //Set fill-style to green186 layCountries.Style.Fill = new SolidBrush(Color.FromArgb(64, Color.Green));187 //Set the polygons to have a black outline188 layCountries.Style.Outline = Pens.Black;189 layCountries.Style.EnableOutline = true;190 layCountries.SRID = 4326;191 192 //Set up a river layer193 VectorLayer layRivers = new VectorLayer("Rivers");194 //Set the datasource to a shapefile in the App_data folder195 layRivers.DataSource = new ShapeFile("GeoData/World/rivers.shp", true);196 //Define a blue 1px wide pen197 layRivers.Style.Line = new Pen(Color.Blue, 1);198 layRivers.SRID = 4326;199 200 //Set up a cities layer201 VectorLayer layCities = new VectorLayer("Cities");202 //Set the datasource to a shapefile in the App_data folder203 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 layer209 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 layer228 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 LabelStyle248 {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 LabelStyle260 {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 LabelStyle286 {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 top301 //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 //增加Layers310 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 Column316 AddColumeToDataSet(ds, columeName, -angle);317 318 var xlsLayer = GetLayerFromDataSet2(ds, Color.GreenYellow);//Set up provider319 320 map.Layers.Add(xlsLayer); //Add layer to map321 //limit the zoom to 360 degrees width322 //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 /// 336 /// 在线显示,圆点显示轨迹337 /// 338 /// 339 ///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 excel350 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 Column358 AddColumeToDataSet(ds, columeName, -angle);359 AddColumeToDataSet(ds1, columeName, -angle);360 361 var xlsLayer = GetLayerFromDataSet(ds, Color.GreenYellow);//Set up provider362 map.Layers.Add(xlsLayer); //Add layer to map363 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 /// 376 /// 在线显示,图标显示轨迹377 /// 378 /// 379 ///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 excel390 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 Column396 AddColumeToDataSet(ds, columeName, -angle);397 398 var xlsLayer = GetLayerFromDataSet2(ds, Color.GreenYellow);//Set up provider399 map.Layers.Add(xlsLayer); //Add layer to map400 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 /// 410 /// 从Excel中读取数据411 /// 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 ///428 /// 获取坐标转换对象429 /// 430 ///431 private static ICoordinateTransformation GetCoordinateTransformation()432 {433 //The SRS for this datasource is EPSG:4326, therefore we need to transfrom it to OSM projection434 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 /// 443 /// 转换地球经纬度到坐标444 /// 445 /// 446 /// 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 ///460 /// 增加列461 /// 462 /// 463 /// 464 /// 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 ///475 /// 轨迹用点表示476 /// 477 /// 478 /// 479 ///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 /// 489 /// 获取带图标的图层490 /// 491 /// 492 /// 493 ///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 = true513 },514 LabelFilter = LabelCollisionDetection.ThoroughCollisionDetection515 };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源文件为源码里面的,所有为英文显示。