一、地理编码

该功能实现地理编码服务,即地址匹配,从已知的地址描述到对应的经纬度坐标的转换,即根据地址信息,查询该地址所对应的点坐标等,地址(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==)
{
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[]);
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()>)
{
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), ));
}
}
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, , "", 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(, )); amap.MoveCamera(CameraUpdateFactory.NewLatLngZoom(new LatLng(Convert.ToDouble(txtLon.Text), Convert.ToDouble(txtLat.Text)), ));
}
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接口申请方式

05-08 15:02