該功能實現地理編碼服務,即地址匹配,從已知的地址描述到對應的經緯度座標的轉換,即根據地址信息,查詢該地址所對應的點座標等,地址(address) 爲必選項,城市(city)爲可選項。html
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <Grid Opacity="0.8" Margin="0,0,0,608" Background="#FF323232" RenderTransformOrigin="0.497,0.465" Canvas.ZIndex="10" > <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <TextBlock Grid.Row="0" Text="地理編碼" Margin="3,0,0,0" /> <StackPanel Grid.Row="1" Orientation="Vertical"> <TextBox x:Name="txtAddress" Grid.Row="0" Text="北京市朝陽區望京阜通東大街方恆國際中心" Margin="12,0,0,0" /> <Button Content="地理編碼" Click="Button_Click" Margin="274,0,26,0" /> </StackPanel> </Grid> </Grid>
AMap amap; AMapMarker marker; public SearchGeoCode() { InitializeComponent(); this.ContentPanel.Children.Add(amap = new AMap()); amap.MarkerClickListener += amap_MarkerClickListener; } private async Task AddressToGeoCode(string address) { AMapGeoCodeResult cr = await AMapGeoCodeSearch.AddressToGeoCode(address); this.Dispatcher.BeginInvoke(() => { if (cr.Erro == null && cr.GeoCodeList != null) { if (cr.GeoCodeList.Count==0) { MessageBox.Show("無查詢結果"); return; } IEnumerable<AMapGeoCode> geocode = cr.GeoCodeList; foreach (AMapGeoCode gcs in geocode) { Debug.WriteLine(gcs.Adcode); Debug.WriteLine(gcs.Building); Debug.WriteLine(gcs.City); Debug.WriteLine(gcs.District); Debug.WriteLine(gcs.FormattedAddress); Debug.WriteLine(gcs.Province); Debug.WriteLine(gcs.Township); Debug.WriteLine(gcs.Location.Lon); Debug.WriteLine(gcs.Location.Lat); Debug.WriteLine(gcs.LevelList[0]); marker= amap.AddMarker(new AMapMarkerOptions() { Position = new LatLng(gcs.Location.Lat, gcs.Location.Lon), Title = gcs.FormattedAddress, Snippet = gcs.District, IconUri = new Uri("Images/AZURE.png", UriKind.Relative), }); } //若是返回的geocode數大於1個,調整視圖 if (geocode.Count()>1) { LatLngBounds.Builder builder = new LatLngBounds.Builder(); List<AMapMarker> markers = amap.GetMapMarkers(); foreach (AMapMarker marker in markers) { builder.Include(marker.Position); } this.amap.MoveCamera(CameraUpdateFactory.NewLatLngBounds(builder.Build(), markers.Count())); } else { amap.MoveCamera(CameraUpdateFactory.NewLatLngZoom(new LatLng(geocode.FirstOrDefault().Location.Lat, geocode.FirstOrDefault().Location.Lon), 14)); } } else { MessageBox.Show(cr.Erro.Message); } }); } void amap_MarkerClickListener(AMapMarker sender, AMapEventArgs args) { sender.ShowInfoWindow(new AInfoWindow() { Title = sender.Title, ContentText =sender.Snippet, }); } private async void Button_Click(object sender, RoutedEventArgs e) { amap.Clear(); if (!string.IsNullOrWhiteSpace(txtAddress.Text)) { await AddressToGeoCode(txtAddress.Text); } }
該功能實現逆地理編碼服務,即地址解析服務,具體是指從已知的經緯度座標到對應的地址描述(如省市、街區、樓層、房間等)的轉換服務,座標(location) 爲必選項,半徑(radius)爲可選項,詳細的參數說明參見參考手冊。git
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <Grid Opacity="0.8" Margin="0,0,0,568" Background="#FF323232" RenderTransformOrigin="0.497,0.465" Canvas.ZIndex="10" > <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <TextBlock Grid.Row="0" Text="逆地理編碼" Margin="3,0,0,0" /> <Grid Grid.Row="1"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/> </Grid.ColumnDefinitions> <TextBlock Grid.Row="0" Grid.Column="0" Text="經度:" Margin="12,0,0,0" VerticalAlignment="Center" /> <TextBlock Grid.Row="1" Grid.Column="0" Text="緯度:" Margin="12,0,0,0" VerticalAlignment="Center" /> <TextBox x:Name="txtLon" Grid.Row="0" Grid.Column="1" Text="" Width="180" /> <TextBox x:Name="txtLat" Grid.Row="1" Grid.Column="1" Text="" Width="180" /> <TextBlock Grid.Row="2" Text="點擊或者輸入得到經緯度" Grid.ColumnSpan="2" Margin="3,0,0,0" /> </Grid> <Button Content="逆地理編碼" Click="Button_Click" Margin="257,69,29,3" Grid.Row="1" /> </Grid>
AMap amap; AMapMarker marker; LatLng latLng; public SearchReGeoCode() { InitializeComponent(); this.ContentPanel.Children.Add(amap = new AMap()); amap.Tap += amap_Tap; amap.MarkerClickListener += amap_MarkerClickListener; } void amap_Tap(object sender, System.Windows.Input.GestureEventArgs e) { latLng = amap.GetProjection().FromScreenLocation(e.GetPosition(amap)); this.txtLat.Text = latLng.latitude.ToString(); this.txtLon.Text = latLng.longitude.ToString(); } private async Task GeoCodeToAddress(double lon, double lat) { AMapReGeoCodeResult rcc = await AMapReGeoCodeSearch.GeoCodeToAddress(lon, lat, 500, "", Extensions.All); this.Dispatcher.BeginInvoke(() => { if (rcc.Erro == null && rcc.ReGeoCode != null) { AMapReGeoCode regeocode = rcc.ReGeoCode; Debug.WriteLine(regeocode.Address_component); Debug.WriteLine(regeocode.Formatted_address); Debug.WriteLine(regeocode.Pois); List<AMapPOI> pois = regeocode.Pois.ToList(); //POI信息點 foreach (AMapPOI poi in pois) { marker = amap.AddMarker(new AMapMarkerOptions() { Position = new LatLng(poi.Location.Lat, poi.Location.Lon), Title = poi.Name, Snippet = poi.Address, IconUri = new Uri("Images/RED.png", UriKind.Relative), }); } Debug.WriteLine(regeocode.Roadinters); Debug.WriteLine(regeocode.Roadslist); AMapAddressComponent addressComponent = regeocode.Address_component; Debug.WriteLine(addressComponent.Building); Debug.WriteLine(addressComponent.City); Debug.WriteLine(addressComponent.District); Debug.WriteLine(addressComponent.Neighborhood); Debug.WriteLine(addressComponent.Province); Debug.WriteLine(addressComponent.Stree_number); Debug.WriteLine(addressComponent.Township); AMapStreetNumber streetNumber = addressComponent.Stree_number; Debug.WriteLine(streetNumber.Direction); Debug.WriteLine(streetNumber.Distance); Debug.WriteLine(streetNumber.Location.Lat); Debug.WriteLine(streetNumber.Location.Lon); Debug.WriteLine(streetNumber.Number); Debug.WriteLine(streetNumber.Street); marker = amap.AddMarker(new AMapMarkerOptions() { Position = new LatLng(streetNumber.Location.Lat, streetNumber.Location.Lon),//amap.Center,// Title = addressComponent.Province, Snippet = regeocode.Formatted_address, IconUri = new Uri("Images/AZURE.png", UriKind.Relative), }); //顯示化彈出信息 AInfoWindow info = new AInfoWindow(); info.Title = addressComponent.Province; info.ContentText = regeocode.Formatted_address; marker.ShowInfoWindow(info, new Point(0, 0)); amap.MoveCamera(CameraUpdateFactory.NewLatLngZoom(new LatLng(Convert.ToDouble(txtLon.Text), Convert.ToDouble(txtLat.Text)), 12)); } else { MessageBox.Show(rcc.Erro.Message); } }); } void amap_MarkerClickListener(AMapMarker sender, AMapEventArgs args) { sender.ShowInfoWindow(new AInfoWindow() { Title = sender.Title, ContentText = sender.Snippet, }); } private async void Button_Click(object sender, RoutedEventArgs e) { amap.Clear(); if (string.IsNullOrWhiteSpace(txtLat.Text) && string.IsNullOrWhiteSpace(txtLon.Text)) { return; } await GeoCodeToAddress(Convert.ToDouble(txtLon.Text), Convert.ToDouble(txtLat.Text)); }
已知一個地址或者模糊地址,而後你想知道該地址詳細信息或者周邊信息(周邊POI點)。先經過地址獲取經緯度,而後經過逆地理編碼獲取詳細信息。在此不做出示例。api
目前高德地圖WP SDK中並無提供直接批量轉換的接口,而在REST API中已經提供了,你能夠在開發者論壇REST API版塊中提出接口使用申請,連接:高德地圖rest api接口申請方式 async