/// <summary> /// Takes an address as a string and then selects the next available geocoder to /// look up the address. Cycles through geocoders if they fails in order to get a result. /// </summary> /// <param name="address">The plain text address to look up.</param> /// <returns>A <see cref="GeocodeResponse"/> with the status of the lookup and a list of locations found.</returns> public async Task <GeocodeResponse> GeocodeAddressAsync(string address) { var geocodeRequest = new GeocodeRequest { Address = address, AddressKey = keyComposer.GenerateSourceKey(address), BoundsHint = null, }; var addressLookupResult = new GeocodeResponse(); var geocodersTried = new Dictionary <GeocoderNames, GeocodeStatus>(); do { var excludeGeocoders = geocodersTried.Select(g => g.Key).ToList(); var geocoder = await geocoderSelector.SelectNextGeocoderAsync(excludeGeocoders); if (geocoder == null) { break; } var geocoderResponse = await geocoder.GeocodeAddressAsync(geocodeRequest); if (geocoderResponse.ResponseStatus == GeocodeStatus.Success) { addressLookupResult.Locations = geocoderResponse .Locations .Select(l => new GeocodeResponseLocation { Bounds = l.Bounds, FormattedAddress = l.FormattedAddress, Location = l.Location, }) .ToList(); addressLookupResult.GeocoderId = geocoder.GeocoderId; addressLookupResult.Status = AddressLookupStatus.Geocoded; } geocodersTried.Add(geocoder.GeocoderId, geocoderResponse.ResponseStatus); }while (addressLookupResult.Status != AddressLookupStatus.Geocoded); addressLookupResult.Status = SummariseGeocodeStatus(geocodersTried); return(addressLookupResult); }
public async Task Bing_is_resolved_first() { var geocoder = await geocoderSelector.SelectNextGeocoderAsync(); Assert.Equal(GeocoderNames.Bing, geocoder.GeocoderId); }