JackieTang

新旧图号(图幅号)转换/计算/检查,经纬度转换计算,C#代码

图号(图幅号):地图图号是指为便于使用和管理,按照一定方法将各分幅地图进行的编号。

经常用到图号,但是在网上一直没有找到一个完整的图号转换程序,因此自己写了一个图号处理的库,分享出来。如有错误请指正。

新图号标准:GB/T 13989-2012.国家基本比例尺地形图分幅和编号

旧图号标准:无。历史遗留问题。从最初的苏联坐标系开始,旧图号分别采用了俄文编号/中文编号/数字编号/英文编号等等各个版本,使用起来很不方便。此次将旧图号统一了一下,全部采用“-”分割,百万图号标准同步新图号标准,子比例尺分幅时,共有4幅的用大写ABCD表示,如50万比例尺:H-45-A。大于4幅时使用数字,不足位补零,如10万比例尺:H-45-001。特殊情况,2.5万比例尺,最后一位用1234,倒数第二位用大写ABCD,如:H45-090-C-2。

编程语言:C#。库类包含的方法:新/旧图号互转,新/旧图号检查,新/旧图号非标准格式转标准格式,新/旧图号转图幅东南西北坐标,坐标点所在图幅 等。鉴于篇幅,完整代码可以到我的GitHub上下载。地址:https://github.com/tanghaojie/Mapnumber

 

   1 using System;
   2 using System. Linq;
   3 
   4 namespace Mapnumber {
   5 
   6     /// <summary>
   7     /// Mapnumber = Sheet designation
   8     /// 图幅号,图幅编号
   9     /// 
  10     /// C#
  11     /// 
  12     /// By JackieTang
  13     ///     2016
  14     ///     
  15     /// Reference & Standard:  New mapnumber standard   GB/T 13989-2012.国家基本比例尺地形图分幅和编号 -China  
  16     ///                        Old mapnumber standard   Not found. Same as national geomatics center of China
  17     /// 
  18     /// </summary>
  19     public class Mapnumber {
  20 
  21         #region Defins about mapnumber      图号定义
  22 
  23         #region 1 million mapnumber defines,same in newmapnumber and oldmapnumber   百万图号定义,新旧图号相同
  24 
  25         /// <summary>
  26         /// 1 million standard row nums
  27         /// 100万标准行号
  28         /// </summary>
  29         public static readonly string[] _100W_RowNum = { "A" , "B" , "C" , "D" , "E" , "F" , "G" , "H" , "I" , "J" , "K" , "L" , "M" , "N" , "O" , "P" , "Q" , "R" , "S" , "T" , "U" , "V" };
  30         /// <summary>
  31         /// 1 million standard column nums
  32         /// 100万标准列号
  33         /// </summary>
  34         public static readonly string[] _100W_ColumnNum = { "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20"
  35                                                      , "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40"
  36                                                      , "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "60"};
  37 
  38         /// <summary>
  39         /// Check 1 million mapnumber row num is valid
  40         /// 检查100万图号行号是否有效
  41         /// </summary>
  42         /// <returns>true:valid;false:invalid</returns>
  43         public bool Check100W_RowNum( string _100W_RowNum ) {
  44             if ( _100W_RowNum. Contains( _100W_RowNum ) ) {
  45                 return true;
  46             }
  47             return false;
  48         }
  49 
  50         /// <summary>
  51         /// Check 1 million mapnumber column num is valid
  52         /// 检查100万图号列号是否有效
  53         /// </summary>
  54         /// <returns>true:valid;false:invalid</returns>
  55         public bool Check100W_ColumnNum( string _100W_ColumnNum ) {
  56             if ( _100W_ColumnNum. Contains( _100W_ColumnNum ) ) {
  57                 return true;
  58             }
  59             return false;
  60         }
  61 
  62         /// <summary>
  63         /// Change 1 million mapnumber row digital to string
  64         /// </summary>
  65         /// <returns>1 million mapnumber row string number</returns>
  66         public string Change100W_RowDigitalToString( int _100W_RowDigital ) {
  67             switch ( _100W_RowDigital ) {
  68                 case 1:
  69                     return "A";
  70                 case 2:
  71                     return "B";
  72                 case 3:
  73                     return "C";
  74                 case 4:
  75                     return "D";
  76                 case 5:
  77                     return "E";
  78                 case 6:
  79                     return "F";
  80                 case 7:
  81                     return "G";
  82                 case 8:
  83                     return "H";
  84                 case 9:
  85                     return "I";
  86                 case 10:
  87                     return "J";
  88                 case 11:
  89                     return "K";
  90                 case 12:
  91                     return "L";
  92                 case 13:
  93                     return "M";
  94                 case 14:
  95                     return "N";
  96                 case 15:
  97                     return "O";
  98                 case 16:
  99                     return "P";
 100                 case 17:
 101                     return "Q";
 102                 case 18:
 103                     return "R";
 104                 case 19:
 105                     return "S";
 106                 case 20:
 107                     return "T";
 108                 case 21:
 109                     return "U";
 110                 case 22:
 111                     return "V";
 112                 default:
 113                     return "";
 114             }
 115         }
 116 
 117         /// <summary>
 118         /// Change 1 million mapnumber row string number to digital
 119         /// </summary>
 120         /// <returns>1 million mapnumber row digital number.This is not standard</returns>
 121         public int Change100W_RowStringToDigital( string _100W_RowString ) {
 122             switch ( _100W_RowString ) {
 123                 case "A":
 124                     return 1;
 125                 case "B":
 126                     return 2;
 127                 case "C":
 128                     return 3;
 129                 case "D":
 130                     return 4;
 131                 case "E":
 132                     return 5;
 133                 case "F":
 134                     return 6;
 135                 case "G":
 136                     return 7;
 137                 case "H":
 138                     return 8;
 139                 case "I":
 140                     return 9;
 141                 case "J":
 142                     return 10;
 143                 case "K":
 144                     return 11;
 145                 case "L":
 146                     return 12;
 147                 case "M":
 148                     return 13;
 149                 case "N":
 150                     return 14;
 151                 case "O":
 152                     return 15;
 153                 case "P":
 154                     return 16;
 155                 case "Q":
 156                     return 17;
 157                 case "R":
 158                     return 18;
 159                 case "S":
 160                     return 19;
 161                 case "T":
 162                     return 20;
 163                 case "U":
 164                     return 21;
 165                 case "V":
 166                     return 22;
 167                 default:
 168                     return -1;
 169             }
 170         }
 171 
 172         #endregion
 173 
 174         #region Longitude Difference/Latitude Difference 经差、纬差
 175 
 176         /// <summary>
 177         /// 1,000,000
 178         /// 1 million longitude difference
 179         /// </summary>
 180         public const decimal _100W_LongitudeDifference = 6M;
 181         /// <summary>
 182         /// 1,000,000
 183         /// 1 million latitude difference
 184         /// </summary>
 185         public const decimal _100W_LatitudeDifference = 4M;
 186 
 187         /// <summary>
 188         /// 500,000
 189         /// 500 thousand longitude difference
 190         /// </summary>
 191         public const decimal _50W_LongitudeDifference = 3M;
 192         /// <summary>
 193         /// 500,000
 194         /// 500 thousand latitude difference
 195         /// </summary>
 196         public const decimal _50W_LatitudeDifference = 2M;
 197 
 198         /// <summary>
 199         /// 250,000
 200         /// 250 thousand longitude difference
 201         /// </summary>
 202         public const decimal _25W_LongitudeDifference = 3 / 2M;
 203         /// <summary>
 204         /// 250,000
 205         /// 250 thousand latitude difference
 206         /// </summary>
 207         public const decimal _25W_LatitudeDifference = 1M;
 208 
 209         /// <summary>
 210         /// 200,000 only oldmapnumber
 211         /// 200 thousand longitude difference
 212         /// </summary>
 213         public const decimal _20W_LongitudeDifference = 1M;
 214         /// <summary>
 215         /// 200,000 only oldmapnumber
 216         /// 200 thousand latitude difference
 217         /// </summary>
 218         public const decimal _20W_LatitudeDifference = 2 / 3M;
 219 
 220         /// <summary>
 221         /// 100,000
 222         /// 100 thousand longitude difference
 223         /// </summary>
 224         public const decimal _10W_LongitudeDifference = 1 / 2M;
 225         /// <summary>
 226         /// 100,000
 227         /// 100 thousand latitude difference
 228         /// </summary>
 229         public const decimal _10W_LatitudeDifference = 1 / 3M;
 230 
 231         /// <summary>
 232         /// 50,000
 233         /// 50 thousand longitude difference
 234         /// </summary>
 235         public const decimal _5W_LongitudeDifference = 1 / 4M;
 236         /// <summary>
 237         /// 50,000
 238         /// 50 thousand latitude difference
 239         /// </summary>
 240         public const decimal _5W_LatitudeDifference = 1 / 6M;
 241 
 242         /// <summary>
 243         /// 25,000
 244         /// 25 thousand longitude difference
 245         /// </summary>
 246         public const decimal _2_5W_LongitudeDifference = 1 / 8M;
 247         /// <summary>
 248         /// 25,000
 249         /// 25 thousand latitude difference
 250         /// </summary>
 251         public const decimal _2_5W_LatitudeDifference = 1 / 12M;
 252 
 253         /// <summary>
 254         /// 10,000
 255         /// 10 thousand longitude difference
 256         /// </summary>
 257         public const decimal _1W_LongitudeDifference = 1 / 16M;
 258         /// <summary>
 259         /// 10,000
 260         /// 10 thousand latitude difference
 261         /// </summary>
 262         public const decimal _1W_LatitudeDifference = 1 / 24M;
 263 
 264         /// <summary>
 265         /// 5,000
 266         /// 5 thousand longitude difference
 267         /// </summary>
 268         public const decimal _0_5W_LongitudeDifference = 1 / 32M;
 269         /// <summary>
 270         /// 5,000
 271         /// 5 thousand latitude difference
 272         /// </summary>
 273         public const decimal _0_5W_LatitudeDifference = 1 / 48M;
 274 
 275         /// <summary>
 276         /// 2,000
 277         /// 2 thousand longitude difference
 278         /// </summary>
 279         public const decimal _0_2W_LongitudeDifference = 1 / 96M;
 280         /// <summary>
 281         /// 2,000
 282         /// 2 thousand latitude difference
 283         /// </summary>
 284         public const decimal _0_2W_LatitudeDifference = 1 / 144M;
 285 
 286         /// <summary>
 287         /// 1,000
 288         /// 1 thousand longitude difference
 289         /// </summary>
 290         public const decimal _0_1W_LongitudeDifference = 1 / 192M;
 291         /// <summary>
 292         /// 1,000
 293         /// 1 thousand latitude difference
 294         /// </summary>
 295         public const decimal _0_1W_LatitudeDifference = 1 / 288M;
 296 
 297         /// <summary>
 298         /// 500
 299         /// 500 longitude difference
 300         /// </summary>
 301         public const decimal _500_LongitudeDifference = 1 / 384M;
 302         /// <summary>
 303         /// 500
 304         /// 500 latitude difference
 305         /// </summary>
 306         public const decimal _500_LatitudeDifference = 1 / 576M;
 307 
 308         #endregion
 309 
 310         #region New mapnumber defines   新图幅号定义
 311 
 312         /// <summary>
 313         /// Newmapnumber all scale strings
 314         /// 新图号比例尺字符
 315         /// </summary>
 316         public static readonly string[] newMapnumber_ScaleString = { "B" , "C" , "D" , "E" , "F" , "G" , "H" , "I" , "J" , "K" };
 317 
 318         #region New mapnumber max row and column number
 319 
 320         /// <summary>
 321         /// 500,000
 322         /// Newmapnumber max row and column number
 323         /// 新图号最大行列号
 324         /// </summary>
 325         private const int newMapnumber_50W_MaxNum = 2;
 326 
 327         /// <summary>
 328         /// 250,000
 329         /// Newmapnumber max row and column number
 330         /// </summary>
 331         private const int newMapnumber_25W_MaxNum = 4;
 332 
 333         /// <summary>
 334         /// 100,000
 335         /// Newmapnumber max row and column number
 336         /// </summary>
 337         private const int newMapnumber_10W_MaxNum = 12;
 338 
 339         /// <summary>
 340         /// 50,000
 341         /// Newmapnumber max row and column number
 342         /// </summary>
 343         private const int newMapnumber_5W_MaxNum = 24;
 344 
 345         /// <summary>
 346         /// 25,000
 347         /// Newmapnumber max row and column number
 348         /// </summary>
 349         private const int newMapnumber_2_5W_MaxNum = 48;
 350 
 351         /// <summary>
 352         /// 10,000
 353         /// Newmapnumber max row and column number
 354         /// </summary>
 355         private const int newMapnumber_1W_MaxNum = 96;
 356 
 357         /// <summary>
 358         /// 5,000
 359         /// Newmapnumber max row and column number
 360         /// </summary>
 361         private const int newMapnumber_0_5W_MaxNum = 192;
 362 
 363         /// <summary>
 364         /// 2,000
 365         /// Newmapnumber max row and column number
 366         /// </summary>
 367         private const int newMapnumber_0_2W_MaxNum = 576;
 368 
 369         /// <summary>
 370         /// 1,000
 371         /// Newmapnumber max row and column number
 372         /// </summary>
 373         private const int newMapnumber_0_1W_MaxNum = 1152;
 374 
 375         /// <summary>
 376         /// 500
 377         /// Newmapnumber max row and column number
 378         /// </summary>
 379         private const int newMapnumber_500_MaxNum = 2304;
 380 
 381         #endregion
 382 
 383         /// <summary>
 384         /// Newmapnumber all row column num strings
 385         /// </summary>
 386         private string[] NewMapnumber_GetAllRCNumStrsByMaxNum( int maxNum ) {
 387             string[] numStr = new string[maxNum];
 388             if ( maxNum < 999 ) {
 389                 for ( int q = 1 ; q <= maxNum ; q++ ) {
 390                     numStr[q - 1] = q. ToString( "000" );
 391                 }
 392             } else {
 393                 for ( int q = 1 ; q <= maxNum ; q++ ) {
 394                     numStr[q - 1] = q. ToString( "0000" );
 395                 }
 396             }
 397             return numStr;
 398         }
 399 
 400         /// <summary>
 401         /// Newmapnumber all row column num strings
 402         /// </summary>
 403         private string[] NewMapnumber_GetAllRCNumStrsByScaleStr( string scaleStr ) {
 404             switch ( scaleStr ) {
 405                 case "B":
 406                     return NewMapnumber_GetAllRCNumStrsByMaxNum( newMapnumber_50W_MaxNum );
 407                 case "C":
 408                     return NewMapnumber_GetAllRCNumStrsByMaxNum( newMapnumber_25W_MaxNum );
 409                 case "D":
 410                     return NewMapnumber_GetAllRCNumStrsByMaxNum( newMapnumber_10W_MaxNum );
 411                 case "E":
 412                     return NewMapnumber_GetAllRCNumStrsByMaxNum( newMapnumber_5W_MaxNum );
 413                 case "F":
 414                     return NewMapnumber_GetAllRCNumStrsByMaxNum( newMapnumber_2_5W_MaxNum );
 415                 case "G":
 416                     return NewMapnumber_GetAllRCNumStrsByMaxNum( newMapnumber_1W_MaxNum );
 417                 case "H":
 418                     return NewMapnumber_GetAllRCNumStrsByMaxNum( newMapnumber_0_5W_MaxNum );
 419                 case "I":
 420                     return NewMapnumber_GetAllRCNumStrsByMaxNum( newMapnumber_0_2W_MaxNum );
 421                 case "J":
 422                     return NewMapnumber_GetAllRCNumStrsByMaxNum( newMapnumber_0_1W_MaxNum );
 423                 case "K":
 424                     return NewMapnumber_GetAllRCNumStrsByMaxNum( newMapnumber_500_MaxNum );
 425                 default:
 426                     return null;
 427             }
 428         }
 429 
 430         /// <summary>
 431         /// Newmapnumber check scale str is valid
 432         /// </summary>
 433         /// <param name="scaleStr"></param>
 434         /// <returns>true:valid;false:invalid</returns>
 435         private bool NewMapnumber_CheckScaleStr( string scaleStr ) {
 436             if ( newMapnumber_ScaleString. Contains( scaleStr ) ) {
 437                 return true;
 438             }
 439             return false;
 440         }
 441 
 442         /// <summary>
 443         /// Newmapnumber check row column num is valid
 444         /// </summary>
 445         /// <returns>true:valid;false:invalid</returns>
 446         private bool NewMapnumber_CheckRCNumIsValid( string scaleStr , string rowNum , string columnNum ) {
 447             try {
 448                 string[] rcNumStr = NewMapnumber_GetAllRCNumStrsByScaleStr( scaleStr );
 449                 if ( rcNumStr != null ) {
 450                     if ( rcNumStr. Contains( rowNum ) && rcNumStr. Contains( columnNum ) ) {
 451                         return true;
 452                     }
 453                 }
 454                 return false;
 455             } catch {
 456                 throw;
 457             }
 458         }
 459 
 460         /// <summary>
 461         /// Newmapnumber get scale denominator number by scale string
 462         /// </summary>
 463         /// <param name="scaleStr"></param>
 464         /// <returns></returns>
 465         private int NewMapnumber_GetScaleDenominatorNumberByScaleStr( string scaleStr ) {
 466             switch ( scaleStr ) {
 467                 case "":
 468                     return 1000000;
 469                 case null:
 470                     return 1000000;
 471                 case "B":
 472                     return 500000;
 473                 case "C":
 474                     return 250000;
 475                 case "D":
 476                     return 100000;
 477                 case "E":
 478                     return 50000;
 479                 case "F":
 480                     return 25000;
 481                 case "G":
 482                     return 10000;
 483                 case "H":
 484                     return 5000;
 485                 case "I":
 486                     return 2000;
 487                 case "J":
 488                     return 1000;
 489                 case "K":
 490                     return 500;
 491                 default:
 492                     return -1;
 493             }
 494         }
 495 
 496         #endregion
 497 
 498         #region Old mapnumber defines   旧图幅号定义
 499 
 500         #region Old mapnumber max row and column number
 501 
 502         private const int oldMapnumber_50W_RCNum = 2;
 503         private const int oldMapnumber_25W_RCNum = 4;
 504         private const int oldMapnumber_20W_RCNum = 6;
 505         private const int oldMapnumber_10W_RCNum = 12;
 506         private const int oldMapnumber_5W_RCNum = 2;
 507         private const int oldMapnumber_2_5W_RCNum = 2;
 508         private const int oldMapnumber_1W_RCNum = 8;
 509 
 510         #endregion
 511 
 512         private readonly string[] oldMapnumber_ABCD = { "A" , "B" , "C" , "D" };
 513         private readonly string[] oldMapnumber_abcd = { "a" , "b" , "c" , "d" };
 514         private readonly string[] oldMapnumber_1234 = { "1" , "2" , "3" , "4" };
 515 
 516         /// <summary>
 517         /// Get all string by sum
 518         /// </summary>
 519         /// <param name="sumNum"></param>
 520         /// <returns></returns>
 521         private string[] OldMapnumber_GetAllRCNumStrsByMaxNum( int sumNum ) {
 522             string[] numStr = new string[sumNum];
 523             if ( sumNum < 99 ) {
 524                 for ( int q = 1 ; q <= sumNum ; q++ ) {
 525                     numStr[q - 1] = q. ToString( "00" );
 526                 }
 527             } else {
 528                 for ( int q = 1 ; q <= sumNum ; q++ ) {
 529                     numStr[q - 1] = q. ToString( "000" );
 530                 }
 531             }
 532             return numStr;
 533         }
 534 
 535         private int OldMapnumber_GetSumRCNum( int rcNum ) {
 536             return rcNum * rcNum;
 537         }
 538 
 539         /// <summary>
 540         /// Oldmapnumber change 1234 to ABCD
 541         /// </summary>
 542         private string OldMapnumber_Change1234ToABCD( int num ) {
 543             switch ( num ) {
 544                 case 1:
 545                     return "A";
 546                 case 2:
 547                     return "B";
 548                 case 3:
 549                     return "C";
 550                 case 4:
 551                     return "D";
 552                 default:
 553                     return null;
 554             }
 555         }
 556 
 557         /// <summary>
 558         /// Oldmapnumber change 1234 to abcd
 559         /// </summary>
 560         private string OldMapnumber_Change1234Toabcd( int num ) {
 561             switch ( num ) {
 562                 case 1:
 563                     return "a";
 564                 case 2:
 565                     return "b";
 566                 case 3:
 567                     return "c";
 568                 case 4:
 569                     return "d";
 570                 default:
 571                     return null;
 572             }
 573         }
 574 
 575         /// <summary>
 576         /// Oldmapnumber change ABCD or abcd to 1234
 577         /// </summary>
 578         private int OldMapnumber_ChangeABCDTo1234( string ABCD_abcd ) {
 579             switch ( ABCD_abcd ) {
 580                 case "A":
 581                 case "a":
 582                     return 1;
 583                 case "B":
 584                 case "b":
 585                     return 2;
 586                 case "C":
 587                 case "c":
 588                     return 3;
 589                 case "D":
 590                 case "d":
 591                     return 4;
 592                 default:
 593                     return -1;
 594             }
 595         }
 596 
 597         #endregion
 598 
 599         #endregion
 600 
 601 
 602         #region Check   检查
 603 
 604         #region Check new mapnumber     检查新图号
 605 
 606         /// <summary>
 607         /// Check new mapnumber
 608         /// 检查新图幅号
 609         /// </summary>
 610         public bool NewMapnumber_Check( string newMapnumber ) {
 611             try {
 612                 if ( string. IsNullOrEmpty( newMapnumber ) ) {
 613                     return false;
 614                 }
 615                 int length = newMapnumber. Length;
 616 
 617                 #region Check length            长度检查
 618                 if ( !NewMapnumber_CheckLength( length ) ) {
 619                     return false;
 620                 }
 621                 #endregion
 622 
 623                 #region Check 1 million         100万检查
 624                 string m100W = newMapnumber. Substring( 0 , 3 );
 625                 if ( !NewMapnumber_Check100W( m100W ) ) {
 626                     return false;
 627                 }
 628                 if ( length == 3 ) {
 629                     return true;
 630                 }
 631                 #endregion
 632 
 633                 #region Check scale string      检查比例尺代码
 634                 string scaleStr = newMapnumber. Substring( 3 , 1 );
 635                 if ( !NewMapnumber_CheckScaleStr( scaleStr ) ) {
 636                     return false;
 637                 }
 638                 #endregion
 639 
 640                 #region Check row and column number     检查行列号
 641                 if ( length == 10 && scaleStr != "J" && scaleStr != "K" ) {
 642                     string r = newMapnumber. Substring( 4 , 3 );
 643                     string c = newMapnumber. Substring( 7 , 3 );
 644                     if ( !NewMapnumber_CheckRCNumIsValid( scaleStr , r , c ) ) {
 645                         return false;
 646                     }
 647                 } else {
 648                     string r = newMapnumber. Substring( 4 , 4 );
 649                     string c = newMapnumber. Substring( 8 , 4 );
 650                     if ( !NewMapnumber_CheckRCNumIsValid( scaleStr , r , c ) ) {
 651                         return false;
 652                     }
 653                 }
 654                 #endregion
 655 
 656                 return true;
 657             } catch {
 658                 throw;
 659             }
 660         }
 661 
 662         /// <summary>
 663         /// Check newmapnumber length
 664         /// </summary>
 665         private bool NewMapnumber_CheckLength( int newMapnumberLength ) {
 666             if ( newMapnumberLength == 3 || newMapnumberLength == 10 || newMapnumberLength == 12 ) {
 667                 return true;
 668             }
 669             return false;
 670         }
 671 
 672         /// <summary>
 673         /// Check newmapnumber 100W(1,000,000)
 674         /// </summary>
 675         /// <param name="newMapnumber100W"></param>
 676         /// <returns></returns>
 677         private bool NewMapnumber_Check100W( string newMapnumber100W ) {
 678             if ( newMapnumber100W. Length == 3 ) {
 679                 string r = newMapnumber100W. Substring( 0 , 1 );
 680                 string c = newMapnumber100W. Substring( 1 , 2 );
 681                 if ( !Check100W_RowNum( r ) || !Check100W_ColumnNum( c ) ) {
 682                     return false;
 683                 }
 684                 return true;
 685             } else {
 686                 return false;
 687             }
 688         }
 689 
 690         #endregion
 691 
 692         #region Chekc old mapnumber     检查旧图号
 693 
 694         /// <summary>
 695         /// Check old mapnumber
 696         /// 检查旧图幅号
 697         /// </summary>
 698         /// <param name="oldMapnumber"></param>
 699         /// <returns></returns>
 700         public bool OldMapnumber_Check( string oldMapnumber ) {
 701             try {
 702                 if ( string. IsNullOrEmpty( oldMapnumber ) ) {
 703                     return false;
 704                 }
 705                 if ( !oldMapnumber. Contains( '-' ) ) {
 706                     return false;
 707                 }
 708                 string[] split = oldMapnumber. Split( new char[] { '-' } , StringSplitOptions. RemoveEmptyEntries );
 709                 int length = split. Length;
 710                 if ( !OldMapnumber_CheckAfterSplitLength( length ) ) {
 711                     return false;
 712                 }
 713                 if ( length == 2 )//100
 714                 {
 715                     return OldMapnumber_Check100W( oldMapnumber );
 716                 } else if ( length == 3 )// 50 25 20 10
 717                 {
 718                     if ( OldMapnumber_Check50W( oldMapnumber ) || OldMapnumber_Check25W( oldMapnumber )
 719                         || OldMapnumber_Check20W( oldMapnumber ) || OldMapnumber_Check10W( oldMapnumber ) ) {
 720                         return true;
 721                     } else {
 722                         return false;
 723                     }
 724                 } else if ( length == 4 )// 5 1
 725                 {
 726                     if ( OldMapnumber_Check5W( oldMapnumber ) || OldMapnumber_Check1W( oldMapnumber ) ) {
 727                         return true;
 728                     } else {
 729                         return false;
 730                     }
 731                 } else if ( length == 5 )//2.5 0.5
 732                 {
 733                     if ( OldMapnumber_Check2_5W( oldMapnumber ) || OldMapnumber_Check0_5W( oldMapnumber ) ) {
 734                         return true;
 735                     } else {
 736                         return false;
 737                     }
 738                 } else {
 739                     return false;
 740                 }
 741             } catch {
 742                 throw;
 743             }
 744         }
 745 
 746         /// <summary>
 747         /// Check old mapnumber 100W(1,000,000)
 748         /// 检查100万旧图幅号
 749         /// </summary>
 750         /// <param name="oldMapnumber100W"></param>
 751         /// <returns></returns>
 752         public bool OldMapnumber_Check100W( string oldMapnumber100W ) {
 753             try {
 754                 if ( string. IsNullOrEmpty( oldMapnumber100W ) ) {
 755                     return false;
 756                 }
 757 
 758                 #region Check necessary -       检查必须的-
 759                 if ( !oldMapnumber100W. Contains( '-' ) ) {
 760                     return false;
 761                 }
 762                 #endregion
 763 
 764                 string[] split = oldMapnumber100W. Split( new char[] { '-' } , StringSplitOptions. RemoveEmptyEntries );
 765 
 766                 #region Check length    检查长度
 767                 int length = split. Length;
 768                 if ( length != 2 ) {
 769                     return false;
 770                 }
 771                 #endregion
 772 
 773                 #region Check 100W row column num   检查100万行列号
 774                 string r = split[0];
 775                 string c = split[1];
 776                 if ( !Check100W_RowNum( r ) || !Check100W_ColumnNum( c ) ) {
 777                     return false;
 778                 }
 779                 #endregion
 780 
 781                 return true;
 782             } catch {
 783                 throw;
 784             }
 785         }
 786 
 787         /// <summary>
 788         /// Check old mapnumber 50W(500,000)
 789         /// 检查50万旧图幅号
 790         /// </summary>
 791         /// <param name="oldMapnumber50W"></param>
 792         /// <returns></returns>
 793         public bool OldMapnumber_Check50W( string oldMapnumber50W ) {
 794             try {
 795                 if ( string. IsNullOrEmpty( oldMapnumber50W ) ) {
 796                     return false;
 797                 }
 798 
 799                 #region Check necessary -       检查必须的-
 800                 if ( !oldMapnumber50W. Contains( '-' ) ) {
 801                     return false;
 802                 }
 803                 #endregion
 804 
 805                 string[] split = oldMapnumber50W. Split( new char[] { '-' } , StringSplitOptions. RemoveEmptyEntries );
 806 
 807                 #region Check length    检查长度
 808                 int length = split. Length;
 809                 if ( length != 3 ) {
 810                     return false;
 811                 }
 812                 #endregion
 813 
 814                 #region Check 100W row column num   检查100万行列号
 815                 string r = split[0];
 816                 string c = split[1];
 817                 if ( !Check100W_RowNum( r ) || !Check100W_ColumnNum( c ) ) {
 818                     return false;
 819                 }
 820                 #endregion
 821 
 822                 #region Check sub row column num    检查子行列号
 823                 string k = split[2];
 824                 if ( !oldMapnumber_ABCD. Contains( k ) ) {
 825                     return false;
 826                 }
 827                 #endregion
 828 
 829                 return true;
 830             } catch {
 831                 throw;
 832             }
 833         }
 834 
 835         /// <summary>
 836         /// Check old mapnumber 25W(250,000)
 837         /// 检查25万旧图幅号
 838         /// </summary>
 839         /// <param name="oldMapnumber25W"></param>
 840         /// <returns></returns>
 841         public bool OldMapnumber_Check25W( string oldMapnumber25W ) {
 842             try {
 843                 if ( string. IsNullOrEmpty( oldMapnumber25W ) ) {
 844                     return false;
 845                 }
 846 
 847                 #region Check necessary -[]       检查必须的 - [ ]
 848                 if ( !oldMapnumber25W. Contains( '-' ) || !oldMapnumber25W. Contains( '[' ) || !oldMapnumber25W. Contains( ']' ) ) {
 849                     return false;
 850                 }
 851                 
 852                 #endregion
 853 
 854                 string[] split = oldMapnumber25W. Split( new char[] { '-' } , StringSplitOptions. RemoveEmptyEntries );
 855 
 856                 #region Check length    检查长度
 857                 int length = split. Length;
 858                 if ( length != 3 ) {
 859                     return false;
 860                 }
 861                 #endregion
 862 
 863                 #region Check 100W row column num   检查100万行列号
 864                 string r = split[0];
 865                 string c = split[1];
 866                 if ( !Check100W_RowNum( r ) || !Check100W_ColumnNum( c ) ) {
 867                     return false;
 868                 }
 869                 #endregion
 870 
 871                 #region Check sub row column num    检查子行列号
 872                 string k = split[2];
 873                 string[] subSplit = k. Split( new char[] { '[' , ']' } , StringSplitOptions. RemoveEmptyEntries );
 874                 int len = subSplit. Length;
 875                 if ( len != 1 ) {
 876                     return false;
 877                 }
 878                 string sub = subSplit[0];
 879                 int sum = OldMapnumber_GetSumRCNum( oldMapnumber_25W_RCNum );
 880                 string[] strs = OldMapnumber_GetAllRCNumStrsByMaxNum( sum );
 881                 if ( strs. Contains( sub ) ) {
 882                     return true;
 883                 } else {
 884                     return false;
 885                 }
 886                 #endregion
 887 
 888             } catch {
 889                 throw;
 890             }
 891         }
 892 
 893         /// <summary>
 894         /// Check old mapnumber 20W(200,000)
 895         /// 检查20万旧图幅号
 896         /// </summary>
 897         /// <param name="oldMapnumber20W"></param>
 898         /// <returns></returns>
 899         public bool OldMapnumber_Check20W( string oldMapnumber20W ) {
 900             try {
 901                 if ( string. IsNullOrEmpty( oldMapnumber20W ) ) {
 902                     return false;
 903                 }
 904 
 905                 #region Check necessary -()       检查必须的 - ( )
 906                 if ( !oldMapnumber20W. Contains( '-' ) || !oldMapnumber20W. Contains( '(' ) || !oldMapnumber20W. Contains( ')' ) ) {
 907                     return false;
 908                 }
 909                 #endregion
 910 
 911                 string[] split = oldMapnumber20W. Split( new char[] { '-' } , StringSplitOptions. RemoveEmptyEntries );
 912 
 913                 #region Check length    检查长度
 914                 int length = split. Length;
 915                 if ( length != 3 ) {
 916                     return false;
 917                 }
 918                 #endregion
 919 
 920                 #region Check 100W row column num   检查100万行列号
 921                 string r = split[0];
 922                 string c = split[1];
 923                 if ( !Check100W_RowNum( r ) || !Check100W_ColumnNum( c ) ) {
 924                     return false;
 925                 }
 926                 #endregion
 927 
 928                 #region Check sub row column num    检查子行列号
 929                 string k = split[2];
 930                 string[] subSplit = k. Split( new char[] { '(' , ')' } , StringSplitOptions. RemoveEmptyEntries );
 931                 int len = subSplit. Length;
 932                 if ( len != 1 ) {
 933                     return false;
 934                 }
 935                 string sub = subSplit[0];
 936                 int sum = OldMapnumber_GetSumRCNum( oldMapnumber_20W_RCNum );
 937                 string[] strs = OldMapnumber_GetAllRCNumStrsByMaxNum( sum );
 938                 if ( strs. Contains( sub ) ) {
 939                     return true;
 940                 } else {
 941                     return false;
 942                 }
 943                 #endregion
 944 
 945             } catch {
 946                 throw;
 947             }
 948         }
 949 
 950         /// <summary>
 951         /// Check old mapnumber 10W(100,000)
 952         /// 检查10万旧图幅号
 953         /// </summary>
 954         /// <param name="oldMapnumber10W"></param>
 955         /// <returns></returns>
 956         public bool OldMapnumber_Check10W( string oldMapnumber10W ) {
 957             try {
 958                 if ( string. IsNullOrEmpty( oldMapnumber10W ) ) {
 959                     return false;
 960                 }
 961 
 962                 #region Check necessary -       检查必须的 -
 963                 if ( !oldMapnumber10W. Contains( '-' ) ) {
 964                     return false;
 965                 }
 966                 #endregion
 967 
 968                 string[] split = oldMapnumber10W. Split( new char[] { '-' } , StringSplitOptions. RemoveEmptyEntries );
 969 
 970                 #region Check length    检查长度
 971                 int length = split. Length;
 972                 if ( length != 3 ) {
 973                     return false;
 974                 }
 975                 #endregion
 976 
 977                 #region Check 100W row column num   检查100万行列号
 978                 string r = split[0];
 979                 string c = split[1];
 980                 if ( !Check100W_RowNum( r ) || !Check100W_ColumnNum( c ) ) {
 981                     return false;
 982                 }
 983                 #endregion
 984 
 985                 #region Check sub row column num    检查子行列号
 986                 string sub = split[2];
 987                 int sum = OldMapnumber_GetSumRCNum( oldMapnumber_10W_RCNum );
 988                 string[] strs = OldMapnumber_GetAllRCNumStrsByMaxNum( sum );
 989                 if ( strs. Contains( sub ) ) {
 990                     return true;
 991                 } else {
 992                     return false;
 993                 }
 994                 #endregion
 995 
 996             } catch {
 997                 throw;
 998             }
 999         }
1000 
1001         /// <summary>
1002         /// Check old mapnumber 5W(50,000)
1003         /// 检查5万旧图幅号
1004         /// </summary>
1005         /// <param name="oldMapnumber5W"></param>
1006         /// <returns></returns>
1007         public bool OldMapnumber_Check5W( string oldMapnumber5W ) {
1008             try {
1009                 if ( string. IsNullOrEmpty( oldMapnumber5W ) ) {
1010                     return false;
1011                 }
1012 
1013                 #region 检查必须的 -
1014                 if ( !oldMapnumber5W. Contains( '-' ) ) {
1015                     return false;
1016                 }
1017                 #endregion
1018 
1019                 string[] split = oldMapnumber5W. Split( new char[] { '-' } , StringSplitOptions. RemoveEmptyEntries );
1020 
1021                 #region 检查长度
1022                 int length = split. Length;
1023                 if ( length != 4 ) {
1024                     return false;
1025                 }
1026                 #endregion
1027 
1028                 #region 检查10万图号
1029                 string o10W = split[0] + "-" + split[1] + "-" + split[2];
1030                 if ( !OldMapnumber_Check10W( o10W ) ) {
1031                     return false;
1032                 }
1033                 #endregion
1034 
1035                 #region 检查子行列号
1036                 string k = split[3];
1037                 if ( !oldMapnumber_ABCD. Contains( k ) ) {
1038                     return false;
1039                 }
1040                 #endregion
1041 
1042                 return true;
1043             } catch {
1044                 throw;
1045             }
1046         }
1047 
1048         /// <summary>
1049         /// Check old mapnumber 2.5W(25,000)
1050         /// 检查2.5万旧图幅号
1051         /// </summary>
1052         /// <param name="oldMapnumber2_5W"></param>
1053         /// <returns></returns>
1054         public bool OldMapnumber_Check2_5W( string oldMapnumber2_5W ) {
1055             try {
1056                 if ( string. IsNullOrEmpty( oldMapnumber2_5W ) ) {
1057                     return false;
1058                 }
1059 
1060                 #region 检查必须的 -
1061                 if ( !oldMapnumber2_5W. Contains( '-' ) ) {
1062                     return false;
1063                 }
1064                 #endregion
1065                 string[] split = oldMapnumber2_5W. Split( new char[] { '-' } , StringSplitOptions. RemoveEmptyEntries );
1066 
1067                 #region 检查长度
1068                 int length = split. Length;
1069                 if ( length != 5 ) {
1070                     return false;
1071                 }
1072                 #endregion
1073 
1074                 #region 检查5万图号
1075                 string o5W = split[0] + "-" + split[1] + "-" + split[2] + "-" + split[3];
1076                 if ( !OldMapnumber_Check5W( o5W ) ) {
1077                     return false;
1078                 }
1079                 #endregion
1080 
1081                 #region 检查子行列号
1082                 string k = split[4];
1083                 if ( !oldMapnumber_1234. Contains( k ) ) {
1084                     return false;
1085                 }
1086                 #endregion
1087 
1088                 return true;
1089             } catch {
1090                 throw;
1091             }
1092         }
1093 
1094         /// <summary>
1095         /// Check old mapnumber 1W(10,000)
1096         /// 检查1万旧图幅号
1097         /// </summary>
1098         /// <param name="oldMapnumber1W"></param>
1099         /// <returns></returns>
1100         public bool OldMapnumber_Check1W( string oldMapnumber1W ) {
1101             try {
1102                 if ( string. IsNullOrEmpty( oldMapnumber1W ) ) {
1103                     return false;
1104                 }
1105 
1106                 #region 检查必须的 - ( )
1107                 if ( !oldMapnumber1W. Contains( '-' ) || !oldMapnumber1W. Contains( '(' ) || !oldMapnumber1W. Contains( ')' ) ) {
1108                     return false;
1109                 }
1110                 #endregion
1111 
1112                 string[] split = oldMapnumber1W. Split( new char[] { '-' } , StringSplitOptions. RemoveEmptyEntries );
1113 
1114                 #region 检查长度
1115                 int length = split. Length;
1116                 if ( length != 4 ) {
1117                     return false;
1118                 }
1119                 #endregion
1120 
1121                 #region 检查10万图号
1122                 string o10W = split[0] + "-" + split[1] + "-" + split[2];
1123                 if ( !OldMapnumber_Check10W( o10W ) ) {
1124                     return false;
1125                 }
1126                 #endregion
1127 
1128                 #region 检查子行列号
1129                 string k = split[3];
1130                 string[] subSplit = k. Split( new char[] { '(' , ')' } , StringSplitOptions. RemoveEmptyEntries );
1131                 int len = subSplit. Length;
1132                 if ( len != 1 ) {
1133                     return false;
1134                 }
1135                 string sub = subSplit[0];
1136                 int sum = OldMapnumber_GetSumRCNum( oldMapnumber_1W_RCNum );
1137                 string[] strs = OldMapnumber_GetAllRCNumStrsByMaxNum( sum );
1138                 if ( strs. Contains( sub ) ) {
1139                     return true;
1140                 } else {
1141                     return false;
1142                 }
1143                 #endregion
1144 
1145             } catch {
1146                 throw;
1147             }
1148         }
1149 
1150         /// <summary>
1151         /// Check old mapnumber 5,000
1152         /// 检查0.5万旧图幅号
1153         /// </summary>
1154         /// <param name="oldMapnumber0_5W"></param>
1155         /// <returns></returns>
1156         public bool OldMapnumber_Check0_5W( string oldMapnumber0_5W ) {
1157             try {
1158                 if ( string. IsNullOrEmpty( oldMapnumber0_5W ) ) {
1159                     return false;
1160                 }
1161 
1162                 #region 检查必须的 - ( )
1163                 if ( !oldMapnumber0_5W. Contains( '-' ) || !oldMapnumber0_5W. Contains( '(' ) || !oldMapnumber0_5W. Contains( ')' ) ) {
1164                     return false;
1165                 }
1166                 #endregion
1167 
1168                 string[] split = oldMapnumber0_5W. Split( new char[] { '-' } , StringSplitOptions. RemoveEmptyEntries );
1169 
1170                 #region 检查长度
1171                 int length = split. Length;
1172                 if ( length != 5 ) {
1173                     return false;
1174                 }
1175                 #endregion
1176 
1177                 #region 检查1万图号
1178                 string o1W = split[0] + "-" + split[1] + "-" + split[2] + "-" + split[3];
1179                 if ( !OldMapnumber_Check1W( o1W ) ) {
1180                     return false;
1181                 }
1182                 #endregion
1183 
1184                 #region 检查子行列号
1185                 string k = split[4];
1186                 if ( !oldMapnumber_abcd. Contains( k ) ) {
1187                     return false;
1188                 }
1189                 #endregion
1190 
1191                 return true;
1192             } catch {
1193                 throw;
1194             }
1195         }
1196 
1197         /// <summary>
1198         /// Check old mapnumber length after split
1199         /// </summary>
1200         /// <param name="oldMapnumberLength"></param>
1201         /// <returns></returns>
1202         private bool OldMapnumber_CheckAfterSplitLength( int oldMapnumberLength ) {
1203             if ( oldMapnumberLength < 2 || oldMapnumberLength > 5 ) {
1204                 return false;
1205             }
1206             return true;
1207         }
1208 
1209         #endregion
1210 
1211         #endregion
1212 
1213 
1214         #region Exchange new/old mapnumber      新旧图幅号转换
1215 
1216         #region Old mapnumber to new mapnumber      旧图号转新图号
1217 
1218         /// <summary>
1219         /// Old mapnumber to new mapnumber
1220         /// 旧图幅号转新图幅号
1221         /// </summary>
1222         /// <param name="oldMapnumber"></param>
1223         /// <returns></returns>
1224         public string OldMapnumberToNewMapnumber( string oldMapnumber ) {
1225             if ( !OldMapnumber_Check( oldMapnumber ) ) {
1226                 return "";
1227             }
1228             string result = "";
1229             result = OldMapnumberToNewMapnumber_100W( oldMapnumber );
1230             if ( !string. IsNullOrEmpty( result ) ) {
1231                 return result;
1232             }
1233             result = OldMapnumberToNewMapnumber_50W( oldMapnumber );
1234             if ( !string. IsNullOrEmpty( result ) ) {
1235                 return result;
1236             }
1237             result = OldMapnumberToNewMapnumber_25W( oldMapnumber );
1238             if ( !string. IsNullOrEmpty( result ) ) {
1239                 return result;
1240             }
1241             result = OldMapnumberToNewMapnumber_10W( oldMapnumber );
1242             if ( !string. IsNullOrEmpty( result ) ) {
1243                 return result;
1244             }
1245             result = OldMapnumberToNewMapnumber_5W( oldMapnumber );
1246             if ( !string. IsNullOrEmpty( result ) ) {
1247                 return result;
1248             }
1249             result = OldMapnumberToNewMapnumber_2_5W( oldMapnumber );
1250             if ( !string. IsNullOrEmpty( result ) ) {
1251                 return result;
1252             }
1253             result = OldMapnumberToNewMapnumber_1W( oldMapnumber );
1254             if ( !string. IsNullOrEmpty( result ) ) {
1255                 return result;
1256             }
1257             result = OldMapnumberToNewMapnumber_0_5W( oldMapnumber );
1258             if ( !string. IsNullOrEmpty( result ) ) {
1259                 return result;
1260             }
1261             return result;
1262         }
1263 
1264         /// <summary>
1265         /// Old mapnumber to new mapnumber 100W
1266         /// 100万旧图幅号转新图幅号
1267         /// </summary>
1268         /// <param name="oldMapnumber100W"></param>
1269         /// <returns></returns>
1270         public string OldMapnumberToNewMapnumber_100W( string oldMapnumber100W ) {
1271             try {
1272                 if ( !OldMapnumber_Check100W( oldMapnumber100W ) ) {
1273                     return "";
1274                 }
1275                 string[] temp = oldMapnumber100W. Split( '-' );
1276                 string new100 = temp[0] + temp[1]. PadLeft( 2 , '0' );
1277                 return new100;
1278             } catch {
1279                 throw;
1280             }
1281         }
1282 
1283         /// <summary>
1284         /// Old mapnumber to new mapnumber 50W
1285         /// 50万旧图幅号转新图幅号
1286         /// </summary>
1287         /// <param name="oldMapnumber50W"></param>
1288         /// <returns></returns>
1289         public string OldMapnumberToNewMapnumber_50W( string oldMapnumber50W ) {
1290             try {
1291                 if ( !OldMapnumber_Check50W( oldMapnumber50W ) ) {
1292                     return "";
1293                 }
1294                 string[] temp = oldMapnumber50W. Split( '-' );
1295                 string new100 = temp[0] + temp[1]. PadLeft( 2 , '0' );
1296                 int x = OldMapnumber_ChangeABCDTo1234( temp[2] );
1297                 if ( x <= 0 ) {
1298                     return "";
1299                 }
1300                 int new50R = OldToNew50W_R( x );
1301                 int new50C = OldToNew50W_C( x );
1302                 return new100 + "B" + new50R. ToString(). PadLeft( 3 , '0' ) + new50C. ToString(). PadLeft( 3 , '0' );
1303             } catch {
1304                 throw;
1305             }
1306         }
1307 
1308         /// <summary>
1309         /// Old mapnumber to new mapnumber 25W
1310         /// 25万旧图幅号转新图幅号
1311         /// </summary>
1312         /// <param name="oldMapnumber25W"></param>
1313         /// <returns></returns>
1314         public string OldMapnumberToNewMapnumber_25W( string oldMapnumber25W ) {
1315             try {
1316                 if ( !OldMapnumber_Check25W( oldMapnumber25W ) ) {
1317                     return "";
1318                 }
1319                 string[] temp = oldMapnumber25W. Split( '-' );
1320                 string new100 = temp[0] + temp[1]. PadLeft( 2 , '0' );
1321                 string sub25W = temp[2];
1322                 string[] subTemp = sub25W. Split( new char[] { '[' , ']' } , StringSplitOptions. RemoveEmptyEntries );
1323                 int x = int. Parse( subTemp[0] );
1324                 int new25R = OldToNew25W_R( x );
1325                 int new25C = OldToNew25W_C( x );
1326                 return new100 + "C" + new25R. ToString(). PadLeft( 3 , '0' ) + new25C. ToString(). PadLeft( 3 , '0' );
1327             } catch {
1328                 throw;
1329             }
1330         }
1331 
1332         /// <summary>
1333         /// Old mapnumber to new mapnumber 10W
1334         /// 10万旧图幅号转新图幅号
1335         /// </summary>
1336         /// <param name="oldMapnumber10W"></param>
1337         /// <returns></returns>
1338         public string OldMapnumberToNewMapnumber_10W( string oldMapnumber10W ) {
1339             try {
1340                 if ( !OldMapnumber_Check10W( oldMapnumber10W ) ) {
1341                     return "";
1342                 }
1343                 string[] temp = oldMapnumber10W. Split( '-' );
1344                 string new100 = temp[0] + temp[1]. PadLeft( 2 , '0' );
1345                 string sub10W = temp[2];
1346                 int x = int. Parse( sub10W );
1347                 int new10R = OldToNew10W_R( x );
1348                 int new10C = OldToNew10W_C( x );
1349                 return new100 + "D" + new10R. ToString(). PadLeft( 3 , '0' ) + new10C. ToString(). PadLeft( 3 , '0' );
1350             } catch {
1351                 throw;
1352             }
1353         }
1354 
1355         /// <summary>
1356         /// Old mapnumber to new mapnumber 5W
1357         /// 5万旧图幅号转新图幅号
1358         /// </summary>
1359         /// <param name="oldMapnumber5W"></param>
1360         /// <returns></returns>
1361         public string OldMapnumberToNewMapnumber_5W( string oldMapnumber5W ) {
1362             try {
1363                 if ( !OldMapnumber_Check5W( oldMapnumber5W ) ) {
1364                     return "";
1365                 }
1366                 string[] temp = oldMapnumber5W. Split( '-' );
1367                 string new100 = temp[0] + temp[1]. PadLeft( 2 , '0' );
1368                 string sub10W = temp[2];
1369                 int x = int. Parse( sub10W );
1370                 int new10R = OldToNew10W_R( x );
1371                 int new10C = OldToNew10W_C( x );
1372                 int sub5W = OldMapnumber_ChangeABCDTo1234( temp[3] );
1373                 int new5R = OldToNew5W_R( sub5W , new10R );
1374                 int new5C = OldToNew5W_C( sub5W , new10C );
1375                 return new100 + "E" + new5R. ToString(). PadLeft( 3 , '0' ) + new5C. ToString(). PadLeft( 3 , '0' );
1376             } catch {
1377                 throw;
1378             }
1379         }
1380 
1381         /// <summary>
1382         /// Old mapnumber to new mapnumber 2.5W
1383         /// 2.5万旧图幅号转新图幅号
1384         /// </summary>
1385         /// <param name="oldMapnumber2_5W"></param>
1386         /// <returns></returns>
1387         public string OldMapnumberToNewMapnumber_2_5W( string oldMapnumber2_5W ) {
1388             try {
1389                 if ( !OldMapnumber_Check2_5W( oldMapnumber2_5W ) ) {
1390                     return "";
1391                 }
1392                 string[] temp = oldMapnumber2_5W. Split( '-' );
1393                 string new100 = temp[0] + temp[1]. PadLeft( 2 , '0' );
1394                 string sub10W = temp[2];
1395                 int x = int. Parse( sub10W );
1396                 int new10R = OldToNew10W_R( x );
1397                 int new10C = OldToNew10W_C( x );
1398                 int sub5W = OldMapnumber_ChangeABCDTo1234( temp[3] );
1399                 int new5R = OldToNew5W_R( sub5W , new10R );
1400                 int new5C = OldToNew5W_C( sub5W , new10C );
1401                 int sub2_5W = int. Parse( temp[4] );
1402                 int new2_5R = OldToNew2_5W_R( sub2_5W , new5R );
1403                 int new2_5C = OldToNew2_5W_C( sub2_5W , new5C );
1404                 string new2 = new100 + "F" + new2_5R. ToString(). PadLeft( 3 , '0' ) + new2_5C. ToString(). PadLeft( 3 , '0' );
1405                 return new2;
1406             } catch {
1407                 throw;
1408             }
1409         }
1410 
1411         /// <summary>
1412         /// Old mapnumber to new mapnumber 1W
1413         /// 1万旧图幅号转新图幅号
1414         /// </summary>
1415         /// <param name="oldMapnumber1W"></param>
1416         /// <returns></returns>
1417         public string OldMapnumberToNewMapnumber_1W( string oldMapnumber1W ) {
1418             try {
1419                 if ( !OldMapnumber_Check1W( oldMapnumber1W ) ) {
1420                     return "";
1421                 }
1422                 string[] temp = oldMapnumber1W. Split( '-' );
1423                 string new100 = temp[0] + temp[1]. PadLeft( 2 , '0' );
1424                 string sub10W = temp[2];
1425                 int x = int. Parse( sub10W );
1426                 int new10R = OldToNew10W_R( x );
1427                 int new10C = OldToNew10W_C( x );
1428                 string sub1W = temp[3];
1429                 string[] subTemp = sub1W. Split( new char[] { '(' , ')' } , StringSplitOptions. RemoveEmptyEntries );
1430                 int k = int. Parse( subTemp[0] );
1431                 int new1R = OldToNew1W_R( k , new10R );
1432                 int new1C = OldToNew1W_C( k , new10C );
1433                 return new100 + "G" + new1R. ToString(). PadLeft( 3 , '0' ) + new1C. ToString(). PadLeft( 3 , '0' );
1434             } catch {
1435                 throw;
1436             }
1437         }
1438 
1439         /// <summary>
1440         /// Old mapnumber to new mapnumber 0.5W
1441         /// 0.5万旧图幅号转新图幅号
1442         /// </summary>
1443         /// <param name="oldMapnumber0_5W"></param>
1444         /// <returns></returns>
1445         public string OldMapnumberToNewMapnumber_0_5W( string oldMapnumber0_5W ) {
1446             try {
1447                 if ( !OldMapnumber_Check0_5W( oldMapnumber0_5W ) ) {
1448                     return "";
1449                 }
1450                 string[] temp = oldMapnumber0_5W. Split( '-' );
1451                 string new100 = temp[0] + temp[1]. PadLeft( 2 , '0' );
1452                 string sub10W = temp[2];
1453                 int x = int. Parse( sub10W );
1454                 int new10R = OldToNew10W_R( x );
1455                 int new10C = OldToNew10W_C( x );
1456                 string sub1W = temp[3];
1457                 string[] subTemp = sub1W. Split( new char[] { '(' , ')' } , StringSplitOptions. RemoveEmptyEntries );
1458                 int k = int. Parse( subTemp[0] );
1459                 int new1R = OldToNew1W_R( k , new10R );
1460                 int new1C = OldToNew1W_C( k , new10C );
1461                 string sub0_5W = temp[4];
1462                 int l = OldMapnumber_ChangeABCDTo1234( sub0_5W );
1463                 int new0_5R = OldToNew0_5W_R( l , new1R );
1464                 int new0_5C = OldToNew0_5W_C( l , new1C );
1465                 return new100 + "H" + new0_5R. ToString(). PadLeft( 3 , '0' ) + new0_5C. ToString(). PadLeft( 3 , '0' );
1466             } catch {
1467                 throw;
1468             }
1469         }
1470 
1471         #region Old mapnumber to new mapnumber calculate row column number      旧转新计算行列号
1472 
1473         /// <summary>
1474         /// Old mapnumber to new mapnumber calculate 50W row number
1475         /// </summary>
1476         private int OldToNew50W_R( int oldMapnumberSub50W ) {
1477             return ( oldMapnumberSub50W - 1 ) / 2 + 1;
1478         }
1479         /// <summary>
1480         /// Old mapnumber to new mapnumber calculate 50W column number
1481         /// </summary>
1482         private int OldToNew50W_C( int oldMapnumberSub50W ) {
1483             return ( oldMapnumberSub50W + 1 ) % 2 + 1;
1484         }
1485 
1486         /// <summary>
1487         /// Old mapnumber to new mapnumber calculate 25W row number
1488         /// </summary>
1489         private int OldToNew25W_R( int oldMapnumberSub25W ) {
1490             return ( ( oldMapnumberSub25W - 1 ) / 4 ) + 1;
1491         }
1492         /// <summary>
1493         /// Old mapnumber to new mapnumber calculate 25W column number
1494         /// </summary>
1495         private int OldToNew25W_C( int oldMapnumberSub25W ) {
1496             return ( ( oldMapnumberSub25W + 3 ) % 4 ) + 1;
1497         }
1498 
1499         /// <summary>
1500         /// Old mapnumber to new mapnumber calculate 10W row number
1501         /// </summary>
1502         private int OldToNew10W_R( int oldMapnumberSub10W ) {
1503             return ( ( oldMapnumberSub10W - 1 ) / 12 ) + 1;
1504         }
1505         /// <summary>
1506         /// Old mapnumber to new mapnumber calculate 10W column number
1507         /// </summary>
1508         private int OldToNew10W_C( int oldMapnumberSub10W ) {
1509             return ( ( oldMapnumberSub10W + 11 ) % 12 ) + 1;
1510         }
1511 
1512         /// <summary>
1513         /// Old mapnumber to new mapnumber calculate 5W row number
1514         /// </summary>
1515         private int OldToNew5W_R( int oldMapnumberSub5W , int new10R ) {
1516             return ( 2 * new10R ) + ( ( oldMapnumberSub5W - 1 ) / 2 - 1 );
1517         }
1518         /// <summary>
1519         /// Old mapnumber to new mapnumber calculate 5W column number
1520         /// </summary>
1521         private int OldToNew5W_C( int oldMapnumberSub5W , int new10C ) {
1522             return ( 2 * new10C ) + ( ( oldMapnumberSub5W + 1 ) % 2 - 1 );
1523         }
1524 
1525         /// <summary>
1526         /// Old mapnumber to new mapnumber calculate 2_5W row number
1527         /// </summary>
1528         private int OldToNew2_5W_R( int oldMapnumberSub2_5W , int new5R ) {
1529             return 2 * new5R + ( oldMapnumberSub2_5W - 1 ) / 2 - 1;
1530         }
1531         /// <summary>
1532         /// Old mapnumber to new mapnumber calculate 2_5W column number
1533         /// </summary>
1534         private int OldToNew2_5W_C( int oldMapnumberSub2_5W , int new5C ) {
1535             return 2 * new5C + ( oldMapnumberSub2_5W + 1 ) % 2 - 1;
1536         }
1537 
1538         /// <summary>
1539         /// Old mapnumber to new mapnumber calculate 1W row number
1540         /// </summary>
1541         private int OldToNew1W_R( int oldMapnumberSub1W , int new10R ) {
1542             return 8 * new10R + ( ( oldMapnumberSub1W - 1 ) / 8 ) - 7;
1543         }
1544         /// <summary>
1545         /// Old mapnumber to new mapnumber calculate 1W column number
1546         /// </summary>
1547         private int OldToNew1W_C( int oldMapnumberSub1W , int new10C ) {
1548             return 8 * new10C + ( ( oldMapnumberSub1W + 7 ) % 8 ) - 7;
1549         }
1550 
1551         /// <summary>
1552         /// Old mapnumber to new mapnumber calculate 0_5W row number
1553         /// </summary>
1554         private int OldToNew0_5W_R( int oldMapnumberSub0_5W , int new1R ) {
1555             return 2 * new1R + ( oldMapnumberSub0_5W - 1 ) / 2 - 1;
1556         }
1557         /// <summary>
1558         /// Old mapnumber to new mapnumber calculate 0_5W column number
1559         /// </summary>
1560         private int OldToNew0_5W_C( int oldMapnumberSub0_5W , int new1C ) {
1561             return 2 * new1C + ( oldMapnumberSub0_5W + 1 ) % 2 - 1;
1562         }
1563 
1564         #endregion
1565 
1566         #endregion
1567 
1568         #region New mapnumber to old mapnumber      新图号转旧图号
1569 
1570         /// <summary>
1571         /// New mapnumber to old mapnumber 
1572         /// 新图幅号转旧图幅号
1573         /// </summary>
1574         /// <param name="newMapnumber"></param>
1575         /// <returns></returns>
1576         public string NewMapnumberToOldMapnumber( string newMapnumber ) {
1577             try {
1578                 if ( !NewMapnumber_Check( newMapnumber ) ) {
1579                     return "";
1580                 }
1581                 string[] newMapnumberInfo = GetInfoFromNewMapnumber( newMapnumber );
1582                 if ( newMapnumberInfo == null ) {
1583                     return "";
1584                 }
1585                 string n100WR = newMapnumberInfo[0];
1586                 string n100WC = newMapnumberInfo[1];
1587                 string nScaleStr = newMapnumberInfo[2];
1588                 string nR = newMapnumberInfo[3];
1589                 string nC = newMapnumberInfo[4];
1590                 int scaleNumber = NewMapnumber_GetScaleDenominatorNumberByScaleStr( nScaleStr );
1591                 if ( scaleNumber == -1 ) {
1592                     return null;
1593                 }
1594                 #region 100万
1595                 else if ( scaleNumber == 1000000 ) {
1596                     return NewMapnumberToOldMapnumber_100W( n100WR , n100WC );
1597                 }
1598                 #endregion
1599                 #region 50万
1600                 else if ( scaleNumber == 500000 ) {
1601                     string o100W = NewMapnumberToOldMapnumber_100W( n100WR , n100WC );
1602                     int o50W = NewToOld50WNum( nR , nC );
1603                     string o50WStr = OldMapnumber_Change1234ToABCD( o50W );
1604                     if ( string. IsNullOrEmpty( o50WStr ) ) {
1605                         return "";
1606                     }
1607                     return o100W + "-" + o50WStr;
1608                 }
1609                 #endregion
1610                 #region 25万
1611                 else if ( scaleNumber == 250000 ) {
1612                     string o100W = NewMapnumberToOldMapnumber_100W( n100WR , n100WC );
1613                     int o25W = NewToOld25WNum( nR , nC );
1614                     if ( o25W <= 0 || o25W > 16 ) {
1615                         return "";
1616                     }
1617                     return o100W + "-[" + o25W. ToString( "00" ) + "]";
1618                 }
1619                 #endregion
1620                 #region 10万
1621                 else if ( scaleNumber == 100000 ) {
1622                     string o100W = NewMapnumberToOldMapnumber_100W( n100WR , n100WC );
1623                     int o10W = NewToOld10WNum( nR , nC );
1624                     if ( o10W <= 0 || o10W > 144 ) {
1625                         return "";
1626                     }
1627                     return o100W + "-" + o10W. ToString( "000" );
1628                 }
1629                 #endregion
1630                 #region 5万
1631                 else if ( scaleNumber == 50000 ) {
1632                     string o100W = NewMapnumberToOldMapnumber_100W( n100WR , n100WC );
1633                     int o5W = NewToOld5WNum( nR , nC );
1634                     string o5WStr = OldMapnumber_Change1234ToABCD( o5W );
1635                     if ( string. IsNullOrEmpty( o5WStr ) ) {
1636                         return "";
1637                     }
1638                     int n10WR = New5WRCToNew10WRC( int. Parse( nR ) );
1639                     int n10WC = New5WRCToNew10WRC( int. Parse( nC ) );
1640                     int o10W = NewToOld10WNum( n10WR. ToString() , n10WC. ToString() );
1641                     if ( o10W <= 0 || o10W > 144 ) {
1642                         return "";
1643                     }
1644                     return o100W + "-" + o10W. ToString( "000" ) + "-" + o5WStr;
1645                 }
1646                 #endregion
1647                 #region 2.5万
1648                 else if ( scaleNumber == 25000 ) {
1649                     string o100W = NewMapnumberToOldMapnumber_100W( n100WR , n100WC );
1650                     int o2_5W = NewToOld2_5WNum( nR , nC );
1651                     if ( o2_5W <= 0 || o2_5W > 4 ) {
1652                         return "";
1653                     }
1654                     int n5WR = New2_5WRCToNew5WRC( int. Parse( nR ) );
1655                     int n5WC = New2_5WRCToNew5WRC( int. Parse( nC ) );
1656                     int o5W = NewToOld5WNum( n5WR. ToString() , n5WC. ToString() );
1657                     string o5WStr = OldMapnumber_Change1234ToABCD( o5W );
1658                     if ( string. IsNullOrEmpty( o5WStr ) ) {
1659                         return "";
1660                     }
1661                     int n10WR = New5WRCToNew10WRC( n5WR );
1662                     int n10WC = New5WRCToNew10WRC( n5WC );
1663                     int o10W = NewToOld10WNum( n10WR. ToString() , n10WC. ToString() );
1664                     if ( o10W <= 0 || o10W > 144 ) {
1665                         return "";
1666                     }
1667 
1668                     return o100W + "-" + o10W. ToString( "000" ) + "-" + o5WStr + "-" + o2_5W. ToString();
1669                 }
1670                 #endregion
1671                 #region 1万
1672                 else if ( scaleNumber == 10000 ) {
1673                     string o100W = NewMapnumberToOldMapnumber_100W( n100WR , n100WC );
1674                     int o1W = NewToOld1WNum( nR , nC );
1675                     if ( o1W <= 0 || o1W > 64 ) {
1676                         return "";
1677                     }
1678                     int n10WR = New1WRCToNew10WRC( int. Parse( nR ) );
1679                     int n10WC = New1WRCToNew10WRC( int. Parse( nC ) );
1680                     int o10W = NewToOld10WNum( n10WR. ToString() , n10WC. ToString() );
1681                     if ( o10W <= 0 || o10W > 144 ) {
1682                         return "";
1683                     }
1684                     return o100W + "-" + o10W. ToString( "000" ) + "-(" + o1W. ToString( "00" ) + ")";
1685                 }
1686                 #endregion
1687                 #region 5000
1688                 else if ( scaleNumber == 5000 ) {
1689                     string o100W = NewMapnumberToOldMapnumber_100W( n100WR , n100WC );
1690                     int o0_5W = NewToOld0_5WNum( nR , nC );
1691                     string o0_5WStr = OldMapnumber_Change1234Toabcd( o0_5W );
1692                     if ( string. IsNullOrEmpty( o0_5WStr ) ) {
1693                         return "";
1694                     }
1695                     int n1WR = New0_5WRCToNew1WRC( int. Parse( nR ) );
1696                     int n1WC = New0_5WRCToNew1WRC( int. Parse( nC ) );
1697                     int o1W = NewToOld1WNum( n1WR. ToString() , n1WC. ToString() );
1698                     if ( o1W <= 0 || o1W > 64 ) {
1699                         return "";
1700                     }
1701                     int n10WR = New1WRCToNew10WRC( n1WR );
1702                     int n10WC = New1WRCToNew10WRC( n1WC );
1703                     int o10W = NewToOld10WNum( n10WR. ToString() , n10WC. ToString() );
1704                     if ( o10W <= 0 || o10W > 144 ) {
1705                         return "";
1706                     }
1707                     return o100W + "-" + o10W. ToString( "000" ) + "-(" + o1W. ToString( "00" ) + ")-" + o0_5WStr;
1708                 }
1709                 #endregion
1710                 else {
1711                     return null;
1712                 }
1713             } catch {
1714                 throw;
1715             }
1716         }
1717 
1718         /// <summary>
1719         /// New mapnumber to old mapnumber 100W
1720         /// </summary>
1721         /// <param name="newMapnumber100WR"></param>
1722         /// <param name="newMapnumber100WC"></param>
1723         /// <returns></returns>
1724         private string NewMapnumberToOldMapnumber_100W( string newMapnumber100WR , string newMapnumber100WC ) {
1725             return newMapnumber100WR + "-" + newMapnumber100WC;
1726         }
1727 
1728         #region New mapnumber to old mapnumber calculate row column num      新转旧计算行列号
1729 
1730         /// <summary>
1731         /// New mapnumber to old mapnumber calculate num 50W
1732         /// </summary>
1733         private int NewToOld50WNum( string newMapnumber50WR , string newMapnumber50WC ) {
1734             int n50WR = int. Parse( newMapnumber50WR );
1735             int n50WC = int. Parse( newMapnumber50WC );
1736             return 2 * ( n50WR - 1 ) + n50WC;
1737         }
1738 
1739         /// <summary>
1740         /// New mapnumber to old mapnumber calculate num 25W
1741         /// </summary>
1742         private int NewToOld25WNum( string newMapnumber25WR , string newMapnumber25WC ) {
1743             int n25WR = int. Parse( newMapnumber25WR );
1744             int n25WC = int. Parse( newMapnumber25WC );
1745             return 4 * ( n25WR - 1 ) + n25WC;
1746         }
1747 
1748         /// <summary>
1749         /// New mapnumber to old mapnumber calculate num 10W
1750         /// </summary>
1751         private int NewToOld10WNum( string newMapnumber10WR , string newMapnumber10WC ) {
1752             int n10WR = int. Parse( newMapnumber10WR );
1753             int n10WC = int. Parse( newMapnumber10WC );
1754             return 12 * ( n10WR - 1 ) + n10WC;
1755         }
1756 
1757         /// <summary>
1758         /// New mapnumber to old mapnumber calculate num 5W
1759         /// </summary>
1760         private int NewToOld5WNum( string newMapnumber5WR , string newMapnumber5WC ) {
1761             int n5WR = int. Parse( newMapnumber5WR );
1762             int n5WC = int. Parse( newMapnumber5WC );
1763             return 2 * n5WR + n5WC - ( 4 * ( (int) ( n5WR - 1 ) / 2 ) ) - ( 2 * ( (int) ( n5WC - 1 ) / 2 ) ) - 2;
1764         }
1765 
1766         /// <summary>
1767         /// New mapnumber to old mapnumber calculate num 2.5W
1768         /// </summary>
1769         private int NewToOld2_5WNum( string newMapnumber2_5WR , string newMapnumber2_5WC ) {
1770             int n2_5WR = int. Parse( newMapnumber2_5WR );
1771             int n2_5WC = int. Parse( newMapnumber2_5WC );
1772             return 2 * n2_5WR + n2_5WC - ( 4 * ( (int) ( n2_5WR - 1 ) / 2 ) ) - ( 2 * ( (int) ( n2_5WC - 1 ) / 2 ) ) - 2;
1773         }
1774 
1775         /// <summary>
1776         /// New mapnumber to old mapnumber calculate num 1W
1777         /// </summary>
1778         private int NewToOld1WNum( string newMapnumber1WR , string newMapnumber1WC ) {
1779             int n1WR = int. Parse( newMapnumber1WR );
1780             int n1WC = int. Parse( newMapnumber1WC );
1781             return 8 * n1WR + n1WC - ( 64 * ( (int) ( n1WR - 1 ) / 8 ) ) - ( 8 * ( (int) ( n1WC - 1 ) / 8 ) ) - 8;
1782         }
1783 
1784         /// <summary>
1785         /// New mapnumber to old mapnumber calculate num 0.5W
1786         /// </summary>
1787         private int NewToOld0_5WNum( string newMapnumber0_5WR , string newMapnumber0_5WC ) {
1788             int n0_5WR = int. Parse( newMapnumber0_5WR );
1789             int n0_5WC = int. Parse( newMapnumber0_5WC );
1790             return 2 * n0_5WR + n0_5WC - ( 4 * ( (int) ( n0_5WR - 1 ) / 2 ) ) - ( 2 * ( (int) ( n0_5WC - 1 ) / 2 ) ) - 2;
1791         }
1792 
1793         /// <summary>
1794         /// 5W New mapnumber row column number to 10W new mapnumber row column 
1795         /// </summary>
1796         /// <param name="newMapnumber5WRC"></param>
1797         /// <returns></returns>
1798         private int New5WRCToNew10WRC( int newMapnumber5WRC ) {
1799             return (int) ( ( newMapnumber5WRC - 1 ) / 2 ) + 1;
1800         }
1801 
1802         private int New2_5WRCToNew5WRC( int newMapnumber2_5WRC ) {
1803             return (int) ( ( newMapnumber2_5WRC - 1 ) / 2 ) + 1;
1804         }
1805 
1806         private int New1WRCToNew10WRC( int newMapnumber1WRC ) {
1807             return (int) ( ( newMapnumber1WRC - 1 ) / 8 ) + 1;
1808         }
1809 
1810         private int New0_5WRCToNew1WRC( int newMapnumber0_5WRC ) {
1811             return (int) ( ( newMapnumber0_5WRC - 1 ) / 2 ) + 1;
1812         }
1813 
1814         #endregion
1815 
1816         #endregion
1817 
1818         #region New mapnumber to new mapnumber      新图号转新图号
1819 
1820         /// <summary>
1821         /// Newmapnumber to newmapnumber
1822         /// 新图号转新图号
1823         /// </summary>
1824         /// <param name="newMapnumber"></param>
1825         /// <returns></returns>
1826         public string NewMapnumberToNewMapnumber( string newMapnumber ) {
1827             if ( NewMapnumber_Check( newMapnumber ) ) {
1828                 return newMapnumber;
1829             }
1830 
1831             newMapnumber = newMapnumber. ToUpper();
1832             if ( NewMapnumber_Check( newMapnumber ) ) {
1833                 return newMapnumber;
1834             }
1835 
1836             return "";
1837         }
1838 
1839         #endregion
1840 
1841         #region Old mapnumber to old mapnumber      旧图号转旧图号
1842 
1843         /// <summary>
1844         /// Old mapnumber to old mapnumber
1845         /// 旧图号转旧图号
1846         /// </summary>
1847         /// <param name="oldMapnumber"></param>
1848         /// <param name="scaleDenominator"></param>
1849         /// <returns></returns>
1850         public string OldMapnumberToOldMapnumber( string oldMapnumber , int scaleDenominator ) {
1851             if ( scaleDenominator == 1000000 ) {
1852                 return OldMapnumberToOldMapnumber100W( oldMapnumber );
1853             } else if ( scaleDenominator == 500000 ) {
1854                 return OldMapnumberToOldMapnumber50W( oldMapnumber );
1855             } else if ( scaleDenominator == 250000 ) {
1856                 return OldMapnumberToOldMapnumber25W( oldMapnumber );
1857             } else if ( scaleDenominator == 100000 ) {
1858                 return OldMapnumberToOldMapnumber10W( oldMapnumber );
1859             } else if ( scaleDenominator == 50000 ) {
1860                 return OldMapnumberToOldMapnumber5W( oldMapnumber );
1861             } else if ( scaleDenominator == 25000 ) {
1862                 return OldMapnumberToOldMapnumber2_5W( oldMapnumber );
1863             } else if ( scaleDenominator == 10000 ) {
1864                 return OldMapnumberToOldMapnumber1W( oldMapnumber );
1865             } else if ( scaleDenominator == 5000 ) {
1866                 return OldMapnumberToOldMapnumber0_5W( oldMapnumber );
1867             } else {
1868                 return "";
1869             }
1870         }
1871 
1872         /// <summary>
1873         /// Change old mapnumber char 
1874         /// </summary>
1875         /// <param name="oldMapnumber"></param>
1876         /// <returns></returns>
1877         private string ChangeOldMapnumberChar( string oldMapnumber ) {
1878             oldMapnumber = oldMapnumber. Replace( "(" , "" );
1879             oldMapnumber = oldMapnumber. Replace( ")" , "" );
1880             oldMapnumber = oldMapnumber. Replace( "" , "" );
1881             oldMapnumber = oldMapnumber. Replace( "" , "" );
1882             oldMapnumber = oldMapnumber. Replace( "" , "" );
1883             oldMapnumber = oldMapnumber. Replace( "" , "" );
1884             oldMapnumber = oldMapnumber. Replace( "" , "1" );
1885             oldMapnumber = oldMapnumber. Replace( "" , "2" );
1886             oldMapnumber = oldMapnumber. Replace( "" , "3" );
1887             oldMapnumber = oldMapnumber. Replace( "" , "4" );
1888             oldMapnumber = oldMapnumber. Replace( "A" , "1" );
1889             oldMapnumber = oldMapnumber. Replace( "B" , "2" );
1890             oldMapnumber = oldMapnumber. Replace( "C" , "3" );
1891             oldMapnumber = oldMapnumber. Replace( "D" , "4" );
1892             oldMapnumber = oldMapnumber. Replace( "a" , "1" );
1893             oldMapnumber = oldMapnumber. Replace( "b" , "2" );
1894             oldMapnumber = oldMapnumber. Replace( "c" , "3" );
1895             oldMapnumber = oldMapnumber. Replace( "d" , "4" );
1896 
1897             oldMapnumber = oldMapnumber. ToUpper();
1898             foreach ( string m100WR in _100W_RowNum ) {
1899                 oldMapnumber = oldMapnumber. Replace( m100WR , Change100W_RowStringToDigital( m100WR ). ToString() );
1900             }
1901             return oldMapnumber;
1902         }
1903 
1904         /// <summary>
1905         /// Old mapnumber to old mapnumber 100W
1906         /// </summary>
1907         private string OldMapnumberToOldMapnumber100W( string oldMapnumber100W ) {
1908             if ( string. IsNullOrEmpty( oldMapnumber100W ) ) {
1909                 return "";
1910             }
1911             if ( OldMapnumber_Check100W( oldMapnumber100W ) ) {
1912                 return oldMapnumber100W;
1913             }
1914 
1915             oldMapnumber100W = ChangeOldMapnumberChar( oldMapnumber100W );
1916             if ( !oldMapnumber100W. Contains( '-' ) ) {
1917                 return "";
1918             }
1919             string[] split = oldMapnumber100W. Split( new char[] { '-' } , StringSplitOptions. RemoveEmptyEntries );
1920             int length = split. Length;
1921             if ( length != 2 ) {
1922                 return "";
1923             }
1924 
1925             int x100R = -1;
1926             if ( !int. TryParse( split[0] , out x100R ) ) {
1927                 return "";
1928             }
1929             int x100C = -1;
1930             if ( !int. TryParse( split[1] , out x100C ) ) {
1931                 return "";
1932             }
1933 
1934             string s100R = Change100W_RowDigitalToString( x100R );
1935             string s100C = x100C. ToString( "00" );
1936             oldMapnumber100W = s100R + "-" + s100C;
1937             if ( OldMapnumber_Check100W( oldMapnumber100W ) ) {
1938                 return oldMapnumber100W;
1939             }
1940             return "";
1941         }
1942 
1943         /// <summary>
1944         /// Old mapnumber to old mapnumber 50W
1945         /// </summary>
1946         private string OldMapnumberToOldMapnumber50W( string oldMapnumber50W ) {
1947             if ( string. IsNullOrEmpty( oldMapnumber50W ) ) {
1948                 return "";
1949             }
1950             if ( OldMapnumber_Check50W( oldMapnumber50W ) ) {
1951                 return oldMapnumber50W;
1952             }
1953 
1954             oldMapnumber50W = ChangeOldMapnumberChar( oldMapnumber50W );
1955             if ( !oldMapnumber50W. Contains( '-' ) ) {
1956                 return "";
1957             }
1958             string[] split = oldMapnumber50W. Split( new char[] { '-' } , StringSplitOptions. RemoveEmptyEntries );
1959             int length = split. Length;
1960             if ( length != 3 ) {
1961                 return "";
1962             }
1963             string x100 = split[0] + "-" + split[1];
1964             string s100 = OldMapnumberToOldMapnumber100W( x100 );
1965             if ( string. IsNullOrEmpty( s100 ) ) {
1966                 return "";
1967             }
1968 
1969             int x50 = -1;
1970             if ( !int. TryParse( split[2] , out x50 ) ) {
1971                 return "";
1972             }
1973             string s50 = OldMapnumber_Change1234ToABCD( x50 );
1974             oldMapnumber50W = s100 + "-" + s50;
1975             if ( OldMapnumber_Check50W( oldMapnumber50W ) ) {
1976                 return oldMapnumber50W;
1977             }
1978             return "";
1979         }
1980 
1981         /// <summary>
1982         /// Old mapnumber to old mapnumber 25W
1983         /// </summary>
1984         private string OldMapnumberToOldMapnumber25W( string oldMapnumber25W ) {
1985             if ( string. IsNullOrEmpty( oldMapnumber25W ) ) {
1986                 return "";
1987             }
1988             if ( OldMapnumber_Check25W( oldMapnumber25W ) ) {
1989                 return oldMapnumber25W;
1990             }
1991 
1992             oldMapnumber25W = ChangeOldMapnumberChar( oldMapnumber25W );
1993             if ( !oldMapnumber25W. Contains( '-' ) ) {
1994                 return "";
1995             }
1996             string[] split = oldMapnumber25W. Split( new char[] { '-' } , StringSplitOptions. RemoveEmptyEntries );
1997             int length = split. Length;
1998             if ( length != 3 ) {
1999                 return "";
2000             }
2001             string x100 = split[0] + "-" + split[1];
2002             string s100 = OldMapnumberToOldMapnumber100W( x100 );
2003             if ( string. IsNullOrEmpty( s100 ) ) {
2004                 return "";
2005             }
2006 
2007             int x25 = -1;
2008             if ( !int. TryParse( split[2] , out x25 ) ) {
2009                 return "";
2010             }
2011             string s25 = x25. ToString( "00" );
2012             oldMapnumber25W = s100 + "-[" + s25 + "]";
2013             if ( OldMapnumber_Check25W( oldMapnumber25W ) ) {
2014                 return oldMapnumber25W;
2015             }
2016             return "";
2017         }
2018 
2019         /// <summary>
2020         /// Old mapnumber to old mapnumber 10W
2021         /// </summary>
2022         private string OldMapnumberToOldMapnumber10W( string oldMapnumber10W ) {
2023             if ( string. IsNullOrEmpty( oldMapnumber10W ) ) {
2024                 return "";
2025             }
2026             if ( OldMapnumber_Check10W( oldMapnumber10W ) ) {
2027                 return oldMapnumber10W;
2028             }
2029 
2030             oldMapnumber10W = ChangeOldMapnumberChar( oldMapnumber10W );
2031             if ( !oldMapnumber10W. Contains( '-' ) ) {
2032                 return "";
2033             }
2034             string[] split = oldMapnumber10W. Split( new char[] { '-' } , StringSplitOptions. RemoveEmptyEntries );
2035             int length = split. Length;
2036             if ( length != 3 ) {
2037                 return "";
2038             }
2039             string x100 = split[0] + "-" + split[1];
2040             string s100 = OldMapnumberToOldMapnumber100W( x100 );
2041             if ( string. IsNullOrEmpty( s100 ) ) {
2042                 return "";
2043             }
2044 
2045             int x10 = -1;
2046             if ( !int. TryParse( split[2] , out x10 ) ) {
2047                 return "";
2048             }
2049             string s10 = x10. ToString( "000" );
2050             oldMapnumber10W = s100 + "-" + s10;
2051             if ( OldMapnumber_Check10W( oldMapnumber10W ) ) {
2052                 return oldMapnumber10W;
2053             }
2054             return "";
2055         }
2056 
2057         /// <summary>
2058         /// Old mapnumber to old mapnumber 5W
2059         /// </summary>
2060         private string OldMapnumberToOldMapnumber5W( string oldMapnumber5W ) {
2061             if ( string. IsNullOrEmpty( oldMapnumber5W ) ) {
2062                 return "";
2063             }
2064             if ( OldMapnumber_Check5W( oldMapnumber5W ) ) {
2065                 return oldMapnumber5W;
2066             }
2067 
2068             oldMapnumber5W = ChangeOldMapnumberChar( oldMapnumber5W );
2069             if ( !oldMapnumber5W. Contains( '-' ) ) {
2070                 return "";
2071             }
2072             string[] split = oldMapnumber5W. Split( new char[] { '-' } , StringSplitOptions. RemoveEmptyEntries );
2073             int length = split. Length;
2074             if ( length != 4 ) {
2075                 return "";
2076             }
2077             string x10 = split[0] + "-" + split[1] + "-" + split[2];
2078             string s10 = OldMapnumberToOldMapnumber10W( x10 );
2079             if ( string. IsNullOrEmpty( s10 ) ) {
2080                 return "";
2081             }
2082 
2083             int x5 = -1;
2084             if ( !int. TryParse( split[3] , out x5 ) ) {
2085                 return "";
2086             }
2087             string s5 = OldMapnumber_Change1234ToABCD( x5 );
2088             oldMapnumber5W = s10 + "-" + s5;
2089             if ( OldMapnumber_Check5W( oldMapnumber5W ) ) {
2090                 return oldMapnumber5W;
2091             }
2092             return "";
2093         }
2094 
2095         /// <summary>
2096         /// Old mapnumber to old mapnumber 2.5W
2097         /// </summary>
2098         private string OldMapnumberToOldMapnumber2_5W( string oldMapnumber2_5W ) {
2099             if ( string. IsNullOrEmpty( oldMapnumber2_5W ) ) {
2100                 return "";
2101             }
2102             if ( OldMapnumber_Check2_5W( oldMapnumber2_5W ) ) {
2103                 return oldMapnumber2_5W;
2104             }
2105 
2106             oldMapnumber2_5W = ChangeOldMapnumberChar( oldMapnumber2_5W );
2107             if ( !oldMapnumber2_5W. Contains( '-' ) ) {
2108                 return "";
2109             }
2110             string[] split = oldMapnumber2_5W. Split( new char[] { '-' } , StringSplitOptions. RemoveEmptyEntries );
2111             int length = split. Length;
2112             if ( length != 5 ) {
2113                 return "";
2114             }
2115             string x5 = split[0] + "-" + split[1] + "-" + split[2] + "-" + split[3];
2116             string s5 = OldMapnumberToOldMapnumber5W( x5 );
2117             if ( string. IsNullOrEmpty( s5 ) ) {
2118                 return "";
2119             }
2120 
2121             int x2_5 = -1;
2122             if ( !int. TryParse( split[4] , out x2_5 ) ) {
2123                 return "";
2124             }
2125             string s2_5 = x2_5. ToString();
2126             oldMapnumber2_5W = s5 + "-" + s2_5;
2127             if ( OldMapnumber_Check2_5W( oldMapnumber2_5W ) ) {
2128                 return oldMapnumber2_5W;
2129             }
2130             return "";
2131         }
2132 
2133         /// <summary>
2134         /// Old mapnumber to old mapnumber 1W
2135         /// </summary>
2136         private string OldMapnumberToOldMapnumber1W( string oldMapnumber1W ) {
2137             if ( string. IsNullOrEmpty( oldMapnumber1W ) ) {
2138                 return "";
2139             }
2140             if ( OldMapnumber_Check1W( oldMapnumber1W ) ) {
2141                 return oldMapnumber1W;
2142             }
2143 
2144             oldMapnumber1W = ChangeOldMapnumberChar( oldMapnumber1W );
2145             if ( !oldMapnumber1W. Contains( '-' ) ) {
2146                 return "";
2147             }
2148             string[] split = oldMapnumber1W. Split( new char[] { '-' } , StringSplitOptions. RemoveEmptyEntries );
2149             int length = split. Length;
2150             if ( length != 4 ) {
2151                 return "";
2152             }
2153             string x10 = split[0] + "-" + split[1] + "-" + split[2];
2154             string s10 = OldMapnumberToOldMapnumber10W( x10 );
2155             if ( string. IsNullOrEmpty( s10 ) ) {
2156                 return "";
2157             }
2158 
2159             int x1 = -1;
2160             if ( !int. TryParse( split[3] , out x1 ) ) {
2161                 return "";
2162             }
2163             string s1 = x1. ToString( "00" );
2164             oldMapnumber1W = s10 + "-(" + s1 + ")";
2165             if ( OldMapnumber_Check1W( oldMapnumber1W ) ) {
2166                 return oldMapnumber1W;
2167             }
2168             return "";
2169         }
2170 
2171         /// <summary>
2172         /// Old mapnumber to old mapnumber 0.5W
2173         /// </summary>
2174         private string OldMapnumberToOldMapnumber0_5W( string oldMapnumber0_5W ) {
2175             if ( string. IsNullOrEmpty( oldMapnumber0_5W ) ) {
2176                 return "";
2177             }
2178             if ( OldMapnumber_Check0_5W( oldMapnumber0_5W ) ) {
2179                 return oldMapnumber0_5W;
2180             }
2181 
2182             oldMapnumber0_5W = ChangeOldMapnumberChar( oldMapnumber0_5W );
2183             if ( !oldMapnumber0_5W. Contains( '-' ) ) {
2184                 return "";
2185             }
2186             string[] split = oldMapnumber0_5W. Split( new char[] { '-' } , StringSplitOptions. RemoveEmptyEntries );
2187             int length = split. Length;
2188             if ( length != 5 ) {
2189                 return "";
2190             }
2191             string x1 = split[0] + "-" + split[1] + "-" + split[2] + "-(" + split[3] + ")";
2192             string s1 = OldMapnumberToOldMapnumber1W( x1 );
2193             if ( string. IsNullOrEmpty( s1 ) ) {
2194                 return "";
2195             }
2196 
2197             int x0_5 = -1;
2198             if ( !int. TryParse( split[4] , out x0_5 ) ) {
2199                 return "";
2200             }
2201             string s0_5 = OldMapnumber_Change1234Toabcd( x0_5 );
2202             oldMapnumber0_5W = s1 + "-" + s0_5;
2203             if ( OldMapnumber_Check0_5W( oldMapnumber0_5W ) ) {
2204                 return oldMapnumber0_5W;
2205             }
2206             return "";
2207         }
2208 
2209         #endregion
2210 
2211 
2212         #endregion
2213 
2214 
2215         #region Exchange between mapnumber and coordinate       图幅号和坐标的转换
2216 
2217         #region Mapnumber to coordinate     图号转坐标
2218 
2219         #region New mapnumber to coordinate     新图号转坐标
2220 
2221         /// <summary>
2222         /// Calculate West North East South coordinate from new mapnumber
2223         /// 从新图幅号计算图廓“西北东南”坐标([0]W [1]N [2]E [3]S)
2224         /// </summary>
2225         /// <param name="newMapnumber"></param>
2226         /// <returns></returns>
2227         public decimal[] CalculateLongitudeLatitudeFromNewMapnumber( string newMapnumber ) {
2228             try {
2229                 decimal[] WNES = new decimal[4];
2230                 string[] newMapnumberInfo = GetInfoFromNewMapnumber( newMapnumber );
2231                 if ( newMapnumberInfo == null ) {
2232                     return null;
2233                 }
2234                 string n100WR = newMapnumberInfo[0];
2235                 string n100WC = newMapnumberInfo[1];
2236                 string nScaleStr = newMapnumberInfo[2];
2237                 string nR = newMapnumberInfo[3];
2238                 string nC = newMapnumberInfo[4];
2239                 int scaleNumber = NewMapnumber_GetScaleDenominatorNumberByScaleStr( nScaleStr );
2240                 if ( scaleNumber == -1 ) {
2241                     return null;
2242                 }
2243                 #region 100万
2244  else if ( scaleNumber == 1000000 ) {
2245                     decimal W = CalculateLongitudeLatitudeFromNewMapnumberWest( n100WC , _100W_LatitudeDifference , "0" , 0 );
2246                     decimal S = CalculateLongitudeLatitudeFromNewMapnumberSouth( n100WR , _100W_LongitudeDifference , "0" , 0 );
2247                     decimal N = S + _100W_LongitudeDifference;
2248                     decimal E = W + _100W_LatitudeDifference;
2249                     WNES[0] = W;
2250                     WNES[1] = N;
2251                     WNES[2] = E;
2252                     WNES[3] = S;
2253                     return WNES;
2254                 }
2255                 #endregion
2256                 #region 50万
2257  else if ( scaleNumber == 500000 ) {
2258                     decimal W = CalculateLongitudeLatitudeFromNewMapnumberWest( n100WC , _100W_LatitudeDifference , nC , _50W_LongitudeDifference );
2259                     decimal S = CalculateLongitudeLatitudeFromNewMapnumberSouth( n100WR , _100W_LongitudeDifference , nR , _50W_LatitudeDifference );
2260                     decimal N = S + _50W_LatitudeDifference;
2261                     decimal E = W + _50W_LongitudeDifference;
2262                     WNES[0] = W;
2263                     WNES[1] = N;
2264                     WNES[2] = E;
2265                     WNES[3] = S;
2266                     return WNES;
2267                 }
2268                 #endregion
2269                 #region 25万
2270  else if ( scaleNumber == 250000 ) {
2271                     decimal W = CalculateLongitudeLatitudeFromNewMapnumberWest( n100WC , _100W_LatitudeDifference , nC , _25W_LongitudeDifference );
2272                     decimal S = CalculateLongitudeLatitudeFromNewMapnumberSouth( n100WR , _100W_LongitudeDifference , nR , _25W_LatitudeDifference );
2273                     decimal N = S + _25W_LatitudeDifference;
2274                     decimal E = W + _25W_LongitudeDifference;
2275                     WNES[0] = W;
2276                     WNES[1] = N;
2277                     WNES[2] = E;
2278                     WNES[3] = S;
2279                     return WNES;
2280                 }
2281                 #endregion
2282                 #region 10万
2283  else if ( scaleNumber == 100000 ) {
2284                     decimal W = CalculateLongitudeLatitudeFromNewMapnumberWest( n100WC , _100W_LatitudeDifference , nC , _10W_LongitudeDifference );
2285                     decimal S = CalculateLongitudeLatitudeFromNewMapnumberSouth( n100WR , _100W_LongitudeDifference , nR , _10W_LatitudeDifference );
2286                     decimal N = S + _10W_LatitudeDifference;
2287                     decimal E = W + _10W_LongitudeDifference;
2288                     WNES[0] = W;
2289                     WNES[1] = N;
2290                     WNES[2] = E;
2291                     WNES[3] = S;
2292                     return WNES;
2293                 }
2294                 #endregion
2295                 #region 5万
2296  else if ( scaleNumber == 50000 ) {
2297                     decimal W = CalculateLongitudeLatitudeFromNewMapnumberWest( n100WC , _100W_LatitudeDifference , nC , _5W_LongitudeDifference );
2298                     decimal S = CalculateLongitudeLatitudeFromNewMapnumberSouth( n100WR , _100W_LongitudeDifference , nR , _5W_LatitudeDifference );
2299                     decimal N = S + _5W_LatitudeDifference;
2300                     decimal E = W + _5W_LongitudeDifference;
2301                     WNES[0] = W;
2302                     WNES[1] = N;
2303                     WNES[2] = E;
2304                     WNES[3] = S;
2305                     return WNES;
2306                 }
2307                 #endregion
2308                 #region 2.5万
2309  else if ( scaleNumber == 25000 ) {
2310      decimal W = CalculateLongitudeLatitudeFromNewMapnumberWest( n100WC , _100W_LatitudeDifference , nC , _2_5W_LongitudeDifference );
2311                     decimal S = CalculateLongitudeLatitudeFromNewMapnumberSouth( n100WR , _100W_LongitudeDifference , nR , _2_5W_LatitudeDifference );
2312                     decimal N = S + _2_5W_LatitudeDifference;
2313                     decimal E = W + _2_5W_LongitudeDifference;
2314                     WNES[0] = W;
2315                     WNES[1] = N;
2316                     WNES[2] = E;
2317                     WNES[3] = S;
2318                     return WNES;
2319                 }
2320                 #endregion
2321                 #region 1万
2322  else if ( scaleNumber == 10000 ) {
2323                     decimal W = CalculateLongitudeLatitudeFromNewMapnumberWest( n100WC , _100W_LatitudeDifference , nC , _1W_LongitudeDifference );
2324                     decimal S = CalculateLongitudeLatitudeFromNewMapnumberSouth( n100WR , _100W_LongitudeDifference , nR , _1W_LatitudeDifference );
2325                     decimal N = S + _1W_LatitudeDifference;
2326                     decimal E = W + _1W_LongitudeDifference;
2327                     WNES[0] = W;
2328                     WNES[1] = N;
2329                     WNES[2] = E;
2330                     WNES[3] = S;
2331                     return WNES;
2332                 }
2333                 #endregion
2334                 #region 5000
2335  else if ( scaleNumber == 5000 ) {
2336                     decimal W = CalculateLongitudeLatitudeFromNewMapnumberWest( n100WC , _100W_LatitudeDifference , nC , _0_5W_LongitudeDifference );
2337                     decimal S = CalculateLongitudeLatitudeFromNewMapnumberSouth( n100WR , _100W_LongitudeDifference , nR , _0_5W_LatitudeDifference );
2338                     decimal N = S + _0_5W_LatitudeDifference;
2339                     decimal E = W + _0_5W_LongitudeDifference;
2340                     WNES[0] = W;
2341                     WNES[1] = N;
2342                     WNES[2] = E;
2343                     WNES[3] = S;
2344                     return WNES;
2345                 }
2346                 #endregion
2347                 #region 2000
2348  else if ( scaleNumber == 2000 ) {
2349                     decimal W = CalculateLongitudeLatitudeFromNewMapnumberWest( n100WC , _100W_LatitudeDifference , nC , _0_2W_LongitudeDifference );
2350                     decimal S = CalculateLongitudeLatitudeFromNewMapnumberSouth( n100WR , _100W_LongitudeDifference , nR , _0_2W_LatitudeDifference );
2351                     decimal N = S + _0_2W_LatitudeDifference;
2352                     decimal E = W + _0_2W_LongitudeDifference;
2353                     WNES[0] = W;
2354                     WNES[1] = N;
2355                     WNES[2] = E;
2356                     WNES[3] = S;
2357                     return WNES;
2358                 }
2359                 #endregion
2360                 #region 1000
2361  else if ( scaleNumber == 1000 ) {
2362                     decimal W = CalculateLongitudeLatitudeFromNewMapnumberWest( n100WC , _100W_LatitudeDifference , nC , _0_1W_LongitudeDifference );
2363                     decimal S = CalculateLongitudeLatitudeFromNewMapnumberSouth( n100WR , _100W_LongitudeDifference , nR , _0_1W_LatitudeDifference );
2364                     decimal N = S + _0_1W_LatitudeDifference;
2365                     decimal E = W + _0_1W_LongitudeDifference;
2366                     WNES[0] = W;
2367                     WNES[1] = N;
2368                     WNES[2] = E;
2369                     WNES[3] = S;
2370                     return WNES;
2371                 }
2372                 #endregion
2373                 #region 500
2374  else if ( scaleNumber == 500 ) {
2375                     decimal W = CalculateLongitudeLatitudeFromNewMapnumberWest( n100WC , _100W_LatitudeDifference , nC , _500_LongitudeDifference );
2376                     decimal S = CalculateLongitudeLatitudeFromNewMapnumberSouth( n100WR , _100W_LongitudeDifference , nR , _500_LatitudeDifference );
2377                     decimal N = S + _500_LatitudeDifference;
2378                     decimal E = W + _500_LongitudeDifference;
2379                     WNES[0] = W;
2380                     WNES[1] = N;
2381                     WNES[2] = E;
2382                     WNES[3] = S;
2383                     return WNES;
2384                 }
2385                 #endregion
2386  else {
2387                     return null;
2388                 }
2389             } catch {
2390                 throw;
2391             }
2392         }
2393 
2394         /// <summary>
2395         /// Calculate West coordinate from new mapnumber
2396         /// </summary>
2397         private decimal CalculateLongitudeLatitudeFromNewMapnumberWest( string newMapnumber_100W_Column , decimal newMapnumber_100W_LongitudeDifference ,
2398             string subColumn , decimal subLongitudeDifference ) {
2399             try {
2400                 if ( string. IsNullOrEmpty( newMapnumber_100W_Column ) ) {
2401                     return 0;
2402                 }
2403                 if ( string. IsNullOrEmpty( subColumn ) ) {
2404                     subColumn = "0";
2405                 }
2406                 decimal n100WC_d = decimal. Parse( newMapnumber_100W_Column );
2407                 decimal subC_d = decimal. Parse( subColumn );
2408                 decimal x = ( n100WC_d - 31 ) * newMapnumber_100W_LongitudeDifference + ( subC_d - 1 ) * subLongitudeDifference;
2409                 return x;
2410             } catch {
2411                 throw;
2412             }
2413         }
2414 
2415         /// <summary>
2416         /// Calculate South coordinate from new mapnumber
2417         /// </summary>
2418         private decimal CalculateLongitudeLatitudeFromNewMapnumberSouth( string newMapnumber_100W_Row , decimal newMapnumber_100W_LatitudeDifference , 
2419             string subRow , decimal subLatitudeDifference ) {
2420             try {
2421                 if ( string. IsNullOrEmpty( newMapnumber_100W_Row ) ) {
2422                     return 0;
2423                 }
2424                 if ( string. IsNullOrEmpty( subRow ) ) {
2425                     subRow = "0";
2426                 }
2427                 int n100WRInt = Change100W_RowStringToDigital( newMapnumber_100W_Row );
2428                 if ( n100WRInt == -1 ) {
2429                     return 0;
2430                 }
2431                 decimal n100WR_d = decimal. Parse( n100WRInt. ToString() );
2432                 decimal subR_d = decimal. Parse( subRow );
2433                 if ( subLatitudeDifference == 0M ) {
2434                     decimal x = ( n100WR_d - 1 ) * newMapnumber_100W_LatitudeDifference;
2435                     return x;
2436                 } else {
2437                     decimal x = ( n100WR_d - 1 ) * newMapnumber_100W_LatitudeDifference + ( newMapnumber_100W_LatitudeDifference / subLatitudeDifference - subR_d ) * subLatitudeDifference;
2438                     return x;
2439                 }
2440             } catch {
2441                 throw;
2442             }
2443         }
2444 
2445         #endregion
2446 
2447         #region Old mapnumber to coordinate     旧图号转坐标
2448 
2449         /// <summary>
2450         /// Calculate West North East South coordinate from old mapnumber
2451         /// 从旧图幅号计算图廓“西北东南”坐标([0]W [1]N [2]E [3]S)
2452         /// </summary>
2453         /// <param name="oldMapnumber"></param>
2454         /// <returns></returns>
2455         public decimal[] CalculateLongitudeLatitudeFromOldMapnumber( string oldMapnumber ) {
2456             try {
2457                 string newMapnumber = OldMapnumberToNewMapnumber( oldMapnumber );
2458                 if ( string. IsNullOrEmpty( newMapnumber ) ) {
2459                     return CalculateLongitudeLatitudeFromNewMapnumber( newMapnumber );
2460                 } else {
2461                     return CalculateLongitudeLatitudeFromOldMapnumber20W( oldMapnumber );
2462                 }
2463             } catch {
2464                 throw;
2465             }
2466         }
2467 
2468         /// <summary>
2469         /// Calculate West North East South coordinate from 20W old mapnumber
2470         /// 从20万旧图幅号计算图廓“西北东南”坐标([0]W [1]N [2]E [3]S)
2471         /// </summary>
2472         /// <param name="oldMapnumber20W"></param>
2473         /// <returns></returns>
2474         public decimal[] CalculateLongitudeLatitudeFromOldMapnumber20W( string oldMapnumber20W ) {
2475             try {
2476                 if ( !OldMapnumber_Check20W( oldMapnumber20W ) ) {
2477                     return null;
2478                 }
2479                 decimal[] WNES = new decimal[4];
2480                 string[] split = oldMapnumber20W. Split( new char[] { '-' } , StringSplitOptions. RemoveEmptyEntries );
2481                 string o100WR = split[0];
2482                 string o100WC = split[1];
2483                 string o20W = split[2];
2484                 string[] subSplit = o20W. Split( new char[] { '(' , ')' } , StringSplitOptions. RemoveEmptyEntries );
2485                 string o20WNum = subSplit[0];
2486                 decimal o100WW = CalculateLongitudeLatitudeFromNewMapnumberWest( o100WC , _100W_LatitudeDifference , "0" , 0 );
2487                 decimal o100WS = CalculateLongitudeLatitudeFromNewMapnumberSouth( o100WR , _100W_LongitudeDifference , "0" , 0 );
2488                 int i20WNum = int. Parse( o20WNum );
2489                 int o20WR = Old20WR( i20WNum );
2490                 int o20WC = Old20WC( i20WNum );
2491                 decimal W = o100WW + ( o20WC - 1 ) * _20W_LongitudeDifference;
2492                 decimal S = o100WS + ( oldMapnumber_20W_RCNum - o20WR ) * _20W_LatitudeDifference;
2493                 decimal N = S + _20W_LatitudeDifference;
2494                 decimal E = W + _20W_LongitudeDifference;
2495                 WNES[0] = W;
2496                 WNES[1] = N;
2497                 WNES[2] = E;
2498                 WNES[3] = S;
2499                 return WNES;
2500             } catch {
2501                 throw;
2502             }
2503         }
2504 
2505         private int Old20WR( int o20WNum ) {
2506             return ( ( o20WNum - 1 ) / oldMapnumber_20W_RCNum ) + 1;
2507         }
2508         private int Old20WC( int o20WNum ) {
2509             return ( ( o20WNum - 1 ) % oldMapnumber_20W_RCNum ) + 1;
2510         }
2511 
2512         #endregion
2513 
2514         #endregion
2515 
2516         #region Coordinate to mapnumber     坐标转图号
2517 
2518         #region Coordinate to new mapnumber     坐标转新图号
2519 
2520         /// <summary>
2521         /// Coordinate to new mapnumber
2522         /// 从经纬度计算所在新图幅号
2523         /// </summary>
2524         /// <param name="longitude">longitude/经度</param>
2525         /// <param name="latitude">latitude/纬度</param>
2526         /// <param name="scaleDenominator">scaleDenominator/比例尺分母</param>
2527         /// <returns></returns>
2528         public string CalculateNewMapnumberFromLongitudeLatitude( decimal longitude , decimal latitude , int scaleDenominator ) {
2529             try {
2530                 string newMapnumber_100W = CalculateNewMapnumberFromLongitudeLatitude100W( longitude , latitude );
2531                 if ( string. IsNullOrEmpty( newMapnumber_100W ) ) {
2532                     return "";
2533                 }
2534                 decimal[] longitudeLatitudeDifference = GetLongitudeLatitudeDifference( scaleDenominator );
2535                 decimal longitudeDifference = longitudeLatitudeDifference[0];
2536                 decimal latitudeDifference = longitudeLatitudeDifference[1];
2537 
2538                 int[] subRC = CalculateNewMapnumberRowColumnIn100WFromLongitudeLatitude( longitude , latitude , longitudeDifference , latitudeDifference );
2539                 string scaleStr = GetNewMapnumberScaleString( scaleDenominator );
2540                 string r = "";
2541                 string c = "";
2542                 if ( scaleStr == "J" || scaleStr == "K" ) {
2543                     r = subRC[0]. ToString( "0000" );
2544                     c = subRC[1]. ToString( "0000" );
2545                 } else {
2546                     r = subRC[0]. ToString( "000" );
2547                     c = subRC[1]. ToString( "000" );
2548                 }
2549                 if ( string. IsNullOrEmpty( scaleStr ) ) {
2550                     scaleStr = "";
2551                     r = "";
2552                     c = "";
2553                 }
2554                 string newMapnumber = newMapnumber_100W + scaleStr + r + c;
2555                 if ( NewMapnumber_Check( newMapnumber ) ) {
2556                     return newMapnumber;
2557                 } else {
2558                     return "";
2559                 }
2560             } catch {
2561                 throw;
2562             }
2563         }
2564 
2565         /// <summary>
2566         /// Coordinate to 100W new mapnumber
2567         /// 从经纬度计算所在100万新图幅号
2568         /// </summary>
2569         /// <param name="longitude"></param>
2570         /// <param name="latitude"></param>
2571         /// <returns></returns>
2572         public string CalculateNewMapnumberFromLongitudeLatitude100W( decimal longitude , decimal latitude ) {
2573             try {
2574                 int rNum = (int) ( latitude / _100W_LongitudeDifference ) + 1;
2575                 int cNum = (int) ( longitude / _100W_LatitudeDifference ) + 31;
2576                 string rStr = Change100W_RowDigitalToString( rNum );
2577                 string n100W = rStr + cNum. ToString( "00" );
2578                 if ( NewMapnumber_Check( n100W ) ) {
2579                     return n100W;
2580                 } else {
2581                     return "";
2582                 }
2583             } catch {
2584                 throw;
2585             }
2586         }
2587 
2588         /// <summary>
2589         /// Coordinate to 50W new mapnumber
2590         /// 从经纬度计算所在50万新图幅号
2591         /// </summary>
2592         /// <param name="longitude"></param>
2593         /// <param name="latitude"></param>
2594         /// <returns></returns>
2595         public string CalculateNewMapnumberFromLongitudeLatitude50W( decimal longitude , decimal latitude ) {
2596             try {
2597                 string n100W = CalculateNewMapnumberFromLongitudeLatitude100W( longitude , latitude );
2598                 if ( string. IsNullOrEmpty( n100W ) ) {
2599                     return "";
2600                 }
2601                 int[] subRC = CalculateNewMapnumberRowColumnIn100WFromLongitudeLatitude( longitude , latitude , _50W_LongitudeDifference , _50W_LatitudeDifference );
2602                 string r = subRC[0]. ToString( "000" );
2603                 string c = subRC[1]. ToString( "000" );
2604                 string n50W = n100W + "B" + r + c;
2605                 if ( NewMapnumber_Check( n50W ) ) {
2606                     return n50W;
2607                 } else {
2608                     return "";
2609                 }
2610             } catch {
2611                 throw;
2612             }
2613         }
2614 
2615         /// <summary>
2616         /// Coordinate to 25W new mapnumber
2617         /// 从经纬度计算所在25万新图幅号
2618         /// </summary>
2619         /// <param name="longitude"></param>
2620         /// <param name="latitude"></param>
2621         /// <returns></returns>
2622         public string CalculateNewMapnumberFromLongitudeLatitude25W( decimal longitude , decimal latitude ) {
2623             try {
2624                 string n100W = CalculateNewMapnumberFromLongitudeLatitude100W( longitude , latitude );
2625                 if ( string. IsNullOrEmpty( n100W ) ) {
2626                     return "";
2627                 }
2628                 int[] subRC = CalculateNewMapnumberRowColumnIn100WFromLongitudeLatitude( longitude , latitude , _25W_LongitudeDifference , _25W_LatitudeDifference );
2629                 string r = subRC[0]. ToString( "000" );
2630                 string c = subRC[1]. ToString( "000" );
2631                 string n25W = n100W + "C" + r + c;
2632                 if ( NewMapnumber_Check( n25W ) ) {
2633                     return n25W;
2634                 } else {
2635                     return "";
2636                 }
2637             } catch {
2638                 throw;
2639             }
2640         }
2641 
2642         /// <summary>
2643         /// Coordinate to 10W new mapnumber
2644         /// 从经纬度计算所在10万新图幅号
2645         /// </summary>
2646         /// <param name="longitude"></param>
2647         /// <param name="latitude"></param>
2648         /// <returns></returns>
2649         public string CalculateNewMapnumberFromLongitudeLatitude10W( decimal longitude , decimal latitude ) {
2650             try {
2651                 string n100W = CalculateNewMapnumberFromLongitudeLatitude100W( longitude , latitude );
2652                 if ( string. IsNullOrEmpty( n100W ) ) {
2653                     return "";
2654                 }
2655                 int[] subRC = CalculateNewMapnumberRowColumnIn100WFromLongitudeLatitude( longitude , latitude , _10W_LongitudeDifference , _10W_LatitudeDifference );
2656                 string r = subRC[0]. ToString( "000" );
2657                 string c = subRC[1]. ToString( "000" );
2658                 string n10W = n100W + "D" + r + c;
2659                 if ( NewMapnumber_Check( n10W ) ) {
2660                     return n10W;
2661                 } else {
2662                     return "";
2663                 }
2664             } catch {
2665                 throw;
2666             }
2667         }
2668 
2669         /// <summary>
2670         /// Coordinate to 5W new mapnumber
2671         /// 从经纬度计算所在5万新图幅号
2672         /// </summary>
2673         /// <param name="longitude"></param>
2674         /// <param name="latitude"></param>
2675         /// <returns></returns>
2676         public string CalculateNewMapnumberFromLongitudeLatitude5W( decimal longitude , decimal latitude ) {
2677             try {
2678                 string n100W = CalculateNewMapnumberFromLongitudeLatitude100W( longitude , latitude );
2679                 if ( string. IsNullOrEmpty( n100W ) ) {
2680                     return "";
2681                 }
2682                 int[] subRC = CalculateNewMapnumberRowColumnIn100WFromLongitudeLatitude( longitude , latitude , _5W_LongitudeDifference , _5W_LatitudeDifference );
2683                 string r = subRC[0]. ToString( "000" );
2684                 string c = subRC[1]. ToString( "000" );
2685                 string n5W = n100W + "E" + r + c;
2686                 if ( NewMapnumber_Check( n5W ) ) {
2687                     return n5W;
2688                 } else {
2689                     return "";
2690                 }
2691             } catch {
2692                 throw;
2693             }
2694         }
2695 
2696         /// <summary>
2697         /// Coordinate to 2.5W new mapnumber
2698         /// 从经纬度计算所在2.5万新图幅号
2699         /// </summary>
2700         /// <param name="longitude"></param>
2701         /// <param name="latitude"></param>
2702         /// <returns></returns>
2703         public string CalculateNewMapnumberFromLongitudeLatitude2_5W( decimal longitude , decimal latitude ) {
2704             try {
2705                 string n100W = CalculateNewMapnumberFromLongitudeLatitude100W( longitude , latitude );
2706                 if ( string. IsNullOrEmpty( n100W ) ) {
2707                     return "";
2708                 }
2709                 int[] subRC = CalculateNewMapnumberRowColumnIn100WFromLongitudeLatitude( longitude , latitude , _2_5W_LongitudeDifference , _2_5W_LatitudeDifference );
2710                 string r = subRC[0]. ToString( "000" );
2711                 string c = subRC[1]. ToString( "000" );
2712                 string n2_5W = n100W + "F" + r + c;
2713                 if ( NewMapnumber_Check( n2_5W ) ) {
2714                     return n2_5W;
2715                 } else {
2716                     return "";
2717                 }
2718             } catch {
2719                 throw;
2720             }
2721         }
2722 
2723         /// <summary>
2724         /// Coordinate to 1W new mapnumber
2725         /// 从经纬度计算所在1万新图幅号
2726         /// </summary>
2727         /// <param name="longitude"></param>
2728         /// <param name="latitude"></param>
2729         /// <returns></returns>
2730         public string CalculateNewMapnumberFromLongitudeLatitude1W( decimal longitude , decimal latitude ) {
2731             try {
2732                 string n100W = CalculateNewMapnumberFromLongitudeLatitude100W( longitude , latitude );
2733                 if ( string. IsNullOrEmpty( n100W ) ) {
2734                     return "";
2735                 }
2736                 int[] subRC = CalculateNewMapnumberRowColumnIn100WFromLongitudeLatitude( longitude , latitude , _1W_LongitudeDifference , _1W_LatitudeDifference );
2737                 string r = subRC[0]. ToString( "000" );
2738                 string c = subRC[1]. ToString( "000" );
2739                 string n1W = n100W + "G" + r + c;
2740                 if ( NewMapnumber_Check( n1W ) ) {
2741                     return n1W;
2742                 } else {
2743                     return "";
2744                 }
2745             } catch {
2746                 throw;
2747             }
2748         }
2749 
2750         /// <summary>
2751         /// Coordinate to 0.5W new mapnumber
2752         /// 从经纬度计算所在0.5万新图幅号
2753         /// </summary>
2754         /// <param name="longitude"></param>
2755         /// <param name="latitude"></param>
2756         /// <returns></returns>
2757         public string CalculateNewMapnumberFromLongitudeLatitude0_5W( decimal longitude , decimal latitude ) {
2758             try {
2759                 string n100W = CalculateNewMapnumberFromLongitudeLatitude100W( longitude , latitude );
2760                 if ( string. IsNullOrEmpty( n100W ) ) {
2761                     return "";
2762                 }
2763                 int[] subRC = CalculateNewMapnumberRowColumnIn100WFromLongitudeLatitude( longitude , latitude , _0_5W_LongitudeDifference , _0_5W_LatitudeDifference );
2764                 string r = subRC[0]. ToString( "000" );
2765                 string c = subRC[1]. ToString( "000" );
2766                 string n0_5W = n100W + "H" + r + c;
2767                 if ( NewMapnumber_Check( n0_5W ) ) {
2768                     return n0_5W;
2769                 } else {
2770                     return "";
2771                 }
2772             } catch {
2773                 throw;
2774             }
2775         }
2776 
2777         /// <summary>
2778         /// Coordinate to 0.2W new mapnumber
2779         /// 从经纬度计算所在0.2万新图幅号
2780         /// </summary>
2781         /// <param name="longitude"></param>
2782         /// <param name="latitude"></param>
2783         /// <returns></returns>
2784         public string CalculateNewMapnumberFromLongitudeLatitude0_2W( decimal longitude , decimal latitude ) {
2785             try {
2786                 string n100W = CalculateNewMapnumberFromLongitudeLatitude100W( longitude , latitude );
2787                 if ( string. IsNullOrEmpty( n100W ) ) {
2788                     return "";
2789                 }
2790                 int[] subRC = CalculateNewMapnumberRowColumnIn100WFromLongitudeLatitude( longitude , latitude , _0_2W_LongitudeDifference , _0_2W_LatitudeDifference );
2791                 string r = subRC[0]. ToString( "000" );
2792                 string c = subRC[1]. ToString( "000" );
2793                 string n0_2W = n100W + "I" + r + c;
2794                 if ( NewMapnumber_Check( n0_2W ) ) {
2795                     return n0_2W;
2796                 } else {
2797                     return "";
2798                 }
2799             } catch {
2800                 throw;
2801             }
2802         }
2803 
2804         /// <summary>
2805         /// Coordinate to 0.1W new mapnumber
2806         /// 从经纬度计算所在0.1万新图幅号
2807         /// </summary>
2808         /// <param name="longitude"></param>
2809         /// <param name="latitude"></param>
2810         /// <returns></returns>
2811         public string CalculateNewMapnumberFromLongitudeLatitude0_1W( decimal longitude , decimal latitude ) {
2812             try {
2813                 string n100W = CalculateNewMapnumberFromLongitudeLatitude100W( longitude , latitude );
2814                 if ( string. IsNullOrEmpty( n100W ) ) {
2815                     return "";
2816                 }
2817                 int[] subRC = CalculateNewMapnumberRowColumnIn100WFromLongitudeLatitude( longitude , latitude , _0_1W_LongitudeDifference , _0_1W_LatitudeDifference );
2818                 string r = subRC[0]. ToString( "0000" );
2819                 string c = subRC[1]. ToString( "0000" );
2820                 string n0_1W = n100W + "J" + r + c;
2821                 if ( NewMapnumber_Check( n0_1W ) ) {
2822                     return n0_1W;
2823                 } else {
2824                     return "";
2825                 }
2826             } catch {
2827                 throw;
2828             }
2829         }
2830 
2831         /// <summary>
2832         /// Coordinate to 500 new mapnumber
2833         /// 从经纬度计算所在500新图幅号
2834         /// </summary>
2835         /// <param name="longitude"></param>
2836         /// <param name="latitude"></param>
2837         /// <returns></returns>
2838         public string CalculateNewMapnumberFromLongitudeLatitude500( decimal longitude , decimal latitude ) {
2839             try {
2840                 string n100W = CalculateNewMapnumberFromLongitudeLatitude100W( longitude , latitude );
2841                 if ( string. IsNullOrEmpty( n100W ) ) {
2842                     return "";
2843                 }
2844                 int[] subRC = CalculateNewMapnumberRowColumnIn100WFromLongitudeLatitude( longitude , latitude , _500_LongitudeDifference , _500_LatitudeDifference );
2845                 string r = subRC[0]. ToString( "0000" );
2846                 string c = subRC[1]. ToString( "0000" );
2847                 string n500 = n100W + "K" + r + c;
2848                 if ( NewMapnumber_Check( n500 ) ) {
2849                     return n500;
2850                 } else {
2851                     return "";
2852                 }
2853             } catch {
2854                 throw;
2855             }
2856         }
2857 
2858         private int[] CalculateNewMapnumberRowColumnIn100WFromLongitudeLatitude( decimal longitude , decimal latitude , decimal JC , decimal WC ) {
2859             int rNum = (int) ( Math. Round( ( _100W_LongitudeDifference / WC ) , MidpointRounding. AwayFromZero ) ) - (int) ( ( latitude % _100W_LongitudeDifference ) / WC );
2860             int cNum = (int) ( (int) ( ( longitude % _100W_LatitudeDifference ) / JC ) ) + 1;
2861 
2862             return new int[] { rNum , cNum };
2863         }
2864 
2865         #endregion
2866 
2867         #region Coordinate to old mapnumber     坐标转旧图号
2868 
2869         /// <summary>
2870         /// Coordinate to old mapnumber
2871         /// 从经纬度计算所在旧图幅号
2872         /// </summary>
2873         /// <param name="longitude">经度</param>
2874         /// <param name="latitude">纬度</param>
2875         /// <param name="scaleDenominator">比例尺分母</param>
2876         /// <returns></returns>
2877         public string CalculateOldMapnumberFromLongitudeLatitude( decimal longitude , decimal latitude , int scaleDenominator ) {
2878             try {
2879                 string n100W = CalculateNewMapnumberFromLongitudeLatitude100W( longitude , latitude );
2880                 if ( string. IsNullOrEmpty( n100W ) ) {
2881                     return "";
2882                 }
2883                 decimal[] jwc = GetLongitudeLatitudeDifference( scaleDenominator );
2884                 decimal JC = jwc[0];
2885                 decimal WC = jwc[1];
2886                 int[] subRC = CalculateNewMapnumberRowColumnIn100WFromLongitudeLatitude( longitude , latitude , JC , WC );
2887                 string scaleStr = GetNewMapnumberScaleString( scaleDenominator );
2888                 #region 20万
2889                 if ( scaleDenominator == 200000 ) {
2890                     return CalculateOldMapnumberFromLongitudeLatitude20W( longitude , latitude );
2891                 }
2892                 #endregion
2893                 #region
2894  else {
2895                     string r = "";
2896                     string c = "";
2897                     if ( scaleStr == "J" || scaleStr == "K" ) {
2898                         r = subRC[0]. ToString( "0000" );
2899                         c = subRC[1]. ToString( "0000" );
2900                     } else {
2901                         r = subRC[0]. ToString( "000" );
2902                         c = subRC[1]. ToString( "000" );
2903                     }
2904                     if ( string. IsNullOrEmpty( scaleStr ) ) {
2905                         scaleStr = "";
2906                         r = "";
2907                         c = "";
2908                     }
2909                     string newMapnumber = n100W + scaleStr + r + c;
2910                     if ( NewMapnumber_Check( newMapnumber ) ) {
2911                         string oldMapnumber = NewMapnumberToOldMapnumber( newMapnumber );
2912                         if ( OldMapnumber_Check( oldMapnumber ) ) {
2913                             return oldMapnumber;
2914                         } else {
2915                             return "";
2916                         }
2917                     } else {
2918                         return "";
2919                     }
2920                 }
2921                 #endregion
2922             } catch {
2923                 throw;
2924             }
2925         }
2926 
2927         /// <summary>
2928         /// Coordinate to 100W old mapnumber
2929         /// 从经纬度计算所在100万旧图幅号
2930         /// </summary>
2931         /// <param name="longitude"></param>
2932         /// <param name="latitude"></param>
2933         /// <returns></returns>
2934         public string CalculateOldMapnumberFromLongitudeLatitude100W( decimal longitude , decimal latitude ) {
2935             try {
2936                 int rNum = (int) ( latitude / _100W_LongitudeDifference ) + 1;
2937                 int cNum = (int) ( longitude / _100W_LatitudeDifference ) + 31;
2938                 string rStr = Change100W_RowDigitalToString( rNum );
2939                 string o100W = rStr + "-" + cNum. ToString( "00" );
2940                 if ( OldMapnumber_Check100W( o100W ) ) {
2941                     return o100W;
2942                 } else {
2943                     return "";
2944                 }
2945             } catch {
2946                 throw;
2947             }
2948         }
2949 
2950         /// <summary>
2951         /// Coordinate to 20W old mapnumber
2952         /// 从经纬度计算所在20万旧图幅号
2953         /// </summary>
2954         /// <param name="longitude"></param>
2955         /// <param name="latitude"></param>
2956         /// <returns></returns>
2957         public string CalculateOldMapnumberFromLongitudeLatitude20W( decimal longitude , decimal latitude ) {
2958             try {
2959                 string o100W = CalculateOldMapnumberFromLongitudeLatitude100W( longitude , latitude );
2960                 if ( string. IsNullOrEmpty( o100W ) ) {
2961                     return "";
2962                 }
2963                 int[] subRC = CalculateNewMapnumberRowColumnIn100WFromLongitudeLatitude( longitude , latitude , _20W_LongitudeDifference , _20W_LatitudeDifference );
2964                 int o20WNum = O20WNum( subRC[0] , subRC[1] );
2965                 string o20W = o100W + "-(" + o20WNum. ToString( "00" ) + ")";
2966                 if ( OldMapnumber_Check20W( o20W ) ) {
2967                     return o20W;
2968                 } else {
2969                     return "";
2970                 }
2971             } catch {
2972                 throw;
2973             }
2974         }
2975 
2976         private int O20WNum( int n20WR , int n20WC ) {
2977             return oldMapnumber_20W_RCNum * ( n20WR - 1 ) + n20WC;
2978         }
2979 
2980         #endregion
2981 
2982         #endregion
2983 
2984         #endregion
2985 
2986 
2987         #region Other       其他
2988 
2989         /// <summary>
2990         /// Get 100W Row/100W Column/ScaleStr/Rownum/Columnnum from new  mapnumber
2991         /// 从新图号获得比例尺、行列号信息([0]:百万行;[1]:百万咧;[2]:比例尺代码;[3]:行号;[4]:列号)
2992         /// </summary>
2993         /// <param name="newMapnumber"></param>
2994         /// <returns></returns>
2995         public string[] GetInfoFromNewMapnumber( string newMapnumber ) {
2996             try {
2997                 string[] strs = new string[5];
2998                 if ( !NewMapnumber_Check( newMapnumber ) ) {
2999                     return null;
3000                 }
3001                 int length = newMapnumber. Length;
3002                 string n100WR = "";
3003                 string n100WC = "";
3004                 string nScaleStr = "";
3005                 string nR = "";
3006                 string nC = "";
3007                 if ( length == 3 ) {
3008                     n100WR = newMapnumber. Substring( 0 , 1 );
3009                     n100WC = newMapnumber. Substring( 1 , 2 );
3010                 } else {
3011                     n100WR = newMapnumber. Substring( 0 , 1 );
3012                     n100WC = newMapnumber. Substring( 1 , 2 );
3013                     nScaleStr = newMapnumber. Substring( 3 , 1 );
3014                     if ( length == 10 ) {
3015                         nR = newMapnumber. Substring( 4 , 3 );
3016                         nC = newMapnumber. Substring( 7 , 3 );
3017                     } else {
3018                         nR = newMapnumber. Substring( 4 , 4 );
3019                         nC = newMapnumber. Substring( 8 , 4 );
3020                     }
3021                 }
3022                 if ( !string. IsNullOrEmpty( n100WR ) && !string. IsNullOrEmpty( n100WC ) ) {
3023                     strs[0] = n100WR;
3024                     strs[1] = n100WC;
3025                     strs[2] = nScaleStr;
3026                     strs[3] = nR;
3027                     strs[4] = nC;
3028                     return strs;
3029                 }
3030                 return null;
3031             } catch {
3032                 throw;
3033             }
3034         }
3035 
3036         /// <summary>
3037         /// Get longitude and latitude difference from scale denominator
3038         /// 从比例尺分母获得经差、纬差 [0]:经差;[1]:纬差
3039         /// </summary>
3040         /// <param name="scaleDenominator"></param>
3041         /// <returns></returns>
3042         public decimal[] GetLongitudeLatitudeDifference( int scaleDenominator ) {
3043             switch ( scaleDenominator ) {
3044                 case 1000000:
3045                     return new decimal[] { _100W_LatitudeDifference , _100W_LongitudeDifference };
3046                 case 500000:
3047                     return new decimal[] { _50W_LongitudeDifference , _50W_LatitudeDifference };
3048                 case 250000:
3049                     return new decimal[] { _25W_LongitudeDifference , _25W_LatitudeDifference };
3050                 case 200000:
3051                     return new decimal[] { _20W_LongitudeDifference , _20W_LatitudeDifference };
3052                 case 100000:
3053                     return new decimal[] { _10W_LongitudeDifference , _10W_LatitudeDifference };
3054                 case 50000:
3055                     return new decimal[] { _5W_LongitudeDifference , _5W_LatitudeDifference };
3056                 case 25000:
3057                     return new decimal[] { _2_5W_LongitudeDifference , _2_5W_LatitudeDifference };
3058                 case 10000:
3059                     return new decimal[] { _1W_LongitudeDifference , _1W_LatitudeDifference };
3060                 case 5000:
3061                     return new decimal[] { _0_5W_LongitudeDifference , _0_5W_LatitudeDifference };
3062                 case 2000:
3063                     return new decimal[] { _0_2W_LongitudeDifference , _0_2W_LatitudeDifference };
3064                 case 1000:
3065                     return new decimal[] { _0_1W_LongitudeDifference , _0_1W_LatitudeDifference };
3066                 case 500:
3067                     return new decimal[] { _500_LongitudeDifference , _500_LatitudeDifference };
3068                 default:
3069                     return null;
3070             }
3071         }
3072 
3073         /// <summary>
3074         /// Get scale str from scale denominator
3075         /// 从比例尺分母获得新图号中的比例尺代码
3076         /// </summary>
3077         /// <param name="scaleDenominator"></param>
3078         /// <returns></returns>
3079         public string GetNewMapnumberScaleString( int scaleDenominator ) {
3080             switch ( scaleDenominator ) {
3081                 case 1000000:
3082                     return "";
3083                 case 500000:
3084                     return "B";
3085                 case 250000:
3086                     return "C";
3087                 case 100000:
3088                     return "D";
3089                 case 50000:
3090                     return "E";
3091                 case 25000:
3092                     return "F";
3093                 case 10000:
3094                     return "G";
3095                 case 5000:
3096                     return "H";
3097                 case 2000:
3098                     return "I";
3099                 case 1000:
3100                     return "J";
3101                 case 500:
3102                     return "K";
3103                 default:
3104                     return null;
3105             }
3106         }
3107 
3108         /// <summary>
3109         /// Get polygon from new mapnumber
3110         /// 根据图号,生成面图形
3111         /// </summary>
3112         /// <param name="newMapnumber"></param>
3113         /// <returns></returns>
3114         //public ESRI.ArcGIS.Geometry.IGeometry GetPolygonGeometryFromNewMapnumber( string newMapnumber ) {
3115         //    if ( NewMapnumber_Check( newMapnumber ) ) {
3116         //        decimal[] coor = CalculateLongitudeLatitudeFromNewMapnumber( newMapnumber );
3117         //        if ( coor != null ) {
3118         //            ESRI.ArcGIS.Geometry.Ring ring = new ESRI.ArcGIS.Geometry.RingClass();
3119 
3120         //            ESRI.ArcGIS.Geometry.Point p1 = new ESRI.ArcGIS.Geometry.PointClass();
3121         //            p1. PutCoords( decimal. ToDouble( coor[0] ) , decimal. ToDouble( coor[1] ) );
3122         //            ring. AddPoint( p1 );
3123 
3124         //            ESRI. ArcGIS. Geometry. Point p2 = new ESRI. ArcGIS. Geometry. PointClass();
3125         //            p2. PutCoords( decimal. ToDouble( coor[0] ) , decimal. ToDouble( coor[3] ) );
3126         //            ring. AddPoint( p2 );
3127 
3128         //            ESRI. ArcGIS. Geometry. Point p3 = new ESRI. ArcGIS. Geometry. PointClass();
3129         //            p3. PutCoords( decimal. ToDouble( coor[2] ) , decimal. ToDouble( coor[3] ) );
3130         //            ring. AddPoint( p3 );
3131 
3132         //            ESRI. ArcGIS. Geometry. Point p4 = new ESRI. ArcGIS. Geometry. PointClass();
3133         //            p4. PutCoords( decimal. ToDouble( coor[2] ) , decimal. ToDouble( coor[1] ) );
3134         //            ring. AddPoint( p4 );
3135 
3136         //            ring. AddPoint( p1 );
3137 
3138         //            ESRI.ArcGIS.Geometry.IGeometryCollection pointPolygon = new ESRI.ArcGIS.Geometry.PolygonClass();
3139         //            pointPolygon. AddGeometry( ring as ESRI.ArcGIS.Geometry.IGeometry );
3140         //            ESRI.ArcGIS.Geometry.IPolygon pPolygon = pointPolygon as ESRI.ArcGIS.Geometry.IPolygon;
3141         //            ESRI.ArcGIS.Geometry.IGeometry pGeometry = pPolygon as ESRI.ArcGIS.Geometry.IGeometry;
3142         //            return pGeometry;
3143         //        }
3144         //    }
3145         //    return null;
3146         //}
3147 
3148 
3149         #endregion
3150 
3151     }
3152 }
Mapnumber

 

posted on 2016-12-15 18:05  JackieTang  阅读(5952)  评论(1编辑  收藏  举报

导航