计算的方法如下图: 相应的代码如下(100W,50W,25W,10W,5W几种比例尺,其它比例尺同理): /// <summary> 从新图幅号计算角点坐标 </summary> /// <param name="newNumber">输入的新图幅号(请先验证图幅号格式合法,再)</param> /// <returns>角点列表</returns> public static List<ESRI.ArcGIS.Geometry.IPoint> CalPointListFromNewNo(string newNumber) { List<ESRI.ArcGIS.Geometry.IPoint> resultLst = new List<ESRI.ArcGIS.Geometry.IPoint>(); double delX = 0, delY = 0; //该比例尺下的图幅经度差和纬度差 int H = 0, L = 0; //H为1:100万图幅纬度带字符对应的数字(A对应1,以此类推), //L为1:100万图幅经度带的数字码,例如J50中的50 int h = 0, l = 0; //h为所求比例尺地形图所在的行号,例如I50B002001中的002 //l为所求比例尺地形图所在的列号,例如I50B002001中的001 #region 读取比例尺及行列号,并为经差及纬差赋值 if (newNumber.Length == 3) //100w { delX = 6; delY = 4; //100w比例尺的情况下,没有后边六位的行列号,直接认为h和l是0即可 } else { //其它比例尺下,提取行列号 if (!int.TryParse(newNumber.Substring(4, 3), out h) || !int.TryParse(newNumber.Substring(7, 3), out l)) return null; } if (!int.TryParse(newNumber.Substring(1, 2), out L)) return null; H = (int)newNumber[0] - (int)'A' + 1; switch (newNumber[3]) { case 'B': //50w delX = 3; delY = 2; break; case 'C': //25w delX = 1.5; delY = 1; break; case 'D': //10w delX = 0.5; delY = 1.0 / 3; break; case 'E': //5w delX = 0.25; delY = 1.0 / 6; break; default: return null; //其它比例尺,暂没有写 } #endregion //左下角点 double x = (L - 31) * 6 + (l - 1) * delX; double y = (H - 1) * 4 + (4 / delY - h) * delY; ESRI.ArcGIS.Geometry.IPoint mPnt = new ESRI.ArcGIS.Geometry.PointClass(); mPnt.PutCoords(x, y); mPnt.Z = 1; //这里赋Z值并没有实际作用,只是为了防止出现“the geometry has null z value”错误 resultLst.Add(mPnt); mPnt = new ESRI.ArcGIS.Geometry.PointClass(); mPnt.PutCoords(x+delX, y); mPnt.Z = 1; resultLst.Add(mPnt); mPnt = new ESRI.ArcGIS.Geometry.PointClass(); mPnt.PutCoords(x+delX, y+delY); mPnt.Z = 1; resultLst.Add(mPnt); mPnt = new ESRI.ArcGIS.Geometry.PointClass(); mPnt.PutCoords(x, y+delY); mPnt.Z = 1; resultLst.Add(mPnt); return resultLst; }