使用GeocodeService进行地理位置检索
轉載自 http://beniao.cnblogs.com/作??????者:Beniao???????? WebGIS開發群:75662563
?
?
?
Bing Maps進階系列二:使用GeocodeService進行地理位置檢索
在《Bing Maps進階系列一:初識Bing Maps地圖服務》里已經對GeocodeService的功能進行了簡單的描述說明,本篇將會詳細的介紹如何使用GeocodeService進行地理位置檢索和反向檢索的實現。
?
一、添加GeocodeService的Web服務引用
地理編碼服務(GeocodeService)是以WCF技術發布的一個Web服務,地圖編碼服務提供了以一個有效的物理地址在地圖上匹配其對應的地圖地址(既地理經度和緯度坐標)和以地理經度和緯度坐標進行反向匹配物理地址路徑的功能。要使用該服務需添加該服務(http://dev.virtualearth.net/webservices/v1/geocodeservice/GeocodeService.svc)的Web服務引用,如下圖:
從上圖可以清晰的看出,該服務提供了兩個方法,一個是根據地名檢索所對應的地理經度和緯度坐標的,另一個方法實現反向檢索地名的功能。通過添加Web服務引用向導IDE工具會為我們自動生成Web服務引用的代理對象等,這些知識點數據Web Service或WCF相關的,這里不詳細介紹。
?
?二、GeocodeService的結構分析
我們可以通過查看GeocodeService的客戶端代理對象類圖知道,客戶端的調用只支持異步調用方式,如下圖:
?
地點檢索和反向地理坐標檢索都只支持客戶端異步調用,添加Web服務引用后可通過生成的WCF客戶端配置文件查看到客戶端調用WCF的相關配置,這里需要注意一點,自動生成的配置有兩個服務端點的地址配置,需要人為將其中一個"custom"配置刪除,或者在調用GeocodeService提供的方法的時候會出現異常。以下為正確的客戶端配置:
<configuration>????<system.serviceModel>
????????<bindings>
????????????<basicHttpBinding>
????????????????<binding?name="BasicHttpBinding_IGeocodeService"?maxBufferSize="2147483647"
????????????????????maxReceivedMessageSize="2147483647">
????????????????????<security?mode="None">
????????????????????????<transport>
????????????????????????????<extendedProtectionPolicy?policyEnforcement="Never"?/>
????????????????????????</transport>
????????????????????</security>
????????????????</binding>
????????????</basicHttpBinding>
????????</bindings>
????????<client>
????????????<endpoint?address="http://dev.virtualearth.net/webservices/v1/geocodeservice/GeocodeService.svc"
????????????????binding="basicHttpBinding"?bindingConfiguration="BasicHttpBinding_IGeocodeService"
????????????????contract="GeocodeService.IGeocodeService"?name="BasicHttpBinding_IGeocodeService"?/>
????????</client>
????</system.serviceModel>
</configuration>
?
?
三、調用GeocodeService服務
首先將界面布局設計下,通過一個TextBox來輸入地點名稱,一個Button來發起服務調用請求并將檢索過后的結果(地名對應的地理位置經度和緯度)顯示在另外兩個TextBox里。界面布局大致如下:
?
代碼 <Grid?x:Name="LayoutRoot"?Width="500"?Height="400">????<m:Map?CredentialsProvider="AkzZURoD0H2Sle6Nq_DE7pm7F3xOc8S3CjDTGNWkz1EFlJJkcwDKT1KcNcmYVINU"?x:Name="map"></m:Map>
????<StackPanel?VerticalAlignment="Top"?HorizontalAlignment="Right"?Background="Gray"?Opacity="0.78"?Orientation="Vertical"?Margin="2,23,2,2">
????????<StackPanel?Orientation="Horizontal">
????????????<TextBlock?Text="地名:"?Margin="0,5,0,5"></TextBlock>
????????????<TextBox?x:Name="tbName"?Width="233"></TextBox>
????????????<Button?x:Name="btnQuery"?Content="搜索"?Click="btnQuery_Click"?Width="80"?Height="30"></Button>
????????</StackPanel>
????????<StackPanel?Orientation="Horizontal">
????????????<TextBlock?Text="經度:"></TextBlock>
????????????<TextBox?x:Name="tbLongitude"?Width="110"></TextBox>
????????????<TextBlock?Text="緯度:"></TextBlock>
????????????<TextBox?x:Name="tbLatitude"?Width="110"></TextBox>
????????????<Button?x:Name="btnQueryReverse"?Content="反向搜索"?Click="btnQueryReverse_Click"?Width="60"?Height="30"></Button>
????????</StackPanel>
????</StackPanel>
</Grid>
?
?
有了上面的界面結構,接下來看看如何實現的根據地名檢索所對應的地理位置經度和緯度,這就需要調用GeocodeService所提供的Geocode()方法了。
?
代碼 private?void?btnQuery_Click(object?sender,?RoutedEventArgs?e){
????//實例化GeocodeService客戶端對象
????GeocodeServiceClient?client?=?new?GeocodeServiceClient();
????client.GeocodeCompleted?+=?new?EventHandler<GeocodeCompletedEventArgs>(OnGeocodeCompleted);
????//創建一個Geocode檢索請求
????GeocodeRequest?request?=?new?GeocodeRequest();
????request.Credentials?=?new?Credentials();
????request.Credentials.ApplicationId?=?"AkzZURoD0H2Sle6Nq_DE7pm7F3xOc8S3CjDTGNWkz1EFlJJkcwDKT1KcNcmYVINU";
????//設置檢索條件
????request.Query?=?this.tbName.Text.Trim();
????//異步調用Geocode服務方法
????client.GeocodeAsync(request);
}
?
?
通過指定的GeocodeCompleted的回調函數來完成調用服務請求的響應結果,這里我將請求的結果地理位置獲取到后直接將地圖定位到該位置。
?
private?void?OnGeocodeCompleted(object?sender,?GeocodeCompletedEventArgs?e){
????if?(e.Error?==?null)
????{
????????GeocodeResponse?response?=?e.Result;
????????double?latitude?=?response.Results[0].Locations[0].Latitude;
????????double?longitude?=?response.Results[0].Locations[0].Longitude;
????????//顯示檢索地點的地理位置坐標經度和緯度
????????this.tbLatitude.Text?=?latitude.ToString();
????????this.tbLongitude.Text?=?longitude.ToString();
????????//將地圖定位到該地理位置并設置地圖縮放級別到4級
????????map.SetView(new?Location(latitude,?longitude),?4);
????}
}
?
?
如上圖輸入“china”進行檢索,通過GeocodeService服務檢索出了china所對應的地理位置的經度和緯度坐標,在程序中將地圖定位到了該坐標的4級地圖,最終效果就如上圖所示。
?
GeocodeService也提供了反向檢索,既根據地理位置的經度和緯度進行反向檢索地名,服務中的ReverseGeocode()方法便是用來實現這一功能的。
private?void?btnQueryReverse_Click(object?sender,?RoutedEventArgs?e){
????GeocodeServiceClient?client?=?new?GeocodeServiceClient();
????client.ReverseGeocodeCompleted+=new?EventHandler<ReverseGeocodeCompletedEventArgs>(OnReverseGeocodeCompleted);
????ReverseGeocodeRequest?request?=?new?ReverseGeocodeRequest();
????request.Credentials?=?new?Credentials();
????request.Credentials.ApplicationId?=?"AkzZURoD0H2Sle6Nq_DE7pm7F3xOc8S3CjDTGNWkz1EFlJJkcwDKT1KcNcmYVINU";
????request.Location?=?new?Location(36.5540000796318,104.055999666452);
????client.ReverseGeocodeAsync(request);
}
private?void?OnReverseGeocodeCompleted(object?sender,?ReverseGeocodeCompletedEventArgs?e)
{
????if?(e.Error?==?null)
????{
????????if?(e.Result.Results.Count?>?0)
????????{
????????????GeocodeResponse?response?=?e.Result;
????????????this.tbName.Text?=?response.Results[0].DisplayName;
????????}
????????else
????????????MessageBox.Show("沒有檢索到該地理位置所對應的地點");
????}
}
?
PS:貌似Bing Maps的GeocodeService有問題,難道是MS的數據有問題??通過地名檢索出的地理位置坐標反向檢索回去居然沒有數據返回。?
?
其實說簡單點GeocodeService所提供的兩個方法就是一個實現根據地名檢索對應的地理位置經度和緯度坐標,一個實現根據地理位置的經度和緯度坐標反向檢索地名。這在外網GIS應用中是非常有用的,企業內網的業務支撐系統這一功能到不是很有用,通常企業業務系統的業務擴展開發中應用到地圖最多的就是地圖的呈現,比如將一些網絡組織圖以GIS的形式呈現出來,讓人看著比較直觀、清晰,其他擴展全的根據業務需求開發。
?
轉載于:https://www.cnblogs.com/hijack/archive/2010/02/08/1665695.html
總結
以上是生活随笔為你收集整理的使用GeocodeService进行地理位置检索的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BLOG排版小窍门
- 下一篇: 回复:lerit的关于对象中字段的初始化