【问题标题】:Do address lookup using culture and language of current country of W10 device使用 W10 设备当前国家/地区的文化和语言进行地址查找
【发布时间】:2017-03-06 08:42:29
【问题描述】:

我正在开发一个使用地图控件的 UWP 应用程序,该应用程序允许用户通过使用各种方法(例如单击 UWP 地图控件)在地图上添加航点来规划路线。我希望允许用户添加航点或位置的方法之一是按实际地址搜索。我使用下面的 BING Maps REST 服务代码,但如果我不提供当前使用应用程序的语言和文化,它总是首先返回美国地址,这对不在美国的用户显然没有用(是的,微软,一些我们中的一些人实际上住在美国以外 - 震惊,恐怖!)。我发现如果我为澳大利亚提供诸如“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”等。有谁知道如何我能做到这一点吗?我读过的所有关于本地化的东西都使用设备设置而不是当前的物理位置,所以我仍在尝试找出如何去做。

如果有人能提供帮助,我将不胜感激 :-)

【问题讨论】:

    标签: c# localization uwp bing-maps uwp-maps


    【解决方案1】:

    https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/Geolocation有一个获取位置的官方示例

    这将返回纬度和经度。然后,您可以使用不同的Bing API to get the country based on that lat/long

    这将为您提供一个国家/地区名称。有了这个,您可以查找预先生成的国家名称代码列表(在您的机器上使用CultureInfo.GetCultures() 创建),或者您可以查看this 以在运行时执行此操作,因为不支持GetCultures()在 UWP 中。

    使用区域设置更简单,但如果您想使用实际位置,那么这是要走的路。对于无法访问位置的设备,区域设置可能是一个很好的备份。

    另一种方法是使用各种公共 API 之一,它会根据 IP 地址为您提供位置等信息。由于在不同国家/地区使用代理等原因,这也不完美。

    【讨论】:

      【解决方案2】:

      感谢马特的回复,但我在 Bing 地图论坛的帮助下找到了解决方法。不是使用 REST API,而是使用 FindLocationsAsync 调用作为 UWP 地图 API 的一部分传递地址、本地地理点以使用起始参考(也称为“提示”位置)和要返回的最大匹配数......这是我使用的完美运行的代码。 (请注意,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;
          } 
      

      【讨论】:

      • 值得注意的是,这并不完全符合您的要求。 UWP Finder API 将始终使用操作系统显示语言进行搜索。操作系统显示语言可能与用户当前所在国家/地区的语言不匹配,这正是您所要求的。
      • 谢谢邓肯,但我认为您需要重新阅读我的原始帖子。我没有要求本地语言的结果——我想要的只是文化和语言字符串来为搜索提供种子,所以我首先得到的是当地/国家的结果,而不是美国地址。 FindLocationsAsync 实际上完全按照我的要求进行。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多