熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

微軟地圖MapPoint2004編程簡介(圖)

2022-06-13   來源: Java核心技術 

  如果你還不了解微軟的MapPoint相關產品和服務建議去看一下MSDN上的《MapPoint 與 MapPoint Web 服務該使用哪一個》這篇文章這裡為了給讀者一個初步印象引用其中的一段話本文介紹的是如何結合NET開發環境開發基於MapPoint 的應用
  
  MSDN中關於MapPoint 的敘述
  
  MapPoint 是一個桌面地圖信息工具它可以提供奇妙和豐富的用戶體驗具有專題圖形區域管理路線優化和人口統計數據等功能所有必要的數據都安裝在本地因此不需要網絡連接對於 MapPoint 您可以方便地使用多種常見格式(Microsoft ExcelMicrosoft Access開放數據庫連接 (ODBC) 等)導入數據並使用專題圖形(如圖 所示的餅形圖)以圖形方式顯示這些信息
  
 

  
MapPoint

  
  使用 MapPoint您可以采用若干種開發方式
  
  ·創建 COM 外接程序以擴展 MapPoint 的功能
  
  ·使用 MapPoint 附帶的 ActiveX 控件將圖形嵌入到您自己的 Microsoft Visual Basic 應用程序中
  
  ·在其他應用程序(例如Microsoft Word 或 Excel)中使用 Microsoft Visual Basic for Applications 自動實現 MapPoint 和其他應用程序之間的連接
  
  ·使用 Visual Basic(或任何其他與 COM 兼容的編程語言)創建自動執行 MapPoint 的可執行文件或動態鏈接庫 (DLL)
  
  以上內容節選自MSDN
  
  正文
  
  簡介
  
  MapPoint 給程序員提供了豐富的對象模型來開發強大的商業化的智能地圖定位應用不過它是基於COM的思想設計的所以如果你使用NET Framework來編寫應用程序的話你必須結合使用COM的類庫
  
  本文通過開發一個地址查找程序講解了如何一步步是使用NET Framework來開發基於MapPoint 的應用同時也介紹了開發時需要注意的一些地方和解決方法
  
  使用MapPoint編程
  
  就像前文所說你必須結合使用MapPoint COM庫才能使用微軟的NET Framework進行編程如果你使用Visual Studio NET你可以在創建新工程之後選擇project樹型列表項中的Add Reference選項來添加
  
 

  
MapPoint

  
  當看到Add Reference對話框窗口出現時選擇COM的Tab頁並且從列表中選擇Microsoft MapPoint Object Library ( )來添加一個對MapPoint類型庫的引用如下
  

  
MapPoint

  
  下面開始編寫C#程序首先需要引進MapPoint 命名空間
  
  //Add MapPoint namespace
  using MapPoint;
  
  引入命名空間之後使用起MapPoint類型就非常方便了
  
  下一步是創建一個MapPoint 的應用對象
  
  //Define an application instance
  ApplicationClass app = null;
  //Create an application class instance
  app = new ApplicationClass();
  
  MapPoint 應用實例(application instance)提供了一個活動的地圖實例來完成面向地圖定位的人物這個例子裡我將使用這個實例來查找一個地址
  
  //Now get the location
  FindResults frs = appActiveMapFindAddressResults( stringEmpty WA null);
  
  你可能已經注意到了FindAddressResults方法返回的FindResults是一個查詢到的地點的集合有兩種方法可以從FindResults實例中獲取地點的列表
  
   獲取一個enumerator並且枚舉整個地點的列表如果你想提供符合條件的地址的列表這樣的方式比較有用
  
  //Get an enumerator
  IEnumerator ienum = frsGetEnumerator();
  //Loop through the enumerator
  while(ienumMoveNext())
  {
  Location loc = ienumCurrent as Location;
  if(loc != null)
  {
  //process the location
  string s = locStreetAddressValue;
  }
  }
  
   使用get/set訪問方法來用索引獲得地點這個方法在你需要獲得某個特殊項但又不想循環整個列表時比較有用如查找第一個相符合的記錄
  
  //Define an index
  object index = ;
  //Access the location item using the accessor method
  location = frsget_Item(ref index) as Location;
  
  這裡必須使用get_Item和set_Item方法進行按照索引對記錄進行的操作
  
  最後當你做完上述的操作之後你必須記住要關閉應用程序對象來確保MapPoint 的應用程序實例不會保留在內存中可以使用如下代碼
  
  //Quit the application
  if(app != null)
  appQuit();
  app = null;
  
  以下代碼完整的列出了一個根據上文的方法查找地址的函數
  
  //Define an application instance
  ApplicationClass app = null;
  //Define a location instance
  Location location = null;
  //Define a FindResults instance
  FindResults frs = null;
  try
  {
  //Create an application class
  app = new ApplicationClass();
  //Now get the location
  frs = appActiveMapFindAddressResults( stringEmpty WA null);
  //Check if the find query is succesfull
  if(frs != null && frsCount > )
  {
  object index = ;
  location = frsget_Item(ref index) as Location;
  //Male the MapPoint application visible
  //and go to that location
  appVisible = true;
  locationGoTo();
  //Do your processing with the location
  MessageBoxShow(locationStreetAddressValue);
  }
  }
  catch(Exception ex)
  {
  string message = exMessage;
  }
  finally
  {
  if(app != null)
  {
  try
  {
  appQuit();
  }
  catch
  {
  //This means your app has already quit!
  }
  finally
  {
  app = null;
  }
  }
  }
  
  需要注意的地方
  
  使用可選參數的方法進行編程
  
  當你使用有可選參數的方法時如果你沒有傳遞有效的參數你必須使用缺失類型SystemReflectionMissingValue比如DisplayDataMap函數如下
  
  DisplayDataMap([DataMapType] [DataField] [ShowDataBy] [CombineDataBy] [DataRangeType] [DataRangeOrder] [ColorScheme] [DataRangeCount] [ArrayOfCustomValues] [ArrayOfCustomNames] [DivideByField] [ArrayOfDataFieldLabels] [ArrayOfPushpinSymbols])
  
  可以看到所有的參數都是可選參數這裡就必須用到NET Framework裡的缺失類型了下面的代碼展示了如何使用
  
  //Define a missing value type
  object missing = SystemReflectionMissingValue;
  //Use the missing type for optional parameters that are not needed
  DataMap mydatamap =
  mydatasetDisplayDataMap(GeoDataMapTypegeoDataMapTypeShadedArea
  field GeoShowDataBygeoShowByRegion
  GeoCombineDataBygeoCombineByDefault
  GeoDataRangeTypegeoRangeTypeDiscreteLogRanges
  GeoDataRangeOrdergeoRangeOrderDefault
  missing missing missing missing missing);
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26473.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.