Exemplo n.º 1
0
        /// <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);
        }