`
izuoyan
  • 浏览: 9220832 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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服务的头部值中。

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

分享到:
评论

相关推荐

    Mappoint+SmartPhone+C#地图

    标题中的“Mappoint+SmartPhone+C#地图”指的是使用Microsoft MapPoint API,结合C#编程语言,为智能手机(可能是运行Windows CE或Pocket PC系统)开发地图应用的技术方案。MapPoint是一款由微软提供的地理信息系统...

    MapPoint,SmartPhone和C#-第1部分

    标题中的“MapPoint,SmartPhone和C#-第1部分”揭示了这是一个关于使用Microsoft MapPoint API与C#编程语言相结合,特别是在智能手机平台上开发应用程序的系列教程的第一部分。MapPoint是微软提供的一款地理信息...

    ArcGIS+API+for+JS+开发教程

    **ArcGIS API for JS开发教程** ArcGIS API for JavaScript(简称ArcGIS API for JS)是Esri公司提供的一款用于在Web浏览器中构建地理信息系统(GIS)应用的强大工具。这个开发教程主要聚焦于版本3.7,它包含了丰富...

    C#+arcgis 经典示例 常见问题

    "C#+arcgis 经典示例 常见问题"这个主题,涉及到的是如何使用C#来操作和处理ArcGIS中的数据,尤其是Shp文件,这是一种常见的地理空间数据格式。 Shp文件是ESRI公司的Shapefile格式,通常用来存储地理要素如点、线、...

    mappoint编程知识

    适合对象: MapPoint 2004 MapPoint Web Service Microsoft Location Server MSN Virtual Earth mappoint编程入门,如何开发mappoint。 .NET开发环境 &lt;br&gt;

    C#开发的基于Arcgis二次开发浏览SXD文件

    本项目聚焦于使用C#编程语言进行ArcGIS的二次开发,以实现对SXD(3D Scene Layer Package)文件的浏览功能。SXD文件是Esri公司ArcGIS产品中的3D场景层包,它包含三维地理数据,如建筑物、地形和基础设施等,用于创建...

    精品案例-使用C#开发GIS.pdf

    【C#开发GIS基础】 GIS(Geographic Information System,地理信息系统)是一种用于处理地理空间数据的计算机系统,它集成了数据库管理、统计分析、空间建模等多种功能,为用户提供地图展示、空间分析和决策支持。...

    C#加载地图 C#加载地图

    在C#编程中,加载地图是一项常见的任务,特别是在开发地理信息系统(GIS)或者导航应用时。C#提供了多种方法来实现地图的加载,这通常涉及到使用API、库或者框架。以下是一些关于C#加载地图的关键知识点: 1. **GDI...

    C# + Mapx 地图系统

    在IT领域,C#是一种广泛使用的面向对象的编程语言,尤其在开发Windows应用程序和Web服务时。GIS(Geographic Information System)是地理信息系统,用于处理、分析和展示地理位置相关数据。Mapx是Microsoft MapPoint...

    mappoint web service sdk

    非常适合windows mobile 手机调用

    GMap官网实例(C#)

    总之,GMap.NET是一个功能丰富的地图开发库,它为C#开发者提供了简单易用的接口来实现地图展示、定位、标记、路线规划和离线地图等功能。通过深入学习和实践,你可以利用这个库创建出各种复杂的地图应用。

    programming mappoint in .net

    Interactive web maps generated by MapPoint-Microsoft's popular mapping technology are crucial for businesses in a number of fields, including real estate, package delivery, and commercial air travel....

    Professional.Web.APIs.Google.eBay.PayPal.Amazon..com.MapPoint.FedEx

    - **C#**: 一种面向对象的编程语言,常用于Windows桌面应用和Web应用开发。 - **Java**: 一种广泛使用的通用编程语言,支持跨平台运行。 ### 8. 版权信息 该资料还包含了版权信息,说明了书籍的所有权归属以及使用...

    frommappoint

    最后,C#代码片段展示了如何在ArcEngine中进行像素到地图单位的转换,这是GIS开发中的常见任务,确保在屏幕上显示的地图比例正确: ```csharp private double ConvertPixelsToMapUnits(IActiveView pActiveView, ...

    C#写的ArcSDE连接添加Feature的类

    在GIS(地理信息系统)开发中,ArcSDE是Esri公司提供的一种用于处理大型空间数据的中间件。它允许开发者将空间...在开发过程中,理解ArcSDE的工作原理、熟悉C#与ArcGIS API的使用,以及掌握数据库操作是至关重要的。

    Windows Mobile 开发地图

    在Windows Mobile(WM)平台上开发地图应用,常常会涉及到Microsoft MapPoint SDK的使用。MapPoint SDK为开发者提供了在移动设备上构建地理位置应用的功能,使得我们可以创建具有导航、定位、地图显示等多种功能的...

    Windows Mobile GPS应用开发指南(Video)

    这个平台支持多种编程语言,如C++, C#, Visual Basic .NET等,使得开发者可以根据需求选择合适的开发工具。 2. **GPS API介绍** Windows Mobile提供了GPS API,让开发者能够直接与GPS接收器通信,获取实时的位置...

    谷歌地图使用范例(asp.net c#)

    在本文中,我们将深入探讨如何在ASP.NET C#环境中使用谷歌地图API,通过一个实际的范例程序来解析和理解其关键概念和技术。谷歌地图API是Google提供的一个强大的工具,它允许开发者集成地图功能到自己的Web应用中,...

    MapX从数据库读取数据形成新图层(C#)

    MapX是Bentley Systems公司开发的一个地图控件,它提供了丰富的地理信息系统(GIS)功能,适用于桌面应用程序开发。通过结合C#的强大功能,我们可以构建一个高效的数据可视化解决方案。 首先,我们需要确保已经安装...

    完整的arcgis for js调用天地图示例

    此外, ArcGIS API提供了丰富的API文档和示例代码,可以帮助你解决在开发过程中遇到的具体问题。 总之,结合ArcGIS for JavaScript和天地图,开发者可以创建出功能强大的中国本土化地图应用。不断学习和实践,你将...

Global site tag (gtag.js) - Google Analytics