CEnvironment.cs
上传用户:xum6868
上传日期:2009-12-02
资源大小:102k
文件大小:39k
源码类别:

GIS编程

开发平台:

C#

  1. using System;
  2. using System.Drawing;
  3. namespace MainSystem
  4. {
  5. /// <summary>
  6. /// 
  7. /// </summary>
  8. public struct LayerInfo
  9. {
  10. public string szName;
  11. public string szLayerName;
  12. public string szFileName;
  13. public string szTableName;
  14. public string szFieldName;
  15. public string szType;
  16. public string szSubType; //中类
  17. public string szSubType2; //小类
  18. public string szSubType3;
  19. public bool bCanControl;
  20. public bool bVisible; //可显示状态,只能通过图层控制来改变
  21. public bool bSelected;
  22. public bool bCanSelected; //可选择
  23. public bool bBackground;
  24. public bool bLable;
  25. public double dScale;
  26. public double dShowScale;
  27. public int nCharacterIndex;
  28. public string szFontName;
  29. public int  nFontSize;
  30. public int nSymSize;
  31. public uint nSymColor;
  32. public MapObjects2.MapLayer layer;
  33. public MapObjects2.Recordset rsSel;
  34. };
  35. public class MLine
  36. {
  37. public int nPointNumber;
  38. public MPoint[] pPoint;
  39. public MLine()
  40. {
  41. }
  42. };
  43. public class CloestPath
  44. {
  45. public MPoint pt1 = null;
  46. public MPoint pt2 = null;
  47. };
  48. public class MPoint
  49. {
  50. public double x;
  51. public double y;
  52. public MPoint()
  53. {
  54. }
  55. };
  56. public class Buses
  57. {
  58. public int nNum;
  59. public MPoint[] pts;
  60. public Buses()
  61. {
  62. pts = new MPoint[200]; 
  63. }
  64. }
  65. enum MapOpr {MO_NULL=0,MO_ZOOMIN,MO_ZOOMOUT,MO_ZOOMFULL,MO_PAN,MO_POINTSEL,MO_RECTSEL,MO_CIRCLESEL,MO_POLYGONSEL,MO_INFO,MO_LINEMEAS,MO_POLYMEAS,MO_SEACHBYDIST,MO_CLOSEST};
  66. enum MapDisp {MO_ALL = 0,MO_SCHOOL = 1, MO_TOUR,MO_HOSPITAL,MO_SHOP,MO_HOTEL,MO_GAS,MO_BANK,MO_MOVIE,MO_RESTAURANT,MO_WS,MO_POST,MO_LIBRAY,MO_STATION}
  67. public struct MapInfo
  68. {
  69. public string szName;
  70. public string szMetaTable;
  71. public string szIndexTable;
  72. public string szType;
  73. public MapObjects2.Rectangle rect;
  74. };
  75. public struct IndexInfo
  76. {
  77. public string szName;
  78. public double dX;
  79. public double dY;
  80. public MapObjects2.Rectangle m_extent;
  81. };
  82. public class CEnvironment
  83. {
  84. //常量
  85. public const string BUSLINE_LAYERNAME = "公交线路";
  86. public const string BUSSTATION_LAYERNAME = "公交车站";
  87. public const uint SYMBOL_COLOR_NONE = 9999;
  88. public string m_szDBName = "";
  89. public string m_szSDBPath = "";
  90. public string m_AppPath = "";
  91. public string m_szHelpPath = "";
  92. public MapObjects2.DataConnection m_db = null;
  93. public int m_nCurrMapIndex = -1;
  94. public int m_nMapNum = -1;
  95. public MapInfo[] m_mapInfos = null;
  96. public int m_nLayerNum = -1;
  97. public LayerInfo[] m_layerInfos = null;
  98. public int m_nIndexNum = -1;
  99. public IndexInfo[] m_indexInfos = null;
  100. public MapObjects2.Symbol m_selSymbol = null;
  101. public string m_szfntStation = "";
  102. public char m_chStation = 'a';
  103. public int m_nfntStation = 10;
  104. // public string m_szFontName = ""; 
  105. public System.Data.DataSet m_dataSet = null; 
  106. public long m_x,m_y;
  107. public  int m_MapOpr;
  108. public CloestPath m_cloestPath = null;
  109. public double m_dDistance; //最短距离查询
  110. public object m_selectedFeature = null;
  111. public MapObjects2.Symbol m_selectedSymbol = null;
  112. public short m_selectedSymbolSize;
  113. public double m_selectedScale;
  114. public MLine[] m_drawLine = null;
  115. public Buses m_buses = null;
  116. public string m_szBusFilter = "";
  117. public bool m_bPathInit = false;
  118. public CPath m_path;
  119. public string m_szPlaceName = "";
  120. public MapObjects2.Rectangle m_shapeRect;
  121. public MapObjects2.MapLayer m_layerRoad = null;
  122. public CEnvironment()
  123. {
  124. m_MapOpr = (int)MapOpr.MO_NULL;
  125.  
  126. m_selSymbol = new MapObjects2.Symbol();  
  127. m_selSymbol.SymbolType = MapObjects2.SymbolTypeConstants.moPointSymbol;  
  128. m_selSymbol.Color = 0xff;  
  129. m_path = new CPath();
  130. m_bPathInit = false;
  131. m_cloestPath = new CloestPath(); 
  132. }
  133. public int GetMapIndex(string szMapName)
  134. {
  135. int nIndex = -1;
  136. for (int i = 0; i < m_nMapNum; i ++)
  137. {
  138. if (szMapName.Equals(m_mapInfos[i].szName))
  139. {
  140. nIndex = i;
  141. break;
  142. }
  143. }
  144. return nIndex;
  145. }
  146. public int GetLayerIndexByName(string szName)
  147. {
  148. int nIndex = -1;
  149. for (int i = 0; i < m_nLayerNum; i ++)
  150. {
  151. if (szName.Equals(this.m_layerInfos[i].szName))
  152. {
  153. nIndex = i;
  154. break;
  155. }
  156. }
  157. return nIndex;
  158. }
  159. /// <summary>
  160. /// 根据地名得到地名所在的图层名
  161. /// </summary>
  162. /// <param name="szName">string 地名名称</param>
  163. /// <param name="szTblName">string 索引表名称</param>
  164. /// <returns>图层名称</returns>
  165. public string GetLayerName(string szName,string szTblName)
  166. {
  167. string szTableName = "";
  168. string strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + m_szDBName + 
  169. ";Persist Security Info=False";
  170. System.Data.OleDb.OleDbConnection  myConnection = new System.Data.OleDb.OleDbConnection(strConnectionString);   
  171. myConnection.Open();
  172. System.Data.DataSet dataSet = new System.Data.DataSet("临时库");
  173. System.Data.OleDb.OleDbDataAdapter myDataAdapter;
  174. string szSQL;
  175. szSQL = "Select * From " + szTblName + " Where 名称 ='"+szName+"'";
  176. myDataAdapter = new System.Data.OleDb.OleDbDataAdapter(szSQL,myConnection);
  177. myDataAdapter.Fill(dataSet,"地名索引");
  178. System.Data.DataTable indexTbl = dataSet.Tables["地名索引"];
  179. System.Data.DataRow[] rowsType = indexTbl.Select();
  180. if (0 == rowsType.Length)
  181. return "";
  182. szTableName = rowsType[0]["图层名"].ToString(); 
  183. return szTableName;
  184. }
  185. public string GetFieldName(string szName)
  186. {
  187. string szTable = GetTableName(szName,"地名索引");
  188. string szFieldName = "单位名称";
  189. string strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + m_szDBName + 
  190. ";Persist Security Info=False";
  191. System.Data.OleDb.OleDbConnection  myConnection = new System.Data.OleDb.OleDbConnection(strConnectionString);   
  192. myConnection.Open();
  193. System.Data.DataSet dataSet = new System.Data.DataSet("临时库");
  194. System.Data.OleDb.OleDbDataAdapter myDataAdapter;
  195. string szSQL;
  196. szSQL = "Select * From "+ this.m_mapInfos[this.m_nCurrMapIndex].szMetaTable +  " Where 属性表名 ='"+szTable+"'";
  197. myDataAdapter = new System.Data.OleDb.OleDbDataAdapter(szSQL,myConnection);
  198. myDataAdapter.Fill(dataSet,"索引");
  199. System.Data.DataTable indexTbl = dataSet.Tables["索引"];
  200. System.Data.DataRow[] rowsType = indexTbl.Select();
  201. if (0 == rowsType.Length)
  202. return szFieldName;
  203. szFieldName = rowsType[0]["字段名"].ToString(); 
  204. return szFieldName;
  205. }
  206. public string GetTableName(string szName, string szTbleName)
  207. {
  208. string szTableName = "";
  209. string strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + m_szDBName + 
  210. ";Persist Security Info=False";
  211. System.Data.OleDb.OleDbConnection  myConnection = new System.Data.OleDb.OleDbConnection(strConnectionString);   
  212. myConnection.Open();
  213. System.Data.DataSet dataSet = new System.Data.DataSet("临时库");
  214. System.Data.OleDb.OleDbDataAdapter myDataAdapter;
  215. string szSQL;
  216. szSQL = "Select * From " + szTbleName + " Where 名称 ='"+szName+"'";
  217. myDataAdapter = new System.Data.OleDb.OleDbDataAdapter(szSQL,myConnection);
  218. myDataAdapter.Fill(dataSet,"地名索引");
  219. System.Data.DataTable indexTbl = dataSet.Tables["地名索引"];
  220. System.Data.DataRow[] rowsType = indexTbl.Select();
  221. if (0 == rowsType.Length)
  222. return szTableName;
  223. szTableName = rowsType[0]["属性表名"].ToString(); 
  224. return szTableName;
  225. }
  226. public void ExecuteSpatial(AxMapObjects2.AxMap map,object shape,MapObjects2.SearchMethodConstants sMode,bool bMPoint)
  227. {
  228. for (int i = 0; i < this.m_nLayerNum; i ++)
  229. {
  230. if (bMPoint)
  231. {
  232. double dScale = CalcScale(map);
  233. if (dScale > 8000)
  234. {
  235. dScale = dScale/10000;
  236. dScale = dScale / 5000;
  237. }
  238. else
  239. {
  240. dScale = dScale/10000;
  241. dScale = dScale / 2500;
  242. }
  243. if (m_layerInfos[i].layer.Visible && m_layerInfos[i].bCanSelected)  
  244. m_layerInfos[i].rsSel = m_layerInfos[i].layer.SearchByDistance(shape, dScale,"");
  245. else
  246. m_layerInfos[i].rsSel = null;
  247. }
  248. else
  249. {
  250. if (m_layerInfos[i].layer.Visible && m_layerInfos[i].bCanSelected)  
  251. m_layerInfos[i].rsSel = m_layerInfos[i].layer.SearchShape(shape, sMode,"");
  252. else
  253. m_layerInfos[i].rsSel = null;
  254. }
  255. }
  256. }
  257. public void ClearSelRsts()
  258. {
  259. for (int i = 0; i < this.m_nLayerNum; i ++)
  260. {
  261. m_layerInfos[i].rsSel = null;
  262. }
  263. }
  264. public void DrawRecordset(AxMapObjects2.AxMap map)
  265. {
  266. for (int i = 0; i < this.m_nLayerNum; i ++)
  267. {
  268. if (m_layerInfos[i].layer.Visible)
  269. {
  270. if (m_layerInfos[i].rsSel != null)
  271. {
  272. MapObjects2.Symbol sym = new MapObjects2.Symbol(); 
  273. sym.SymbolType = m_layerInfos[i].layer.Symbol.SymbolType; 
  274. sym.Style = m_layerInfos[i].layer.Symbol.Style;
  275. sym.Size = m_layerInfos[i].layer.Symbol.Size;
  276. sym.Color = 0xff;
  277. if (m_layerInfos[i].nCharacterIndex >= 0 && m_layerInfos[i].layer.shapeType == MapObjects2.ShapeTypeConstants.moShapeTypePoint )
  278. {
  279. // sym = m_layerInfos[i].layer.Symbol; 
  280. // sym.Color = 0xff;
  281. sym.SymbolType = MapObjects2.SymbolTypeConstants.moPointSymbol;
  282. sym.Font.Name  = m_layerInfos[i].szFontName;
  283. sym.Style = 4;
  284. sym.Size = m_layerInfos[i].layer.Symbol.Size;
  285. sym.CharacterIndex = (short)m_layerInfos[i].nCharacterIndex;
  286. }
  287. m_layerInfos[i].rsSel.MoveFirst();
  288. while  (!m_layerInfos[i].rsSel.EOF)
  289. {
  290. map.DrawShape(m_layerInfos[i].rsSel.Fields.Item("Shape").Value,sym);
  291. m_layerInfos[i].rsSel.MoveNext(); 
  292. }
  293. }
  294. }
  295. }
  296. }
  297. public void DrawSelectedShape(AxMapObjects2.AxMap map, frmMain frm)
  298. {
  299. MapObjects2.Symbol sym = new MapObjects2.Symbol(); 
  300. sym.Color = 0xff;
  301. if (this.m_selectedSymbol == null)
  302. map.DrawShape(m_selectedFeature,sym );
  303. else
  304. {
  305. double dScale = this.CalcScale(map);
  306. // if (m_selectedScale > dScale)
  307. {
  308. m_selectedSymbol.Size = frm.ReCalcFontSize(m_selectedSymbolSize,dScale);
  309. map.DrawShape(m_selectedFeature,m_selectedSymbol );
  310. }
  311. }
  312. }
  313. /////////////////////////////////////////////////////////////////// 
  314. /// 功能:判断图层是否可见
  315. /// 参数:
  316. /// 返回值:
  317. /// ///////////////////////////////////////////////////////////////
  318. public bool GetLayerVisible(int disp)
  319. {
  320. bool bVisible = true;
  321. int  nType = 2;
  322. string szSubType = "";
  323. switch ((MapDisp)disp)
  324. {
  325. case MapDisp.MO_ALL:
  326. nType = 1;
  327. break;
  328. case MapDisp.MO_HOSPITAL:
  329. szSubType = "医院";
  330. break;
  331. case MapDisp.MO_SCHOOL:
  332. szSubType = "教育";
  333. break;
  334. case MapDisp.MO_SHOP:
  335. szSubType = "零售";
  336. break;
  337. case MapDisp.MO_TOUR:
  338. szSubType = "旅游";
  339. break;
  340. case MapDisp.MO_GAS:
  341. break;
  342. case MapDisp.MO_HOTEL: 
  343. szSubType = "住宿";
  344. break;
  345. case MapDisp.MO_LIBRAY:
  346. szSubType = "图书馆";
  347. nType = 3;
  348. break;
  349. case MapDisp.MO_MOVIE:
  350. szSubType = "影剧院、音乐厅";
  351. nType = 3;
  352. break;
  353. case MapDisp.MO_POST:
  354. szSubType = "邮政";
  355. break;
  356. case MapDisp.MO_RESTAURANT:
  357. szSubType = "餐饮";
  358. break;
  359. case MapDisp.MO_WS:
  360. szSubType = "dddd";
  361. break;
  362. case MapDisp.MO_STATION:
  363. szSubType = "站点";
  364. nType = 4;
  365. break;
  366. }
  367. int nCount = 0;
  368. for (int i = 0; i < this.m_nLayerNum; i ++)
  369. {
  370. if (m_layerInfos[i].bCanControl) 
  371. {
  372. switch (nType)
  373. {
  374. case 1:
  375. nCount ++;
  376. if (!m_layerInfos[i].bVisible)
  377. {
  378. return false;
  379. }
  380. break;
  381. case 2:
  382. if (szSubType == m_layerInfos[i].szSubType)
  383. {
  384. nCount ++;
  385. if (!m_layerInfos[i].bVisible)
  386. {
  387. return false;
  388. }
  389. }
  390. break;
  391. case 3:
  392. if (szSubType == m_layerInfos[i].szSubType2)
  393. {
  394. nCount ++;
  395. if (!m_layerInfos[i].bVisible)
  396. {
  397. return false;
  398. }
  399. }
  400. break;
  401. case 4:
  402. if (szSubType == m_layerInfos[i].szSubType3)
  403. {
  404. nCount ++;
  405. if (!m_layerInfos[i].bVisible)
  406. {
  407. return false;
  408. }
  409. }
  410. break;
  411. }
  412. }
  413. }
  414. if (0 == nCount)
  415. bVisible = false;
  416. return bVisible;
  417. }
  418. /////////////////////////////////////////////////////////////////// 
  419. /// 功能:设置图层是否可见
  420. /// 参数:
  421. /// 返回值:
  422. /// ///////////////////////////////////////////////////////////////
  423. public void SetLayerVisible(int disp, bool bVisible, double dScale)
  424. {
  425. int  nType = 2;
  426. string szSubType = "";
  427. switch ((MapDisp)disp)
  428. {
  429. case MapDisp.MO_ALL:
  430. nType = 1;
  431. break;
  432. case MapDisp.MO_HOSPITAL:
  433. szSubType = "医院";
  434. break;
  435. case MapDisp.MO_SCHOOL:
  436. szSubType = "教育";
  437. break;
  438. case MapDisp.MO_SHOP:
  439. szSubType = "零售";
  440. break;
  441. case MapDisp.MO_TOUR:
  442. szSubType = "旅游";
  443. break;
  444. case MapDisp.MO_GAS:
  445. break;
  446. case MapDisp.MO_HOTEL: 
  447. szSubType = "住宿";
  448. break;
  449. case MapDisp.MO_LIBRAY:
  450. szSubType = "图书馆";
  451. nType = 3;
  452. break;
  453. case MapDisp.MO_MOVIE:
  454. szSubType = "影剧院、音乐厅";
  455. nType = 3;
  456. break;
  457. case MapDisp.MO_POST:
  458. szSubType = "邮政";
  459. break;
  460. case MapDisp.MO_RESTAURANT:
  461. szSubType = "餐饮";
  462. break;
  463. case MapDisp.MO_WS:
  464. szSubType = "厕所";
  465. break;
  466. case MapDisp.MO_STATION:
  467. szSubType = "站点";
  468. nType = 4;
  469. break;
  470. }
  471. for (int i = 0; i < this.m_nLayerNum; i ++)
  472. {
  473. if (m_layerInfos[i].bCanControl) 
  474. {
  475. switch (nType)
  476. {
  477. case 1:
  478. if (!bVisible)
  479. {
  480. m_layerInfos[i].bVisible = bVisible;
  481. m_layerInfos[i].layer.Visible =  m_layerInfos[i].bVisible;
  482. }
  483. else
  484. {
  485. m_layerInfos[i].bVisible = bVisible;
  486. if (m_layerInfos[i].dScale > dScale)
  487. m_layerInfos[i].layer.Visible =  m_layerInfos[i].bVisible;
  488. }
  489. break;
  490. case 2:
  491. if (szSubType == m_layerInfos[i].szSubType)
  492. {
  493. if (!bVisible)
  494. {
  495. m_layerInfos[i].bVisible = bVisible;
  496. m_layerInfos[i].layer.Visible =  m_layerInfos[i].bVisible;
  497. }
  498. else
  499. {
  500. m_layerInfos[i].bVisible = bVisible;
  501. if (m_layerInfos[i].dScale > dScale)
  502. m_layerInfos[i].layer.Visible =  m_layerInfos[i].bVisible;
  503. }
  504. }
  505. break;
  506. case 3:
  507. if (szSubType == m_layerInfos[i].szSubType2)
  508. {
  509. if (!bVisible)
  510. {
  511. m_layerInfos[i].bVisible = bVisible;
  512. m_layerInfos[i].layer.Visible =  m_layerInfos[i].bVisible;
  513. }
  514. else
  515. {
  516. m_layerInfos[i].bVisible = bVisible;
  517. if (m_layerInfos[i].dScale > dScale)
  518. m_layerInfos[i].layer.Visible =  m_layerInfos[i].bVisible;
  519. }
  520. }
  521. break;
  522. case 4:
  523. if (szSubType == m_layerInfos[i].szSubType3)
  524. {
  525. if (!bVisible)
  526. {
  527. m_layerInfos[i].bVisible = bVisible;
  528. m_layerInfos[i].layer.Visible =  m_layerInfos[i].bVisible;
  529. }
  530. else
  531. {
  532. m_layerInfos[i].bVisible = bVisible;
  533. if (m_layerInfos[i].dScale > dScale)
  534. m_layerInfos[i].layer.Visible =  m_layerInfos[i].bVisible;
  535. }
  536. }
  537. break;
  538. }
  539. }
  540. }
  541. }
  542. private void SubGussFs(ref double X,ref double Y,double B,double L,int nCenterLongi)
  543. {
  544. //高斯投影分带
  545. int nzonenum;
  546. if(nCenterLongi==0)
  547. {
  548. nzonenum = (int)L/6+1;
  549. nCenterLongi = nzonenum*6-3;
  550. }
  551. else
  552. nzonenum = (int)nCenterLongi/6+1;
  553. //以弧度为单位的经纬度数值
  554. double rB = B/180*3.1415926;
  555. double rL = (L-nCenterLongi)/180*3.1415926; //同时计算了中央经线
  556. //1980坐标系参数
  557. const double a = 6378245.00; //长轴
  558. const double b = 6356863.50; //短轴
  559. // const double alpha = 0.0033523299; //扁率
  560. double sqre1 = (a*a-b*b)/(a*a); //第一偏心率平方
  561. // double sqre2 = (a*a-b*b)/(b*b); //第二偏心率平方
  562. //B:纬度
  563. //L:精度
  564. //子午圈曲率半径
  565. double sinb = Math.Sin(rB);
  566. double cosb = Math.Cos(rB);
  567. double M = a*(1-sqre1)/(1-sqre1*sinb*sinb)/Math.Sqrt(1-sqre1*sinb*sinb);
  568. //卯酉圈曲率半径
  569. double N = a/Math.Sqrt(1-sqre1*sinb*sinb);
  570. double sqrita = N/M-1;
  571. //该纬度点到赤道的子午线弧长
  572. double s = a*(1-sqre1)*(1.00505117739*rB-0.00506237764/2*Math.Sin(2*rB)+
  573. 0.0000106245/4*Math.Sin(4*rB)-0.00000002081/6*Math.Sin(6*rB));
  574. double tanb = Math.Tan(rB);
  575. X = s+rL*rL*N/2*sinb*cosb+rL*rL*rL*rL*N/24*sinb*cosb*cosb*cosb*(5-tanb*tanb+9*sqrita*sqrita+4*sqrita);
  576. Y = rL*N*cosb+rL*rL*rL*N/6*cosb*cosb*cosb*(1-tanb*tanb+sqrita)+
  577. rL*rL*rL*rL*rL*N/120*cosb*cosb*cosb*cosb*cosb*(5-18*tanb*tanb+tanb*tanb*tanb*tanb);
  578. Y = Y+500000+nzonenum*1.0e+6;
  579. }
  580. private void SubGussFs(double X,double Y,double L0,ref double B,ref double L)
  581. {   
  582. double p=57.29577951472;
  583. const double a=6.378245000e+06;
  584. const double e2=0.00669342162297;
  585. const double e12=0.00673852541468;
  586. const double c0=0.157046064172e-06;
  587. const double c1=0.005051773759;
  588. const double c2=0.000029837302;
  589. const double c3=0.000000238189;
  590. double bf0=c0*X;
  591. double bf0c=Math.Cos(bf0);
  592. double bf0s=Math.Sin(bf0);
  593. double bf=bf0+bf0c*(c1*bf0s-c2*Math.Pow(bf0s,3)+c3*Math.Pow(bf0s,5));
  594. double bt=Math.Tan(bf);
  595. double bc=Math.Cos(bf);
  596. double bs=Math.Sin(bf);
  597. double bi=e12*Math.Pow(bc,2);
  598. double v2=1.0e+0+bi;
  599. double bn=a/Math.Sqrt(1.0-e2*Math.Pow(bs,2));
  600. double yn=Y/bn;
  601. /*calculate lantitude b */
  602. double b1=-v2*bt*Math.Pow(yn,2)/2.0;
  603. double b2=-(5.0+3.0*Math.Pow(bt,2)+bi-9.0*bi*Math.Pow(bt,2))*b1*Math.Pow(yn,2)/12.0;
  604. double b3=(61.0+90.0*Math.Pow(bt,2)+45.0*Math.Pow(bt,4))*b1*Math.Pow(yn,4)/360.0;
  605. B = bf+b1+b2+b3;
  606. B = B * p;
  607. /* calculate the longitude l */
  608. double l1=yn/bc;
  609. double l2=-(1.0+2.0*Math.Pow(bt,2)+bi)*l1*Math.Pow(yn,2)/6.0;
  610. double l3=(5.0+28.0*Math.Pow(bt,2)+24.0*Math.Pow(bt,4)+6.0*bi
  611. +8.0*bi*Math.Pow(bt,2))*l1*Math.Pow(yn,4)/120.0;
  612. L=l1+l2+l3;
  613. L=L * p;
  614. L=L + L0;
  615. if(L > 360.0)
  616. L=L - 360.0;
  617. }
  618. private void CalGuassToLB(double dX, double dY, ref double dLongitude, ref double dLatitude) 
  619. {
  620. // TODO: Add your dispatch handler code here
  621. double L0;
  622. int nZoonNum;
  623. nZoonNum = (int)(dY/(1.0E+6));
  624. L0 = nZoonNum * 6-3;
  625. dY = dY - nZoonNum*1.0E+6;
  626. SubGussFs(dX,dY-500000,L0,ref dLatitude,ref dLongitude);
  627. dLongitude = dLongitude + nZoonNum*6 - 3 ;
  628. }
  629. private void CalGuassFromLB(double dLongitude, double dLatitude, ref double dX, ref double dY, long nCenterL) 
  630. {
  631. // TODO: Add your dispatch handler code here
  632. int CenterL = (int)nCenterL;
  633. SubGussFs(ref dX,ref dY,dLatitude,dLongitude,CenterL);
  634. nCenterL = (long)CenterL;
  635. }
  636. private double CalcLenght(MPoint[] pt,int nSize)
  637. {
  638. double dLength = 0;
  639. double x1=0,x2=0,y1=0,y2=0;
  640. int nCenterL = ((int)(pt[0].x)/6+1)*6-3; 
  641. for(int i=0;i<nSize-1;i++)
  642. {
  643. CalGuassFromLB(pt[i].x, pt[i].y, ref x1, ref y1, nCenterL);
  644. CalGuassFromLB(pt[i+1].x, pt[i+1].y, ref x2, ref y2, nCenterL);
  645. dLength += Math.Sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
  646. }
  647. return dLength;
  648. }
  649. private double CalcArea(MPoint[] pt,int nSize)
  650. {
  651. double dArea = 0;
  652. double x1=0,x2=0,y1=0,y2=0;
  653. int nCenterL = ((int)(pt[0].x)/6+1)*6-3; 
  654. for(int i=0;i<nSize-1;i++)
  655. {
  656. CalGuassFromLB(pt[i].x, pt[i].y, ref x1, ref y1, nCenterL);
  657. CalGuassFromLB(pt[i+1].x, pt[i+1].y, ref x2, ref y2, nCenterL);
  658. dArea += (x2-x1)*(y1+y2)/2;
  659. }
  660. if (dArea < 0)
  661. dArea = 0 - dArea; 
  662. return dArea;
  663. }
  664. public double GetLineLength(MapObjects2.Line line)
  665. {
  666. MPoint[] pt;
  667. int nPtCount;
  668. // double dLength;
  669. MapObjects2.Points pts;
  670. pts = (MapObjects2.Points)line.Parts.Item(0);
  671. nPtCount = pts.Count;
  672.  
  673. if (nPtCount < 2)
  674. return 0.0;
  675. pt = new MPoint[nPtCount];
  676.  
  677. for (int i = 0; i < nPtCount; i ++)
  678. {
  679. MapObjects2.Point point = (MapObjects2.Point)pts.Item(i);
  680. pt[i] = new MPoint(); 
  681. pt[i].x = point.X;
  682. pt[i].y = point.Y; 
  683. }
  684. return CalcLenght(pt, nPtCount);
  685. }
  686. public double GetPolygonLength(MapObjects2.Polygon poly)
  687. {
  688. MPoint[] pt;
  689. int nPtCount;
  690. MapObjects2.Points pts;
  691. pts = (MapObjects2.Points)poly.Parts.Item(0);
  692. nPtCount = pts.Count;
  693.  
  694. if (nPtCount < 2)
  695. return 0.0;
  696. pt = new MPoint[nPtCount+1];
  697.  
  698. for (int i = 0; i < nPtCount; i ++)
  699. {
  700. MapObjects2.Point point = (MapObjects2.Point)pts.Item(i);
  701. pt[i] = new MPoint(); 
  702. pt[i].x = point.X;
  703. pt[i].y = point.Y; 
  704. }
  705. pt[nPtCount] = new MPoint(); 
  706. pt[nPtCount].x = pt[0].x;
  707. pt[nPtCount].y = pt[0].y;
  708. return CalcLenght(pt, nPtCount+1);
  709. }
  710. public double GetPolygonArea(MapObjects2.Polygon poly)
  711. {
  712. MPoint[] pt;
  713. int nPtCount;
  714. MapObjects2.Points pts;
  715. pts = (MapObjects2.Points)poly.Parts.Item(0);
  716. nPtCount = pts.Count;
  717.  
  718. if (nPtCount < 3)
  719. return 0.0;
  720. pt = new MPoint[nPtCount+1];
  721.  
  722. for (int i = 0; i < nPtCount; i ++)
  723. {
  724. MapObjects2.Point point = (MapObjects2.Point)pts.Item(i);
  725. pt[i] = new MPoint(); 
  726. pt[i].x = point.X;
  727. pt[i].y = point.Y; 
  728. }
  729. pt[nPtCount] = new MPoint(); 
  730. pt[nPtCount].x = pt[0].x;
  731. pt[nPtCount].y = pt[0].y;
  732. return CalcArea(pt, nPtCount+1);
  733. }
  734. private void CreatePolygon(double dCenterX,double dCenterY,double dR,ref MPoint[] pPoints,ref int nSize)
  735. {
  736. long nCenterL = ((long)(dCenterX)/6+1)*6-3; 
  737. double ncx=0.0,ncy=0.0;
  738. CalGuassFromLB(dCenterX, dCenterY, ref ncx, ref ncy, nCenterL);
  739. const int nPointNumber = 20;
  740. const double PI = 3.1415926;
  741. pPoints = new MPoint[nPointNumber+1];
  742. double x1,y1;
  743. double x2=0.0,y2=0.0;
  744. for(int i=0;i<nPointNumber;i++)
  745. {
  746. x1 = dCenterX + dR * Math.Cos(2*PI/nPointNumber*i);
  747. y1 = dCenterY + dR * Math.Sin(2*PI/nPointNumber*i);
  748. CalGuassToLB(x1, y1, ref x2, ref y2);
  749. pPoints[i].x = x2;
  750. pPoints[i].y = y2;
  751. }
  752. pPoints[nPointNumber] = pPoints[0];
  753. nSize = nPointNumber + 1;
  754. }
  755. public void CreatePolygon(MapObjects2.Polygon poly, double x, double y, double dLength)
  756. {
  757. MPoint[] pts = null;
  758. int nSize = 0;
  759. CreatePolygon(x,y,dLength,ref pts,ref nSize);
  760. poly.Parts.Count = 1;
  761. MapObjects2.Points points = (MapObjects2.Points)poly.Parts.Item(0);
  762. points.Count = nSize;
  763. for (int i = 0; i < nSize; i ++)
  764. {
  765. points.Item(i).X = pts[i].x;
  766. points.Item(i).Y = pts[i].y;
  767. }
  768. }
  769. public long SearchByDistance(double dX, double dY,double dDistance, System.Windows.Forms.ListBox listBox)
  770. {
  771. bool bClosest = false;
  772. if (dDistance <= 0.0)
  773. {
  774. bClosest = true;
  775. dDistance = 1000000000;
  776. }
  777. listBox.DataSource = null;
  778. listBox.Items.Clear();
  779. for (int i = 0; i < this.m_nLayerNum; i ++)
  780. {
  781. if (this.m_layerInfos[i].bSelected
  782. && this.m_layerInfos[i].layer.shapeType ==  MapObjects2.ShapeTypeConstants.moShapeTypePoint)
  783. {
  784. MapObjects2.Recordset rs = null;
  785. string szPlaceName = "";
  786. double dMinDist = -1.0;
  787. double dDist = 0.0;
  788. rs = this.m_layerInfos[i].layer.Records;
  789.  
  790. if (rs != null)
  791. {
  792. rs.MoveFirst();
  793.  
  794. while (!rs.EOF)
  795. {
  796. MPoint[] pts=new MPoint[2];
  797.  
  798. MapObjects2.Point pt;
  799. pt = (MapObjects2.Point)rs.Fields.Item("shape").Value;
  800. pts[0] = new MPoint();
  801. pts[0].x = dX;
  802. pts[0].y = dY;
  803. pts[1] = new MPoint();
  804. pts[1].x = pt.X ;
  805. pts[1].y = pt.Y;
  806. dDist = this.CalcLenght(pts, 2);
  807. if (dDistance >= this.CalcLenght(pts, 2))
  808. {
  809. if (bClosest)
  810. {
  811. //查找最近
  812. string szTemp = rs.Fields.Item("名称").Value.ToString();
  813. if (szTemp == "")
  814. continue;
  815. if (((dMinDist < 0) || (dMinDist > dDist)) && (!this.m_szPlaceName.Equals(szTemp)))
  816. {
  817. dMinDist = dDist;
  818. szPlaceName = szTemp;
  819. }
  820. }
  821. else
  822. {
  823. listBox.Items.Add(rs.Fields.Item("名称").Value.ToString()); 
  824. }
  825. }
  826. rs.MoveNext(); 
  827. }
  828. if (bClosest && (szPlaceName != "") && (!this.m_szPlaceName.Equals(szPlaceName)) )
  829. listBox.Items.Add(szPlaceName); 
  830. }
  831. }
  832. else
  833. {
  834. this.m_layerInfos[i].rsSel = null;
  835. }
  836. }
  837. return listBox.Items.Count;  
  838. }
  839. public bool IsImage(string szName)
  840. {
  841. string strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + m_szDBName + 
  842. ";Persist Security Info=False";
  843. System.Data.OleDb.OleDbConnection  myConnection = new System.Data.OleDb.OleDbConnection(strConnectionString);   
  844. myConnection.Open();
  845. System.Data.DataSet dataSet = new System.Data.DataSet("临时库");
  846. System.Data.OleDb.OleDbDataAdapter myDataAdapter;
  847. string szSQL;
  848. szSQL = "Select * From 多媒体索引 Where 名称 ='"+szName+"'";
  849. myDataAdapter = new System.Data.OleDb.OleDbDataAdapter(szSQL,myConnection);
  850. myDataAdapter.Fill(dataSet,"多媒体索引");
  851. System.Data.DataTable indexTbl = dataSet.Tables["多媒体索引"];
  852. System.Data.DataRow[] rowsType = indexTbl.Select();
  853. if (0 == rowsType.Length)
  854. return false;
  855. return true;
  856. }
  857. public MLine  CreateLine(MapObjects2.Line moline)
  858. {
  859. MLine line = new MLine();
  860. MapObjects2.Points pts = (MapObjects2.Points)moline.Parts.Item(0);
  861. line.nPointNumber = pts.Count;
  862. line.pPoint = new MPoint[line.nPointNumber]; 
  863. for (int i = 0; i < line.nPointNumber; i++)
  864. {
  865. MapObjects2.Point pt = (MapObjects2.Point)pts.Item(i); 
  866. line.pPoint[i] = new MPoint(); 
  867. line.pPoint[i].x = pt.X;
  868. line.pPoint[i].y = pt.Y;
  869. }
  870. return line;
  871. }
  872. public MapObjects2.Point GetPoint(string szName)
  873. {
  874. MapObjects2.Point pt = null;
  875. string szLayer = GetLayerName(szName,"地名索引");   
  876. string szTable = GetTableName(szName,"地名索引");
  877. if ("" == szTable)
  878. {
  879. return null;
  880. }
  881. int nIndex =  GetLayerIndexByName(szTable); 
  882. if (nIndex < 0)
  883. return null;
  884. // if (!m_layerInfos[nIndex].layer.Visible)
  885. // {
  886. // return null;
  887. // }
  888. //
  889. MapObjects2.Recordset rs;
  890. rs = m_layerInfos[nIndex].layer.SearchExpression("名称 like '" + szName + "'");
  891. if (rs != null)
  892. {
  893. rs.MoveFirst();
  894.  
  895. if (!rs.EOF) 
  896. {
  897. switch (m_layerInfos[nIndex].layer.shapeType)
  898. {
  899. case MapObjects2.ShapeTypeConstants.moShapeTypePoint:
  900. {
  901. pt = (MapObjects2.Point)rs.Fields.Item("shape").Value;
  902. }
  903. break;
  904. case MapObjects2.ShapeTypeConstants.moShapeTypeLine:
  905. {
  906. MapObjects2.Line line;
  907. line = (MapObjects2.Line)(rs.Fields.Item("shape").Value);
  908. pt = line.Extent.Center;  
  909. }
  910. break;
  911. case MapObjects2.ShapeTypeConstants.moShapeTypePolygon:
  912. {
  913. MapObjects2.Polygon  poly;
  914. poly = (MapObjects2.Polygon)(rs.Fields.Item("shape").Value);
  915. pt = poly.Extent.Center;  
  916. }
  917. break;
  918. }
  919. }
  920. return pt;
  921. }
  922. public MapObjects2.Line GetLine(string szName)
  923. {
  924. MapObjects2.Line line = null;
  925. string szLayer = GetLayerName(szName,"地名索引");   
  926. string szTable = GetTableName(szName,"地名索引");
  927. if ("" == szTable)
  928. {
  929. return null;
  930. }
  931. int nIndex =  GetLayerIndexByName(szTable); 
  932. if (nIndex < 0)
  933. return null;
  934. // if (!m_layerInfos[nIndex].layer.Visible)
  935. // {
  936. // return null;
  937. // }
  938. MapObjects2.Recordset rs;
  939. rs = m_layerInfos[nIndex].layer.SearchExpression("名称 like '" + szName + "'");
  940. if (rs != null)
  941. {
  942. rs.MoveFirst();
  943.  
  944. if (!rs.EOF) 
  945. {
  946. switch (m_layerInfos[nIndex].layer.shapeType)
  947. {
  948. case MapObjects2.ShapeTypeConstants.moShapeTypePoint:
  949. return line;
  950. case MapObjects2.ShapeTypeConstants.moShapeTypeLine:
  951. line = (MapObjects2.Line)(rs.Fields.Item("shape").Value);
  952. break;
  953. case MapObjects2.ShapeTypeConstants.moShapeTypePolygon:
  954. return line;
  955. default:
  956. break;
  957. }
  958. }
  959. return line;
  960. }
  961. public MPoint FromMapPoint(AxMapObjects2.AxMap map, double x,double y)
  962. {
  963. MPoint pt = new MPoint();
  964. double dW = System.Math.Abs( map.Extent.Right - map.Extent.Left);
  965. double dH = System.Math.Abs(map.Extent.Top-map.Extent.Bottom)  ;
  966. double dRatio = 1.0;
  967. double dOrgX=0;
  968. double dOrgY=0;
  969. if(map.Width/dW>map.Height/dH) //横向居中
  970. {
  971. dRatio = map.Height /dH;
  972. dOrgX = (map.Width-dW*dRatio)/2;
  973. }
  974. else if(map.Width/dW<map.Height/dH) //纵向居中
  975. {
  976. dRatio = map.Width /dW;
  977. dOrgY = (map.Height-dH*dRatio)/2;
  978. }
  979. pt.x  = (x-map.Extent.Left)*dRatio+dOrgX;
  980. pt.y  = map.Height-(y-map.Extent.Bottom)*dRatio+dOrgY;
  981. return pt;
  982. }
  983. public void DrawLine( AxMapObjects2.AxMap map)
  984. {
  985. if (m_drawLine == null)
  986. return;
  987. System.Drawing.Graphics g = System.Drawing.Graphics.FromHwnd((System.IntPtr)map.hWnd);
  988. System.Drawing.Pen pen = new System.Drawing.Pen(System.Drawing.Color.Red,3); 
  989.  
  990. for (int i = 0; i < m_drawLine.Length; i ++)
  991. {
  992. System.Drawing.Point[] pts = new System.Drawing.Point[m_drawLine[i].nPointNumber];
  993. for (int j = 0; j < m_drawLine[i].nPointNumber; j ++)
  994. {
  995. MPoint pt =FromMapPoint(map,m_drawLine[i].pPoint[j].x,m_drawLine[i].pPoint[j].y);
  996. pts[j] = new System.Drawing.Point((int)pt.x,(int)pt.y ); 
  997. }
  998. g.DrawLines(pen,pts);
  999. }
  1000.   
  1001. }
  1002. /// //////////////////////////////////////////////////////////////////////////////////////////////
  1003. /// 功能:计算地图比例尺
  1004. /// 参数:AxMapObjects2.AxMap map
  1005. /// 返回值:地图比例尺
  1006. /// /////////////////////////////////////////////////////////////////////////////////////////////
  1007. public double CalcScale(AxMapObjects2.AxMap map)
  1008. {
  1009. System.Drawing.Graphics g = System.Drawing.Graphics.FromHwnd((System.IntPtr)map.hWnd);
  1010. MPoint[] pts = new MPoint[2];
  1011. pts[0] = new MPoint();
  1012. pts[0].x = map.Extent.Left;
  1013. pts[0].y = map.Extent.Top;
  1014. pts[1] = new MPoint();
  1015. pts[1].x = map.Extent.Right;
  1016. pts[1].y = map.Extent.Top;
  1017.   
  1018. double dLen1 = this.CalcLenght(pts,2);
  1019.  
  1020. double dLen2 = map.Width / g.DpiX * 2.54 /100;
  1021.  
  1022. return dLen1 / dLen2;
  1023. }
  1024. /// //////////////////////////////////////////////////////////////////////////////////////////////
  1025. /// 功能:计算地图比例尺
  1026. /// 参数:AxMapObjects2.Rectangle extent
  1027. /// 返回值:地图比例尺
  1028. /// /////////////////////////////////////////////////////////////////////////////////////////////
  1029. public double CalcScale(AxMapObjects2.AxMap map,MapObjects2.Rectangle extent)
  1030. {
  1031. System.Drawing.Graphics g = System.Drawing.Graphics.FromHwnd((System.IntPtr)map.hWnd);
  1032. MPoint[] pts = new MPoint[2];
  1033. pts[0] = new MPoint();
  1034. pts[0].x = extent.Left;
  1035. pts[0].y = extent.Top;
  1036. pts[1] = new MPoint();
  1037. pts[1].x = extent.Right;
  1038. pts[1].y = extent.Top;
  1039.   
  1040. double dLen1 = this.CalcLenght(pts,2);
  1041.  
  1042. double dLen2 = map.Width / g.DpiX * 2.54 /100;
  1043.  
  1044. return dLen1 / dLen2;
  1045. }
  1046. /// //////////////////////////////////////////////////////////////////////////////////////
  1047. //功能:得到公交线路上车站
  1048. //参数:[in]object node 乘车路线结构
  1049. //      [in]int nIndex 第几次换乘
  1050. //      [out]Buses buses 车站数组
  1051. //      [out]int nCount 车站数目
  1052. //返回值:true 成功
  1053. /// //////////////////////////////////////////////////////////////////////////////////////
  1054. public bool GetStation(object node, int nIndex,Buses buses, ref int nCount)
  1055. {
  1056. PathNode line = (PathNode)node;
  1057. int nOrder1,nOrder2;
  1058. nOrder1 = GetStationOrder(line.szRoutineName[nIndex],line.szFromStationName[nIndex]);  
  1059. nOrder2 = GetStationOrder(line.szRoutineName[nIndex],line.szToStationName[nIndex]);  
  1060. if ((nOrder1 < 0) || (nOrder2 < 0))
  1061. return false;
  1062. string strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + m_szDBName + 
  1063. ";Persist Security Info=False";
  1064. System.Data.OleDb.OleDbConnection  myConnection = new System.Data.OleDb.OleDbConnection(strConnectionString);   
  1065. myConnection.Open();
  1066. System.Data.DataSet dataSet = new System.Data.DataSet("临时库");
  1067. System.Data.OleDb.OleDbDataAdapter myDataAdapter;
  1068. string szSQL;
  1069. szSQL = "Select * From 公交车站路线 " +  " Where 线路名 ='"+line.szRoutineName[nIndex]+"' And 顺序 Between "+nOrder1.ToString() +" And "+nOrder2.ToString() ;
  1070. myDataAdapter = new System.Data.OleDb.OleDbDataAdapter(szSQL,myConnection);
  1071. myDataAdapter.Fill(dataSet,"索引");
  1072. System.Data.DataTable indexTbl = dataSet.Tables["索引"];
  1073. System.Data.DataRow[] rowsType = indexTbl.Select();
  1074. if (0 == rowsType.Length)
  1075. return false;
  1076. foreach (System.Data.DataRow myRow in rowsType)
  1077. {
  1078. buses.pts[nCount]  = new MPoint();
  1079. string szStation = "";
  1080. szStation = myRow["站名"].ToString();
  1081. if (!GetStationPt(szStation,buses.pts[nCount]))
  1082. {
  1083. buses.pts[nCount].x = -1;
  1084. buses.pts[nCount].y = -1;
  1085. }
  1086. nCount ++;
  1087. }
  1088. return true;
  1089. }
  1090. /// //////////////////////////////////////////////////////////////////////////////////////
  1091. //功能:得到公交线路上车站
  1092. //参数:[in]string szLineName 公交线路名
  1093. //      [out]Buses buses 车站数组
  1094. //      [out]int nCount 车站数目
  1095. //返回值:true 成功
  1096. /// //////////////////////////////////////////////////////////////////////////////////////
  1097. public bool GetStation(string szLineName,Buses buses, ref int nCount)
  1098. {
  1099. string strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + m_szDBName + 
  1100. ";Persist Security Info=False";
  1101. System.Data.OleDb.OleDbConnection  myConnection = new System.Data.OleDb.OleDbConnection(strConnectionString);   
  1102. myConnection.Open();
  1103. System.Data.DataSet dataSet = new System.Data.DataSet("临时库");
  1104. System.Data.OleDb.OleDbDataAdapter myDataAdapter;
  1105. string szSQL;
  1106. szSQL = "Select * From 公交车站路线 " +  " Where 线路名 ='"+szLineName +"'" ;
  1107. myDataAdapter = new System.Data.OleDb.OleDbDataAdapter(szSQL,myConnection);
  1108. myDataAdapter.Fill(dataSet,"索引");
  1109. System.Data.DataTable indexTbl = dataSet.Tables["索引"];
  1110. System.Data.DataRow[] rowsType = indexTbl.Select();
  1111. if (0 == rowsType.Length)
  1112. return false;
  1113. foreach (System.Data.DataRow myRow in rowsType)
  1114. {
  1115. buses.pts[nCount]  = new MPoint();
  1116. string szStation = "";
  1117. szStation = myRow["站名"].ToString();
  1118. if (!GetStationPt(szStation,buses.pts[nCount]))
  1119. {
  1120. buses.pts[nCount].x = -1;
  1121. buses.pts[nCount].y = -1;
  1122. }
  1123. nCount ++;
  1124. }
  1125. return true;
  1126. }
  1127. public MapObjects2.MapLayer GetLayerByName(string szName)
  1128. {
  1129. int i;
  1130. for (i = 0; i < this.m_nLayerNum - 1; i ++)
  1131. {
  1132. if (this.m_layerInfos[i].szName.Equals(szName))
  1133. break;
  1134. }
  1135. if (i == this.m_nLayerNum)
  1136. return null; ;
  1137. return m_layerInfos[i].layer; 
  1138. }
  1139. public bool IsStation(AxMapObjects2.AxMap map,string szName)
  1140. {
  1141. int i;
  1142. for (i = 0; i < this.m_nLayerNum ; i ++)
  1143. {
  1144. if (this.m_layerInfos[i].szName.Equals(CEnvironment.BUSSTATION_LAYERNAME))
  1145. break;
  1146. }
  1147. if (i == this.m_nLayerNum)
  1148. return false;
  1149. MapObjects2.MapLayer ly = m_layerInfos[i].layer; 
  1150. MapObjects2.Recordset rs = ly.SearchExpression("名称 like '"+szName +"'");;
  1151. if (rs == null)
  1152. return false;
  1153. rs.MoveFirst();
  1154.  
  1155. if (rs.EOF) 
  1156. return false;
  1157. return true;
  1158. }
  1159. public bool IsBusLine(AxMapObjects2.AxMap map,string szName)
  1160. {
  1161. int i;
  1162. for (i = 0; i < this.m_nLayerNum; i ++)
  1163. {
  1164. if (this.m_layerInfos[i].szName.Equals(CEnvironment.BUSLINE_LAYERNAME))
  1165. break;
  1166. }
  1167. if (i == this.m_nLayerNum)
  1168. return false;
  1169. MapObjects2.MapLayer ly = m_layerInfos[i].layer;  
  1170. MapObjects2.Recordset rs = ly.SearchExpression("名称 like '"+szName +"'");;
  1171. if (rs == null)
  1172. return false;
  1173. rs.MoveFirst();
  1174.  
  1175. if (rs.EOF) 
  1176. return false;
  1177. return true;
  1178. }
  1179. /// ////////////////////////////////////////////////////////////////////////////////////////////
  1180. /// 功能:得到给定的车站名的地理坐标
  1181. /// 参数:[in]string szLineName 公交线路名
  1182. ///   [out]MPoint pt 公交车的地理坐标
  1183. /// 返回值:false 失败
  1184. /// ////////////////////////////////////////////////////////////////////////////////////////////
  1185. public bool GetStationPt(string szStationName, MPoint pt)
  1186. {
  1187. string szName = szStationName;
  1188. string szLayer = GetLayerName(szName,"地名索引");   
  1189. string szTable = GetTableName(szName,"地名索引");
  1190. int nIndex =  GetLayerIndexByName(szTable); 
  1191. if (nIndex < 0)
  1192. return false;
  1193. MapObjects2.Recordset rs;
  1194. rs = m_layerInfos[nIndex].layer.SearchExpression("名称 like '"+szName +"'");
  1195. if (rs != null)
  1196. {
  1197. rs.MoveFirst();
  1198.  
  1199. if (!rs.EOF) 
  1200. {
  1201. MapObjects2.Point pt1;
  1202. pt1 = (MapObjects2.Point)rs.Fields.Item("shape").Value;
  1203. pt.x = pt1.X;
  1204. pt.y = pt1.Y;
  1205. return true;
  1206. }
  1207. }
  1208. return false;
  1209. }
  1210. /// ////////////////////////////////////////////////////////////////////////////////////////////
  1211. /// 功能:得到给定的车站名在给定的公交线路上的车站顺序(如第2站)
  1212. /// 参数:[in]string szLineName 公交线路名
  1213. ///   [in]string szStationName 公交车站名
  1214. /// 返回值:> 0 车站顺序,否则失败
  1215. /// ////////////////////////////////////////////////////////////////////////////////////////////
  1216. public int GetStationOrder(string szLineName, string szStationName)
  1217. {
  1218. string strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + m_szDBName + 
  1219. ";Persist Security Info=False";
  1220. System.Data.OleDb.OleDbConnection  myConnection = new System.Data.OleDb.OleDbConnection(strConnectionString);   
  1221. myConnection.Open();
  1222. System.Data.DataSet dataSet = new System.Data.DataSet("临时库");
  1223. System.Data.OleDb.OleDbDataAdapter myDataAdapter;
  1224. string szSQL;
  1225. szSQL = "Select * From 公交车站路线 " +  " Where 线路名 ='"+szLineName+"' And 站名 ='"+szStationName+" '";
  1226. myDataAdapter = new System.Data.OleDb.OleDbDataAdapter(szSQL,myConnection);
  1227. myDataAdapter.Fill(dataSet,"索引");
  1228. System.Data.DataTable indexTbl = dataSet.Tables["索引"];
  1229. System.Data.DataRow[] rowsType = indexTbl.Select();
  1230. if (0 == rowsType.Length)
  1231. return -1;
  1232. return (int)rowsType[0]["顺序"];
  1233. }
  1234. }
  1235. }