分享
 
 
 

MapPoint+SmartPhone+C#开发示例

王朝c#·作者佚名  2006-01-10
窄屏简体版  字體: |||超大  

作者: 陶刚编译 出处: 天极开发

本文提供了一些简单的应用程序,它演示了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服务的头部值中。

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有