本文繼續(xù)上一篇《C#開(kāi)發(fā)微信入口網(wǎng)站及應(yīng)用(12)-使用語(yǔ)音處理》,繼續(xù)介紹微信的相關(guān)應(yīng)用。我們知道,地理位置資訊可以用來(lái)做很多相關(guān)的應(yīng)用,除了我們可以知道用戶(hù)所在的位置,還可以關(guān)聯(lián)出一些地理位置的應(yīng)用,如天氣,熱映影片,附近景點(diǎn),附近影院,交通事件等等等,反正所有和地理位置相關(guān)的信息,我們都可以根據(jù)需要做一些擴(kuò)展應(yīng)用。本文主要介紹利用地理位置訊息,如何建構(gòu)使用這些應(yīng)用的操作。
1、微信的地理位置資訊
在使用前,我們先來(lái)看看微信的接口,為我們定義了那些關(guān)於與地理位置的資訊。其實(shí)地理位置的訊息,微信分為了兩個(gè)方面,一個(gè)是接收用戶(hù)的地理位置請(qǐng)求,一個(gè)是用戶(hù)允許上報(bào)地理位置操作,定時(shí)發(fā)送的地理位置資訊。
本文主要介紹基於第一種,使用者回報(bào)地理位置後,如何處理的相關(guān)應(yīng)用。
地理位置的回報(bào)操作,就是在輸入的地方,選擇+號(hào)進(jìn)行新增地理位置,然後選擇目前或指定的地理位置地圖,具體操作如下所示。
? ? ? ? ? ? ? ??
地理位置訊息
地理位置訊息
地理位置訊息 | |
---|---|
地理位置訊息 | |
開(kāi)發(fā)者 | 微訊號(hào)|
FromUserName | 發(fā)送方帳號(hào)(一個(gè)OpenID) |
CreateTime | 訊息建立時(shí)間(整數(shù)) |
MsgType | location |
地理位置經(jīng)度 | |
地圖縮放小 | |
地理位置資訊 | |
訊息id,64位元整型 | MsgId |
有了上面的地理位置信息,我們?cè)诔绦蚶锩?,需要在消息傳遞過(guò)來(lái)的時(shí)候,定義一個(gè)實(shí)體類(lèi)信息,承載相關(guān)的地理位置信息,方便我們進(jìn)一步的處理操作。
????///?<summary> ????///?接收的地理位置消息????///?</summary> ????[System.Xml.Serialization.XmlRoot(ElementName?=?"xml")]????public?class?RequestLocation?:?BaseMessage ????{???? ????????public?RequestLocation() ????????{????????????this.MsgType?=?RequestMsgType.Location.ToString().ToLower(); ????????}?? ????????///?<summary> ????????///?消息ID????????///?</summary> ????????public?Int64?MsgId?{?get;?set;?}????????///?<summary> ????????///?地理位置維度????????///?</summary> ????????public?decimal?Location_X?{?get;?set;?}????????///?<summary> ????????///?地理位置經(jīng)度????????///?</summary> ????????public?decimal?Location_Y?{?get;?set;?}????????///?<summary> ????????///?地圖縮放大小????????///?</summary> ????????public?int?Scale?{?get;?set;?}????????///?<summary> ????????///?地理位置信息????????///?</summary> ????????public?string?Label?{?get;?set;?} ????}
有了這些信息,我們?cè)谛畔鬟f的時(shí)候,就能很好得到用戶(hù)的相關(guān)數(shù)據(jù)了。
如果僅僅為了返回給用戶(hù),告訴用戶(hù)目前的地理位置信息,可以用下面的操作就可以了。
????????///?<summary> ????????///?對(duì)地理位置請(qǐng)求信息進(jìn)行處理????????///?</summary> ????????///?<param name="info">地理位置請(qǐng)求信息實(shí)體</param> ????????///?<returns></returns> ????????public?string?HandleLocation(Entity.RequestLocation?info) ????????{????????????string?xml?=?""; ????????????ResponseText?txtinfo?=?new?ResponseText(info); ????????????txtinfo.Content?=?string.Format("您發(fā)送的地理位置是:{0}",?info.Label); ????????????xml?=?txtinfo.ToXml();????????????return?xml; ????????}
2、地址位置的應(yīng)用處理
不過(guò)上面的信息,顯然不符合我們擴(kuò)展應(yīng)用的要求,因此我們進(jìn)一步進(jìn)行完善里面對(duì)地理位置信息處理的操作。我們進(jìn)一步把關(guān)于地理位置的操作,放到事件處理模塊里面進(jìn)行處理,處理代碼如下所示。
????????///?<summary> ????????///?對(duì)地理位置請(qǐng)求信息進(jìn)行處理????????///?</summary> ????????///?<param name="info">地理位置請(qǐng)求信息實(shí)體</param> ????????///?<returns></returns> ????????public?string?HandleLocation(Entity.RequestLocation?info) ????????{????????????string?xml?=?""; ????????????EventDispatch?dispatch?=?new?EventDispatch(); ????????????xml?=?dispatch.DealLocation(info,?info.Label,?info.Location_Y,?info.Location_X);????????????return?xml; ????????}
在處理的時(shí)候,我們需要先保存用戶(hù)的地理位置信息,把它存儲(chǔ)到用戶(hù)的上下文記錄里面。這樣我們?cè)谔幚碇噶畹臅r(shí)候,把它獲取到,然后傳遞給相關(guān)的方法就可以實(shí)現(xiàn)地理位置的擴(kuò)展應(yīng)用了。
????????????//保存經(jīng)緯度 ????????????string?location?=?string.Format("{0},{1}",?lat,?lon);????????????bool?result?=?BLLFactory<UserSet>.Instance.UpdateUserInput(info.FromUserName,?location);
首先對(duì)用戶(hù)地理位置的請(qǐng)求,我根據(jù)數(shù)據(jù)庫(kù)配置給出了一個(gè)用戶(hù)選擇的指令提示,如下所示。
為了對(duì)地理位置請(qǐng)求的處理,我定義了一個(gè)用于處理這個(gè)操作的指令操作
這樣整個(gè)地理位置的指令操作,就在應(yīng)答鏈里面進(jìn)行很好的跳轉(zhuǎn)管理了。那么為了實(shí)現(xiàn)天氣、放映影片、附近影院、旅游線(xiàn)路、交通事件等方面的擴(kuò)展應(yīng)用,我們應(yīng)該如何操作呢?
3、地址位置應(yīng)用擴(kuò)展
我們知道,百度或者騰訊都提供了一些開(kāi)放平臺(tái),給我們進(jìn)行各種方式的使用。那么我們這里以使用百度LBS平臺(tái)應(yīng)用來(lái)構(gòu)建一些模塊。
?
?
這上面都有很多相關(guān)的接口供使用,我們可以根據(jù)其提供的數(shù)據(jù)格式進(jìn)行封裝,然后進(jìn)行調(diào)用處理就可以了。
剛才說(shuō)了,我配置了一些指令,用來(lái)構(gòu)建相關(guān)的應(yīng)用,指令的最后是一些事件代碼的定義,我們對(duì)這些末端的事件代碼進(jìn)行處理,就可以給用戶(hù)返回相關(guān)的信息了,總體的操作代碼如下所示。
????????///?<summary> ????????///?其他插件操作,如天氣,景點(diǎn)、電影影訊、交通等????????///?</summary> ????????///?<param name="info">基礎(chǔ)消息</param> ????????///?<param name="eventKey">事件標(biāo)識(shí)</param> ????????///?<returns></returns> ????????public?string?DealPlugin(BaseMessage?info,?string?eventKey) ????????{????????????//LogTextHelper.Info(eventKey); ????????????string?userInput?=?BLLFactory<UserSet>.Instance.GetUserInput(info.FromUserName);????????????string?xml?=?"";????????????switch?(eventKey) ????????????{????????????????case?"event-void-wether": ????????????????????xml?=?new?WeatherPlugin().Response(info,?userInput);????????????????????break;????????????????case?"event-void-movie": ????????????????????xml?=?new?MoviePlugin().Response(info,?userInput);????????????????????break;????????????????case?"event-void-cinema": ????????????????????xml?=?new?CinemaPlugin().Response(info,?userInput);????????????????????break;????????????????case?"event-void-travel": ????????????????????xml?=?new?TravelPlugin().Response(info,?userInput);????????????????????break;????????????????case?"event-void-traffic": ????????????????????xml?=?new?TrafficEventPlugin().Response(info,?userInput);????????????????????break;????????????????default:????????????????????break; ????????????}????????????return?xml; ????????}
這里以天氣為例,說(shuō)明該如何調(diào)用百度的接口的,首先我們封裝一下相關(guān)的接口調(diào)用。
????????///?<summary> ????????///?根據(jù)參數(shù)調(diào)用百度接口,獲取相關(guān)的結(jié)果數(shù)據(jù)????????///?</summary> ????????///?<param name="location">地理位置</param> ????????///?<param name="ak">API調(diào)用鍵</param> ????????///?<returns></returns> ????????public?BaiduWeatherResult?Execute(string?location,?string?ak) ????????{ ????????????location?=?HttpUtility.UrlEncode(location);????????????var?url?=?string.Format("http://m.miracleart.cn/{0}&output=json&ak={1}",?location,?ak); ????????????BaiduWeatherResult?result?=?BaiduJsonHelper<BaiduWeatherResult>.ConvertJson(url);????????????return?result; ????????}
其中的BaiduWeatherResult 是我根據(jù)調(diào)用返回的Json結(jié)果,構(gòu)建的一個(gè)實(shí)體類(lèi),用來(lái)存儲(chǔ)返回的內(nèi)容。具體代碼如下所示。
????///?<summary> ????///?天氣請(qǐng)求結(jié)果Json對(duì)象????///?</summary> ????public?class?BaiduWeatherResult?:?BaiduResult ????{????????///?<summary> ????????///?天氣預(yù)報(bào)信息????????///?</summary> ????????public?List<BaiduWeatherData>?results?=?new?List<BaiduWeatherData>(); ????}????///?<summary> ????///?城市的天氣信息????///?</summary> ????public?class?BaiduWeatherData ????{????????///?<summary> ????????///?當(dāng)前城市????????///?</summary> ????????public?string?currentCity?{?get;?set;?}????????///?<summary> ????????///?天氣預(yù)報(bào)信息????????///?</summary> ????????public?List<BaiduWeatherJson>?weather_data?=?new?List<BaiduWeatherJson>(); ????}????///?<summary> ????///?天氣預(yù)報(bào)的單條記錄Json信息????///?</summary> ????public?class?BaiduWeatherJson ????{????????///?<summary> ????????///?天氣預(yù)報(bào)時(shí)間????????///?</summary> ????????public?string?date?{?get;?set;?}????????///?<summary> ????????///?白天的天氣預(yù)報(bào)圖片url????????///?</summary> ????????public?string?dayPictureUrl?{?get;?set;?}????????///?<summary> ????????///?晚上的天氣預(yù)報(bào)圖片url????????///?</summary> ????????public?string?nightPictureUrl?{?get;?set;?}????????///?<summary> ????????///?天氣狀況????????///?</summary> ????????public?string?weather?{?get;?set;?}????????///?<summary> ????????///?風(fēng)力????????///?</summary> ????????public?string?wind?{?get;?set;?}????????///?<summary> ????????///?溫度????????///?</summary> ????????public?string?temperature?{?get;?set;?} ????}
為了構(gòu)建返回給客戶(hù)的圖文數(shù)據(jù),我們需要構(gòu)建一個(gè)News對(duì)象,然后生成XML數(shù)據(jù)返回給服務(wù)器進(jìn)行處理即可。
????????///?<summary> ????????///?響應(yīng)用戶(hù)請(qǐng)求,并返回相應(yīng)的XML數(shù)據(jù)????????///?</summary> ????????///?<param name="info">微信基礎(chǔ)信息</param> ????????///?<param name="location">地理位置:經(jīng)緯度坐標(biāo)或者地名</param> ????????///?<returns></returns> ????????public?string?Response(BaseMessage?info,?string?location) ????????{????????????string?xml?=?"";????????????//"廣州"?或者?"116.305145,39.982368"???? ????????????if?(!string.IsNullOrEmpty(location)) ????????????{ ????????????????BaiduWeatherResult?result?=?Execute(location,?baiduAK);????????????????if?(result?!=?null?&&?result.results.Count?>?0) ????????????????{ ????????????????????BaiduWeatherData?data?=?result.results[0];????????????????????if?(data?!=?null) ????????????????????{ ????????????????????????ArticleEntity?first?=?new?ArticleEntity(); ????????????????????????first.Title?=?string.Format("{0}?天氣預(yù)報(bào)",?data.currentCity); ????????????????????????ResponseNews?news?=?new?ResponseNews(info); ????????????????????????news.Articles.Add(first);????????????????????????int?i?=?0;????????????????????????foreach?(BaiduWeatherJson?json?in?data.weather_data) ????????????????????????{ ????????????????????????????ArticleEntity?article?=?new?ArticleEntity(); ????????????????????????????article.Title?=?string.Format("{0}\n{1}?{2}?{3}",?json.date,?json.weather,?json.wind,?json.temperature);????????????????????????????if?(i++?==?0) ????????????????????????????{ ????????????????????????????????article.PicUrl?=?IsDayTime()???json.dayPictureUrl?:?json.nightPictureUrl; ????????????????????????????}????????????????????????????else ????????????????????????????{ ????????????????????????????????article.PicUrl?=?json.dayPictureUrl; ????????????????????????????} ????????????????????????????news.Articles.Add(article); ????????????????????????} ????????????????????????xml?=?news.ToXml(); ????????????????????} ????????????????} ????????????}????????????return?xml; ????????}
這樣就很好實(shí)現(xiàn)了整體的功能了,具體界面功能可以訪(fǎng)問(wèn)我的微信(廣州愛(ài)奇迪)進(jìn)行了解,下面是功能截圖供參考。
? ?
?
?更多C#開(kāi)發(fā)微信入口網(wǎng)站及應(yīng)用-使用地理位置擴(kuò)充相關(guān)應(yīng)用?相關(guān)文章請(qǐng)關(guān)注PHP中文網(wǎng)!

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線(xiàn)上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門(mén)文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6
視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版
神級(jí)程式碼編輯軟體(SublimeText3)
