zoukankan      html  css  js  c++  java
  • MapPoint+SmartPhone+C#开发示例

    本文提供了一些简单的应用程序,它演示了C#如何使用MapPoint SDK,以及如何在SmartPhone上显示地图。

      介绍

      在业界迅速迁移到移动领域以获取相关利润的过程中,基于位置的服务和应用很明显领先一步。在技术前端,微软已经在所有这些相关技术领域中建立了牢固的地位。

      对于基于位置的应用程序来说,新的MapPoint SDK 3.5提供了一个XML Web服务,使我们能够建立起基于位置的服务。这个SDK帮助我们获取高质量的地图,该地图还标识出了特定的位置(例如pizza店、医院等),还提供了到达目把地点的路线图。你可以下载这个SDK

      在移动(Mobility)操作系统方面,的SmartPhone和PPC为微软建立起强大的地位。
     
      在本文中,我们将基于MapPoint SDK,使用C#建立一些简单的应用程序。我们将先在微软SmartPhone上显示一个指定地点的地图。

      我们先介绍一下MapPoint。MapPoint暴露了四个Web服务:

      1.查找服务--帮助我们定位地址、检索经纬度、地理实体。

      2.显示服务--这个服务允许我们显示指定地址的地图,并设置被显示地图的大小和视图。同时,我们还可以设定"图钉",可以作为阅读器的可视化标记。

      3.路线服务--这个服务允许我们生成路线、计算两个地点之间的距离并提供驾车方向。

      4.通用服务--它是一些工具,是上述的三个Web服务公用部分。提供一些服务,例如国家信息和地图数据源信息。

      如果要使用MapPoint Web服务,你就必须获得一个开发者帐号。点击这个链接进行注册。你可以注册并收到一个评估帐号,如果你是MSDN订户,就可以收到为期1年的免费订阅。

      好了,下面我们进行代码分析。

      我会分解应用程序的代码。但是我强烈推荐你阅读MapPoint SDK的基础知识。解释这些相同的内容是重复的,没有增加任何价值。


      显示指定的地图

      下载并打开项目解决方案。现在,打开MapPointWrapper.cs,用你自己的MapPoint开发者用户名、密码代替_mapPointUserName和_mapPointPassword常量字符串。

      Form1.cs包含一个Menu对象,它将获取被显示的地图的地址的详细信息。


      点击"Get Map"菜单,会建立一个address对象,它已经被设置为"MapPoint.NA"。下面是一些可以使用的数据源。

      1. MapPoint.EU - 欧洲

      2. MapPoint.NA - 北美洲

      3. MapPoint.BR - 巴西

      4. MapPoint.World - 世界

      5. MapPoint.Moon - 月脉图

      下面的代码将使用FindServiceSoap Web服务,根据指定的地址检索位置信息。该Web服务必须通过MapPoint开发者帐号认证。我们必须提供数据源名称和地址。

    public static void GetAddress(Address address, string DataSourceName,
    out indResults Location, out ViewByHeightWidth[] Views)
    {
     try
     {
      FindServiceSoap locationService = new FindServiceSoap();
      locationService.Credentials = new System.Net.NetworkCredential(_mapPointUserName,_mapPointPassword);

      locationService.PreAuthenticate = true;

      FindAddressSpecification locationData = new FindAddressSpecification();
      locationData.DataSourceName = DataSourceName;
      locationData.InputAddress = address;

      Location = locationService.FindAddress(locationData);

      Views = new ViewByHeightWidth[1];
      Views[0] = Location.Results[0].FoundLocation.BestMapView.ByHeightWidth;
     }
     catch(Exception ex)
     {
      throw new Exception(ex.Message,ex);
     }
    }

      在获取位置的详细信息之后,这些数据会被进一步发送给GetMap方法。这个方法使用了"RenderServiceSoap"Web服务。这个服务也需要认证信息。MapPoint提供了"图钉",它是一种用于标识地图上的地址的可视化标记。你可以从默认的图标组中选择一个,并设置一个恰当的名称。此外,它还会建立一个MapSpecification对象,它会保持视图、图钉、图像格式等内容。我们调用RenderService的GetMap方法来检索适当的图像,它是作为流检索到的,并用位图显示出来。

    public static Bitmap GetMap(FindResults Location, ViewByHeightWidth[] Views,string DataSourceName,
    Point MapDimensions)
    {
     try
     {
      RenderServiceSoap renderService = new RenderServiceSoap();
      Pushpin[] pushpins = new Pushpin[1];
      MapSpecification mapSpec = new MapSpecification();
      renderService.Credentials = new System.Net.NetworkCredential(_mapPointUserName, _mapPointPassword);
      renderService.PreAuthenticate = true;

      pushpins[0] = new Pushpin();
      pushpins[0].IconDataSource = "MapPoint.Icons";
      pushpins[0].IconName = "0";
      pushpins[0].Label = Location.Results[0].FoundLocation.Entity.Name;
      pushpins[0].LatLong = Views[0].CenterPoint;
      pushpins[0].ReturnsHotArea = true;

      mapSpec.DataSourceName = DataSourceName;
      mapSpec.Views = Views;
      mapSpec.Pushpins = pushpins;
      mapSpec.Options = new MapOptions();
      mapSpec.Options.Format = new ImageFormat();
      mapSpec.Options.Format.Width = MapDimensions.X;
      mapSpec.Options.Format.Height = MapDimensions.Y;
      MapImage[] mapImages = renderService.GetMap(mapSpec);

      System.IO.Stream streamImage = new System.IO.MemoryStream(mapImages[0].MimeData.Bits);
      Bitmap bitmap = new Bitmap(streamImage);
      return bitmap;
     }
     catch(Exception ex)
     {
      throw new Exception(ex.Message,ex);
     }
    }

      我们已经完成了事务。下面就是显示的地图。请注意地图上的"图钉"标识出正确的位置了。

    计算路线和距离

      下面我们将查找两个地址之间的路线,并计算它们之间的距离。

      下载并打开项目解决方案。打开MapPointWrapper.cs并用你自己的MapPoint用户名和密码代替_mapPointUserName和_mapPointPassword常量字符串。

      Form1.cs包含一个Menu对象,它获取被显示地图的地址详细信息。


      点击"Get Route"菜单的时候,会建立地址对象,并把数据源设置为"MapPoint.NA"。现在,我们来查找两个位置之间的路线,需要执行下面一些事务:

      1.识别出地址的纬度和经度。

      2.获取图钉所标识的路线的地图。

      下面的代码使用FindServiceSoap Web服务获取了地址的纬度和经度。FindResults类有属性"LatLong",它会给出给定地址的纬度和经度。

    public static LatLong GetAddress(Address address, string DataSourceName,
    out FindResults Location, out ViewByHeightWidth[] Views)
    {
     try
     {
      FindServiceSoap locationService = new FindServiceSoap();
      locationService.Credentials = new System.Net.NetworkCredential(_mapPointUserName, _mapPointPassword);
      locationService.PreAuthenticate = true;
      FindAddressSpecification locationData = new FindAddressSpecification();
      locationData.DataSourceName = DataSourceName;
      locationData.InputAddress = address;

      Location = locationService.FindAddress(locationData);
      Views = new ViewByHeightWidth[1];
      Views[0] = Location.Results[0].FoundLocation.BestMapView.ByHeightWidth;
      return Location.Results[0].FoundLocation.LatLong;
     }
     catch(Exception ex)
     {
      throw new Exception(ex.Message,ex);
     }
    }

      获取到的纬度和经度被传递到下面的方法中以获取地图:

    public static double GetMapForRoute(out Bitmap[] RouteMaps,
    out ViewByHeightWidth[] Views, LatLong[] LatitudeLongitude,
    string DataSourceName, Point MapDimension)
    {
     RouteServiceSoap routeService = new RouteServiceSoap();
     routeService.Credentials = new System.Net.NetworkCredential(_mapPointUserName,_mapPointPassword);
     routeService.PreAuthenticate = true;

     UserInfoRouteHeader routeUserInfo = new UserInfoRouteHeader();
     routeUserInfo.DefaultDistanceUnit = DistanceUnit.Kilometer;
     routeService.UserInfoRouteHeaderValue = routeUserInfo;

     MapOptions mapOptions = new MapOptions();
     mapOptions.Format = new ImageFormat();
     mapOptions.Format.Width = MapDimension.X;
     mapOptions.Format.Height = MapDimension.Y;

     Route route;
     route = routeService.CalculateSimpleRoute(LatitudeLongitude, DataSourceName, SegmentPreference.Quickest);
     int MapDirectionLength = route.Itinerary.Segments[0].Directions.Length + 1;
     Views = new ViewByHeightWidth[MapDirectionLength];
     RouteMaps = new Bitmap[MapDirectionLength];

     Pushpin[] pushpins = new Pushpin[MapDirectionLength];

     for (int idx = 0; idx <= MapDirectionLength-1; idx++)
     {
      pushpins[idx] = new Pushpin();
      pushpins[idx].IconDataSource = "MapPoint.Icons";
      if(idx != MapDirectionLength-1)
      {
       Views[idx] = route.Itinerary.Segments[0].Directions[idx].View.ByHeightWidth;
       pushpins[idx].IconName = "0";
       pushpins[idx].LatLong = route.Itinerary.Segments[0].Directions[idx].LatLong;
      }
      else
      {
       Views[idx] = route.Itinerary.Segments[1].Directions[0].View.ByHeightWidth;
       pushpins[idx].IconName = "1";
       pushpins[idx].LatLong =
       route.Itinerary.Segments[1].Directions[0].LatLong;
      }
      pushpins[idx].ReturnsHotArea = true;
     }

     MapSpecification MapSpec = new MapSpecification();
     MapSpec.DataSourceName = DataSourceName;
     MapSpec.Options = mapOptions;
     MapSpec.Views = Views;
     MapSpec.Pushpins = pushpins;
     MapSpec.Route = route;
     MapImage[] MapImages;

     RenderServiceSoap renderService = new RenderServiceSoap();
     renderService.Credentials = new System.Net.NetworkCredential(_mapPointUserName,_mapPointPassword);
     renderService.PreAuthenticate = true;
     MapImages = renderService.GetMap(MapSpec);

     for (int idx = 0; idx < MapDirectionLength; idx++)
     {
      RouteMaps[idx] = new Bitmap(new System.IO.MemoryStream(MapImages[idx].MimeData.Bits));
     }
     return route.Itinerary.Segments[0].Distance;
    }

      我们使用"RouteServiceSoap"Web服务来生成RouteMap。在认证之后,就设置好了头部值信息DistanceUnit。该Web服务提供了一个"CalculateSimpleRoute"方法,它会根据相应的纬度和经度数组计算出路线。

      它会返回一个route对象。同时还为路线建立了"图钉"。它再次调用RenderServiceSoap Web服务,但是这次的输出内容是不同的。我们将得到一个地图序列,从地图的开始到末尾。

      下面是显示了路线的地图截屏。




      它是在位图数组上收集并适当地显示在PictureBox上的。"route.Itinerary.Segments[0].Distance;"返回两个地址之间的距离。这个距离可以以英里或公里为单位。其设定在RouteServiceSoap的Web服务的头部值中。

      下面是一个显示了两个地址之间距离的截屏。



  • 相关阅读:
    bzoj 1017 魔兽地图DotR
    poj 1322 chocolate
    bzoj 1045 糖果传递
    poj 3067 japan
    timus 1109 Conference(二分图匹配)
    URAL 1205 By the Underground or by Foot?(SPFA)
    URAL 1242 Werewolf(DFS)
    timus 1033 Labyrinth(BFS)
    URAL 1208 Legendary Teams Contest(DFS)
    URAL 1930 Ivan's Car(BFS)
  • 原文地址:https://www.cnblogs.com/asyuras/p/353138.html
Copyright © 2011-2022 走看看