protected void SetGeocodeData(Apartment apartment)
        {
            var request = new GeocodingAddressRequest()
            {
                Street = apartment.Street,
                ZipCode = apartment.ZipCode,
                City = apartment.City.Name,
                Country = apartment.City.Country,
                Culture = "en"
            };
            try
            {
                var addresses = GeocodingService.GeocodeAddress(request);
                if (addresses != null && addresses.Count == 1)
                {
                    var address = addresses.First();
                    apartment.Latitude = address.Geometry.Location.Latitude;
                    apartment.Longitude = address.Geometry.Location.Longitude;
                    apartment.Neighborhood = address.GetComponent("sublocality_level_1");
                    apartment.Locality = address.GetComponent("sublocality_level_2");

                    if (!string.IsNullOrEmpty(apartment.Neighborhood))
                    {
                        apartment.Neighborhood = apartment.Neighborhood.Replace("Bezirk", string.Empty).Trim();
                    }

                    // replace the street with the returned info. Google Api return higher quality addresses (i.e. "Sybelstraße" vs "Sybelstr.")
                    apartment.Street = address.GetComponent("route") + " " + address.GetComponent("street_number");
                }
            }
            catch (Exception)
            {
                // ignore error and move on
            }
        }
        public List<Address> GeocodeAddress(GeocodingAddressRequest request)
        {
            if (string.IsNullOrWhiteSpace(request.Street))
            {
                throw new Exception("Street cannot be empty");
            }
            var addressComponents = new List<string>();
            addressComponents.Add(request.Street);
            if (!string.IsNullOrWhiteSpace(request.ZipCode))
            {
                addressComponents.Add(request.ZipCode);
            }
            if (!string.IsNullOrWhiteSpace(request.City))
            {
                addressComponents.Add(request.City);
            }
            if (!string.IsNullOrWhiteSpace(request.State))
            {
                addressComponents.Add(request.State);
            }
            if (!string.IsNullOrWhiteSpace(request.Country))
            {
                addressComponents.Add(request.Country);
            }
            var address = string.Join(",", addressComponents);

            return GeocodeAddress(address, request.Culture);
        }
        public void BerlinAddressTest()
        {
            var request = new GeocodingAddressRequest
            {
                Street = "Sybelstraße 30",
                ZipCode = "10629",
                City = "Berlin",
                Country = "Germany",
                Culture = "en"
            };
            var addresses = Service.GeocodeAddress(request);

            Assert.IsNotNull(addresses);
            Assert.AreEqual(1, addresses.Count);
            Assert.AreEqual("Sybelstraße 30, 10629 Berlin, Germany", addresses.First().FormattedAddress);
        }