使用 .NET Compact Framework 入门 MapPoint Web 服务






3.57/5 (11投票s)
演示了如何使用 .NET Compact Framework 的 MapPoint Web 服务
这是 CodeProject CF 文章竞赛的一项参赛作品
引言
分布式计算、移动应用程序和 Web 服务是 IT 行业的热门词汇。智能手机和 Pocket PC 等高度复杂的移动设备被越来越多的人用于各种需求。XML 和 Web 服务已成为分布式计算的标准。如今,开发人员对编写针对移动应用程序的应用程序表现出极大的兴趣,并且由于许多原因,他们在开发此类应用程序时无法忽略 Web 服务。
本文/代码演示了 Web 服务 (MapPoint) 和 .NET Compact Framework 的使用。假设读者对 .NET Compact Framework 有基本了解,但将对 MapPoint Web 服务进行介绍。
MapPoint
Microsoft MapPoint Web 服务是一项具有 SOAP API 的 XML Web 服务,它允许您将基于位置的功能添加到您的应用程序中,该应用程序调用 MapPoint Web 服务的高质量地图以及定位和路线功能。MapPoint Web 服务包含四个组成部分:common、find、render 和 route。本节概述了这些服务中的每一个,以及我在代码中使用的类和方法。我将解释开始使用 MapPoint 所需的一切,但有关 MapPoint 的更全面讨论,请阅读 MapPoint SDK。
公共服务
公共服务包含 find、route 和 render 服务共有的类、方法和属性,或者是一些基本的实用函数。
Address
类包含地址的组成部分:街道、城市、其他城市、地区、国家和邮政编码。
查找服务
查找服务允许您从 MapPoint Web 服务数据中查找地址、地理实体、纬度和经度坐标以及兴趣点,还可以解析地址并返回指定纬度和经度坐标的位置信息。
FindServiceSoap
类包含与调用查找服务相关的方法和属性。FindAddress
方法根据输入地址返回找到的地址列表,按搜索条件匹配程度排序。FindAddressSpecification
类包含在FindServiceSoap.FindAddress
方法中使用的搜索规范。它指定要查找的地址、要使用的搜索选项以及从中获取结果的数据源。
渲染服务
渲染服务允许您渲染路线和找到位置的地图、放置图钉、设置地图大小和地图视图、在地图上选择点、获取地图上点的位置信息、平移和缩放渲染的地图以及创建可点击地图。
RenderServiceSoap
类包含与调用渲染服务相关的方法和属性。MapSpecification
类包含渲染地图的规范。它包括要使用的数据源、地图视图、图钉、路线、选定的实体和地图选项。GetMap
方法根据地图选项返回地图图像、地图视图和热区定义。GetBestMapView
方法返回选定位置或一组位置的最佳地图视图。最佳地图视图是包含所有所需位置的最大比例尺地图。MapOptions
类包含在RenderServiceSoap.GetMap
方法中使用的地图渲染选项。它指定数据源、图像格式、平移和缩放因子,以及请求的地图是否为概览地图。Pushpin
类包含图钉的图标、标签、位置和用户定义的标识号。Pushpin 对象用于在地图图像上标记位置,该位置可以是地点、地址或纬度和经度坐标。MapView
类是一个抽象类,代表一个请求的地图视图。每个派生类使用不同的度量来定义地图视图:一组位置点、一个边界矩形、高度和宽度或比例尺。MapImage
类包含从RenderServiceSoap.GetMap
方法返回的地图。它包括图像或获取图像的 URL、地图视图表示以及与图钉相关的热区。
路线服务
路线服务允许您基于位置或航点生成路线、驾驶方向和计算的路线表示,设置路段和路线偏好,以及生成路段和方向的地图视图。
RouteServiceSoap
类包含与调用路线服务相关的方法和属性。Route
类包含两个航点(起点和终点)的路线。路线可以包含一个规范、一组方向和/或一个计算的路线表示。CalculateSimpleRoute
方法根据指定的纬度和经度坐标返回一条路线。
获取 MapPoint
要使用 MapPoint,您需要
使用代码
理论够多了,让我们开始编码吧。MapPoint 的基本功能由两部分组成。
- 查找地址。
- 显示其地图。
下面的两个方法 MakeAddress
和 MakeMap
封装了查找地址和显示其地图的过程,这些是开始使用 MapPoint 的步骤。每个方法后面都附有对方法中执行的一系列步骤的描述。
以下代码显示了对窗体全局的变量。
//Variables used by FindAddress and MakeMap methods.
private ViewByHeightWidth[] views = null;
private FindResults foundAddressResults;
private LatLong[] latlongs = null;
private System.Drawing.Bitmap[] m_Maps;
private int Position=0;
MakeAddress
方法
private void MakeAddress()
{
//Step 1
FindServiceSoap findService = new FindServiceSoap();
Address myAddress = new Address();
FindAddressSpecification findAddressSpec =
new FindAddressSpecification();
//Step 2
findService.Credentials = new System.Net.NetworkCredential(
myUserName,myPassword);
findService.PreAuthenticate = true;
//Step 3
myAddress.AddressLine = txtAddress.Text;
myAddress.PrimaryCity = txtCity.Text;
myAddress.PostalCode = txtPostCode.Text;
myAddress.CountryRegion = "UK";
//Step 4
findAddressSpec.DataSourceName = "MapPoint.EU";
findAddressSpec.InputAddress = myAddress;
//Step 5
foundAddressResults = findService.FindAddress(findAddressSpec);
//Step 6
views = new ViewByHeightWidth[1];
views[0] = foundAddressResults.Results[0].
FoundLocation.BestMapView.ByHeightWidth;
}
以下步骤描述了与代码中的步骤相对应的 MakeAddress
方法。
- 声明此方法中要使用的变量。
- 要使用 MapPoint,您需要用户名和密码(参见获取 MapPoint)。我使用这些信息来创建
FindServiceSoap
类的凭据,以便在使用该类的任何方法之前进行身份验证。 myAddress
变量保存地址信息。FindAddressSpecification
类的DataSourceName
属性包含 MapPoint Web 服务所在的多个数据源之一。MapPoint.EU
表示我们将在欧洲某处搜索地址。然后,我们将Address
附加到InputAddress
属性。- 最后,调用
FindAddress
方法,传递地址规范,该方法返回FindResults
集合。 - 从该集合中,我们检索一个
MapView
对象,该对象稍后将用于生成地图。
总之,我们创建了一个对象来保存地址,然后创建了一个对象来保存该地址的规范,使用该规范搜索了地址并获得了该地址的视图。
MakeMap
方法
private void MakeMap()
{
//Step 1
RenderServiceSoap renderService = new RenderServiceSoap();
Pushpin[] pushpins = new Pushpin[1];
MapSpecification mapSpec = new MapSpecification();
//Step 2
renderService.Credentials =
new System.Net.NetworkCredential(myUserName,myPassword);
renderService.PreAuthenticate = true;
//Step 3
pushpins[0] = new Pushpin();
pushpins[0].IconDataSource = "MapPoint.Icons";
pushpins[0].IconName = "0";
pushpins[0].Label = foundAddressResults.Results[0].FoundLocation.Entity.Name;
pushpins[0].LatLong = views[0].CenterPoint;
pushpins[0].ReturnsHotArea = true;
//Step 4
mapSpec.DataSourceName = "MapPoint.EU";
mapSpec.Views = views;
mapSpec.Pushpins = pushpins;
mapSpec.Options = new MapOptions();
mapSpec.Options.Format = new ImageFormat();
mapSpec.Options.Format.Width = pbMap.Width;
mapSpec.Options.Format.Height = pbMap.Height;
//Step 5
MapImage[] mapImages = renderService.GetMap(mapSpec);
System.IO.Stream streamImage =
new System.IO.MemoryStream(mapImages[0].MimeData.Bits);
Bitmap bitmapImage = new Bitmap(streamImage);
pbMap.Image= bitmapImage;
}
以下步骤描述了与代码中的步骤相对应的 MakeMap
方法。
- 声明此方法中要使用的变量。
- 要使用 MapPoint,您需要用户名和密码(参见获取 MapPoint)。我使用这些信息来创建
RenderServiceSoap
类的凭据,以便在使用该类的任何方法之前进行身份验证。 - 创建一个
Pushpin
对象,该对象将显示(在地图上)我们正在搜索的地址。 - 创建一个
MapSpecification
对象,该对象将保存地图的数据源、图钉、地图视图和格式选项。 - 最后,调用
GetMap
方法并检索地图。将返回一个MapImage
类的数组。在我们的例子中,我们将使用数组的第一个元素来形成一个位图并在 Picture Box 中显示。
总之,我们创建了一个对象来保存图钉,然后构建了地图规范,最后使用该规范获得了地图。
结论
本文演示了 MapPoint Web 服务的基础知识。ZIP 文件包含完整应用程序的源代码,该源代码还显示了如何使用 MapPoint 在两个地址之间查找路线。
参考文献
- MSDN