位置感知电话簿(译文)
By S.F.
本文链接 https://www.kyfws.com/news/location-aware-phone-book/
版权声明 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
- 6 分钟阅读 - 2617 个词 阅读量 0位置感知电话簿(译文)
原文地址:https://www.codeproject.com/Articles/18668/Location-Aware-Phone-Book
原文作者:Joel Ivory Johnson
译文由本站翻译
前言
有关使用Microsoft Live Search API制作位置感知电话簿的文章
介绍
Microsoft向公众提供了用于利用Windows Live Search的API.该API允许搜索网络,新闻和其他类型的信息.对于这个项目,我将集中精力进行电话搜索,以便在Windows Mobile通信设备上制作位置感知的电话簿.
硬体需求
要使用此程序,需要两部分硬件.一种是至少运行Windows Mobile 2003操作系统和GPS接收器的Windows Mobile设备. Windows Mobile 5设备可以运行,但是您可能会收到有关未签名代码的警告.您还可以使用Visual Studio .NET附带的Windows Mobile模拟器之一,但是您需要记住将虚拟端口之一映射到主机上的GPS端口,并确保它可以连接到Internet. GPS接收器可以是内置的或外部的,只需将其映射到COM端口即可. Windows Mobile设备必须能够通过WiFi或通过电话服务提供商进行数据订阅来访问Internet. 如果您没有GPS接收器,则该程序仍然可以运行,但是您需要选择一个城市作为所有搜索的参考点.
软件需求
我使用Visual Studio .NET 2005来开发此项目.尽管我对开发语言的偏爱是10多年来的C语言,但本文中包含的示例还是用VB.NET编写的. Windows Mobile设备还需要安装2.0 Compact Framework.如果不存在,Visual Studio将在部署时安装它.如果将GPS接收器映射到COM9上方的端口,则最好使用带有SP2的2.0 Framework.
入门
为了根据Microsoft Live Search Web服务进行开发,您需要为您的项目请求一个应用程序ID.快速获取,轻松获取免费.只需访问此网站以获得ID.
创建项目
对于这个项目,我首先创建一个针对" Pocket PC 2003"设备的新"智能设备"项目.这将是一个"设备应用程序"项目.由于此项目依赖于Microsoft Live搜索Web服务,因此下一步是添加对该Web服务.一旦添加了web service,执行搜索只是构建搜索请求对象并提交它.
建立搜索请求
通过Live Search API,您可以在单个请求中搜索多个数据源.每个数据源将由" SourceRequest"对象描述.尽管搜索请求可以包含多个SourceRequest
对象,但是我们仅搜索电话号码,因此我们的搜索将始终具有单个SourceRequest
对象.
这就是我创建SearchRequest和SourceRequest对象,然后关联Source的方式:
Dim searchRequest As SearchRequest = New SearchRequest
Dim sourceRequest() As SourceRequest = {New SourceRequest()}
searchRequest.Requests = sourceRequest
必须为搜索设置一些常规设置.这包括您的应用程序ID,搜索的语言/区域性,您希望返回的结果数,搜索的类型以及要在搜索结果中填充的字段.
searchRequest.AppID = "__YOUR_APP_ID_GOES_HERE__"
searchRequest.CultureInfo = "en-US"
sourceRequest(0).Count = 50
sourceRequest(0).Source = SourceType.PhoneBook
sourceRequest(0).SortBy = SortByType.Distance
sourceRequest(0).ResultFields = ResultFieldMask.Phone Or _
ResultFieldMask.Address Or ResultFieldMask.Location Or ResultFieldMask.Title
当然,您需要在此代码中放置自己的应用程序ID.剩下的就是指定我们要搜索的内容以及我们要搜索的位置:
searchRequest.Location = currentLocation
searchRequest.Query = txtName.Text
这里的" currentLocation"对象包含一个位置(纬度,经度和半径).稍后我将在此字段上发表评论. txtName.Text是对文本字段的引用,用户在其中输入了他或她正在搜索的内容. 提交搜索很容易.创建对" MSNSearchService"对象的引用,使用搜索请求调用其搜索方法,然后保存响应.各个搜索结果位于名为" Responses"的集合中.此集合中对象的字段是不言自明的(“电话”,“地址"等等)
Dim searchService As MSNSearchService = New MSNSearchService()
Dim searchResponse As SearchResponse
searchResponse = searchService.Search(searchRequest)
读取GPS设备
NMEA GPS设备通常使用RS232接口(串行端口)进行通信.这样,您将使用” SerialPort"对象从GPS设备读取数据.这样的设备输出很多有趣的数据,包括UTC时间,一个人的速度以及其他东西.我们只需要知道我们的位置.我已经实施了一个简约的GPS阅读课程.它读取GPS接收器的每条线路输出,查找包含经度和纬度的消息,并使用以下正则表达式提取信息:
Dim gpsExpression As Regex = New Regex( _
"\$GPRMC,\d*(\.\d*)?,\w,(?<LatitudeDegrees>\d+)_
(?<LatitudeMinutes>(\d{2}\.\d+)?),(?<latDir>N|S)," + _
"(?<LongitudeDegrees>\d+)(?<LongitudeMinutes>(\d{2}\.\d*)?),_
(?<longDir>E|W)")
该类具有其自己的线程.实例化后,它将开始不断从GPS接收器读取当前位置,并通过事件传递新坐标.这个对象必须特别小心.由于它具有自己的线程,因此可以在关闭主窗体但不停止该线程的情况下阻止程序从内存中卸载.调用对象的Dispose方法将导致线程中止. 尝试检测GPS端口时,我会枚举可用的命令,并尝试从每个端口读取,直到产生的字符串看起来像GPS字符串(再次使用正则表达式).如果GPS设备发生故障(在我的测试中,当外部GPS接收器的电池耗尽时发生),则GpsReader的线程将终止.
计算到结果位置的距离
搜索结果包含结果的地理坐标,但不包含到结果的距离.距离是通过表格代码计算的.该方程式基本上是计算球体上大圆的长度.该函数将以公里或英里为单位计算距离(尽管我对函数的调用仅要求英里).如果您想使用其他单位作为距离,则只需知道该单位的地球半径并将该值设置为" earthRadius"变量即可.
下一步是什么?
我为撰写本文而简化了该程序,但我已经着手开发了我希望它具有的下一组功能.如此处实现的GPS阅读器类别将不再存在,将由允许使用不同类型的定位器服务的插件系统代替(例如Assisted GPS)或其他服务的定位信息).我希望保存用户的搜索查询,以便可以从下拉列表中选择频繁的搜索.最终,我希望能够在地图上显示结果,并可能显示行车路线.尽管这最终可能会成为另一个项目的一部分,但我也希望运行该程序的员工能够使用它彼此查找.
结论
Microsoft Live Search API易于使用,可用于快速制作需要利用在Internet上搜索信息的应用程序.虽然我仅使用该程序执行通用电话簿搜索,但API也会限制对商业或住宅实体的搜索.当然,该API可用于搜索其他内容,例如图像,新闻和拼写校正. Microsoft提供了一个page,任何人都可以对可以执行的不同类型的搜索进行采样.
历史
许可
本文以及所有相关的源代码和文件均已获得The Code Project Open License (CPOL)的许可。
VS2005 WinMobile2003 VB8.0 C++ VB Windows WinMobile .NETCF .NET Visual-Studio Dev Intermediate 新闻 翻译