コード例 #1
0
        private Address[] ProcessAddresses(string name, IEnumerable <Address> allResults, double?latitude, double?longitude, string currentLanguage, GeoResult geoResult = null)
        {
            IEnumerable <Address> addressesGeocode;
            IEnumerable <Address> addressesPlaces = new Address[0];

            // ReSharper disable CompareOfFloatsByEqualityOperator
            if (latitude.HasValue && longitude.HasValue && (latitude.Value != 0 || longitude.Value != 0))
            // ReSharper restore CompareOfFloatsByEqualityOperator
            {
                addressesGeocode = allResults
                                   .OrderBy(adrs => Position.CalculateDistance(adrs.Latitude, adrs.Longitude, latitude.Value, longitude.Value));
            }
            else
            {
                addressesGeocode = allResults;
            }

            var term = name.FirstOrDefault();
            int n;

            if (!int.TryParse(term + "", out n))
            {
                var nearbyService = new Places(_placeProvider, _appSettings, _popularAddressProvider);

                addressesPlaces = nearbyService.SearchPlaces(name, latitude, longitude, currentLanguage);
            }

            return(addressesGeocode
                   .Take(20)
                   .Concat(addressesPlaces.Take(20))
                   .OrderBy(p => AddressSortingHelper.GetRelevance(p, name, latitude, longitude))
                   .ToArray());
        }
コード例 #2
0
        public Address[] SearchPlaces(string query, double?latitude, double?longitude, string currentLanguage)
        {
            // the radius depends on what we want, if we have a query, then search larger, otherwise use nearby radius
            var radius = query.HasValueTrimmed()
                ? _appSettings.Data.GeoLoc.SearchRadius <= 0 ? 45000 : _appSettings.Data.GeoLoc.SearchRadius
                : _appSettings.Data.NearbyPlacesService.DefaultRadius <= 0 ? 500 : _appSettings.Data.NearbyPlacesService.DefaultRadius;

            #if DEBUG
            Console.WriteLine(string.Format("Places.SearchPlaces with query: {0} radius: {1}", query.HasValueTrimmed() ? query : "(none) [nearby]", radius));
            #endif

            latitude  = (!latitude.HasValue || latitude.Value == 0) ? _appSettings.Data.GeoLoc.DefaultLatitude : latitude;
            longitude = (!longitude.HasValue || longitude.Value == 0) ? _appSettings.Data.GeoLoc.DefaultLongitude : longitude;

            var popularAddresses = Enumerable.Empty <Address>();

            var topPopularAddresses    = Enumerable.Empty <Address>();
            var bottomPopularAddresses = Enumerable.Empty <Address>();


            popularAddresses = from a in _popularAddressProvider.GetPopularAddresses()
                               select a;

            topPopularAddresses = popularAddresses.Take(_appSettings.Data.NumberOfPreferredPlacesToShow);

            if (latitude.HasValue && longitude.HasValue)
            {
                if (string.IsNullOrEmpty(query))
                {
                    bottomPopularAddresses = popularAddresses.Skip(_appSettings.Data.NumberOfPreferredPlacesToShow);
                }
                else
                {
                    var words = query.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                    bottomPopularAddresses = from a in popularAddresses.Skip(_appSettings.Data.NumberOfPreferredPlacesToShow)
                                             where
                                             words.All(
                        w =>
                        a.FriendlyName.ToUpper().Contains(w.ToUpper()) ||
                        a.FullAddress.ToUpper().Contains(w.ToUpper()))
                                             select a;
                }

                bottomPopularAddresses = bottomPopularAddresses.ForEach(p => p.AddressType = "popular");
            }

            var places = !query.HasValueTrimmed()
                ? _client.GetNearbyPlaces(latitude, longitude, currentLanguage, radius)
                : _client.SearchPlaces(latitude, longitude, query, currentLanguage, radius);

            var result = bottomPopularAddresses
                         .Concat(places.Select(ConvertToAddress));

            if (latitude.HasValue && longitude.HasValue)
            {
                result = result.OrderBy(p => AddressSortingHelper.GetRelevance(p, query, latitude, longitude));
            }

            // make sure the company favorites are at the top
            result = topPopularAddresses
                     .Concat(result);

            // take top 15
            result = result.Take(15);

            #if DEBUG
            Console.WriteLine("Places.SearchPlaces results");
            foreach (var address in result)
            {
                Console.WriteLine(string.Format("    {0}", address.DisplayLine1));
            }
            #endif

            return(result.ToArray());
        }