Выполните поиск адресов, используя культуру и язык текущей страны устройства W10

Я занимаюсь разработкой приложения UWP с использованием элемента управления "Карты", который позволяет пользователю планировать маршрут, добавляя путевые точки на карту, используя различные методы, такие как нажатие на элемент управления "Карта UWP". Один из способов, с помощью которого я хочу разрешить пользователю добавлять путевую точку или местоположение, - это поиск по фактическому адресу. Я использую приведенный ниже код служб BING Maps REST, но если я не предоставляю язык и культуру, в которой приложение используется в настоящее время, он всегда сначала возвращает американские адреса, которые явно бесполезны для пользователей не в США (да, Microsoft, некоторые из нас фактически живут за пределами США - шок, ужас!). Я обнаружил, что если я предоставлю строку языковой культуры, такую ​​как "en-AU", для Австралии, то она будет сначала искать адреса в Австралии, и это работает очень хорошо.

public async Task<List<WayPoint>> FindAddress(string address)
    {
        List<WayPoint> matchingWaypoints = new List<WayPoint>();

        //Create a Geocode request to submit to the BING Maps REST service.
        var request = new GeocodeRequest()
        {
            Query = address.Trim(),
            Culture = "en-AU",  //HOW CAN I GET THIS FROM THE DEVICE'S CURRENT LOCATION???
            IncludeIso2 = true,
            IncludeNeighborhood = true,
            MaxResults = 10,
            BingMapsKey = MapServiceToken
        };

        //Process the request by using the BING Maps REST services.
        var response = await ServiceManager.GetResponseAsync(request);

        if (response != null &&
            response.ResourceSets != null &&
            response.ResourceSets.Length > 0 &&
            response.ResourceSets[0].Resources != null &&
            response.ResourceSets[0].Resources.Length > 0)
        {
            int wpNumber = 0;
            foreach (BingMapsRESTToolkit.Location loc in response.ResourceSets[0].Resources)
                matchingWaypoints.Add(new WayPoint(wpNumber++, loc.Address.FormattedAddress, loc.Point.Coordinates[0], loc.Point.Coordinates[1]));               
        }

        return matchingWaypoints;
    }

Так что я, очевидно, хочу сделать, это извлечь эту строку на основе текущего местоположения устройства (т.е. страны), а не из настроек региона устройства. Так, например, если кто-то использует приложение США, я хочу указать en-US, если они в Новой Зеландии, то это будет en-NZ, если во Франции это будет "fr-FR" и т. Д. Кто-нибудь знает, как Я мог бы сделать это? Все, что я читал о локализации, использует настройки устройства, а не текущее физическое местоположение, поэтому я все еще пытаюсь понять, как это сделать.

Если кто-то может помочь, я действительно ценю это:-)

2 ответа

Официальный пример того, как найти местоположение, можно найти по адресу https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/Geolocation

Это вернет широту и долготу. Затем вы можете использовать другой API Bing, чтобы получить страну на основе этого широты / долготы.

Это даст вам название страны. При этом вы можете искать предварительно сгенерированный список кодов для названий стран (созданный с CultureInfo.GetCultures() на вашей машине), или вы можете посмотреть на это для способа сделать это во время выполнения, как GetCultures() не поддерживается в UWP.

Использовать региональные настройки проще, но если вы хотите использовать фактическое местоположение, то это путь. Для устройств, где доступ к местоположению недоступен, региональные настройки могут быть хорошей резервной копией.

Другим подходом может быть один из различных общедоступных API, который предоставит вам такую ​​информацию, как местоположение на основе IP-адреса. Это также не идеально из-за использования прокси в разных странах и т. Д.

Спасибо за ответ, Мэтт, но я решил, как это сделать с помощью форума Bing Maps. Вместо использования REST API я использую вызов FindLocationsAsync как часть API карты UWP, передающего адрес, локальный геопункт для использования начальной ссылки (также называемой "подсказкой") и максимального числа совпадений для возврата... Вот код, который я использовал, который отлично работает. (Обратите внимание, что WayPoint - это объект из моей модели для хранения различной информации о путевой точке на маршруте.)

public async Task<List<WayPoint>> FindAddress(string address)
    {
        List<WayPoint> matchingWaypoints = new List<WayPoint>();

        // Use current location as a query hint so nearest addresses are returned.
        BasicGeoposition queryHint = new BasicGeoposition();
        queryHint.Latitude = this.CurrentLocation.Position.Latitude;
        queryHint.Longitude = this.CurrentLocation.Position.Longitude;
        Geopoint hintPoint = new Geopoint(queryHint);

        MapLocationFinderResult result =
           await MapLocationFinder.FindLocationsAsync(address.Trim(), hintPoint, 5);

        // If the query returns results, store in collection of WayPoint objects.
        string addresses = "";
        if (result.Status == MapLocationFinderStatus.Success)
        {
            int i = 0;
            foreach (MapLocation res in result.Locations)
            {
                matchingWaypoints.Add(new WayPoint(i++, res.Address.FormattedAddress, res.Point.Position.Latitude, res.Point.Position.Longitude));
            }
        }
        return matchingWaypoints;
    } 
Другие вопросы по тегам