【高德地图API】地理编码与逆地理编码
一、地理编码
该功能实现地理编码服务,即地址匹配,从已知的地址描述到对应的经纬度坐标的转换,即根据地址信息,查询该地址所对应的点坐标等,地址(address) 为必选项,城市(city)为可选项。
<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)为可选项,详细的参数说明参见参考手册。
<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点)。先通过地址获取经纬度,然后通过逆地理编码获取详细信息。在此不作出示例。
四、批量逆地理编码
目前高德地图WP SDK中并没有提供直接批量转换的接口,而在REST API中已经提供了,你可以在开发者论坛REST API版块中提出接口使用申请,链接:高德地图rest api接口申请方式
作者:十一_x
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议