2017-03-06 13 views
1

我正在开发一个使用地图控件的UWP应用程序,允许用户使用各种方法在地图上添加航点以规划路线,例如点击UWP地图控制。我希望允许用户添加航点或位置的方式之一是通过实际地址进行搜索。我使用下面的BING Maps REST服务代码,但如果我不提供当前正在使用的应用程序的语言和文化,它总是首先返回美国地址,这显然对于不在美国的用户是没有用的(是的,我们实际上住在美国以外 - 震惊,恐怖!)。我发现如果我为澳大利亚提供诸如“en-AU”这样的语言文化字符串,那么它将首先搜索澳大利亚地址,而且这种方法非常有效。使用W10设备的当前国家的文化和语言进行地址查找

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”等。有人知道如何我可以做到这一点?我读过的关于本地化的所有内容都使用了设备设置,而不是当前的物理位置,所以我仍然试图解决如何实现这一点。

如果任何人都可以帮帮忙我会很感激:-)

回答

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中查看在运行时执行此操作的方式,因为UWP不支持GetCultures()

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

另一种方法将是各种公共API中的一种,它将为您提供诸如基于IP地址的位置等信息。这也不是完美的,虽然由于在不同国家代理的使用等。

0

感谢您的回复马特,但我制定了如何在Bing Maps论坛的帮助下做到这一点。我们不使用REST API,而是将FindLocationsAsync调用作为UWP Map API的一部分传递给地址,本地地址点使用起始引用(又名'提示'位置)和最大匹配数返回...这里是我使用的完美工作的代码。 (请注意,航点从我的模型来存储有关航线上航点的各种信息的对象。)

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; 
    } 
+0

这是值得注意的是,这不会做你问什么。 UWP Finder API将始终使用OS显示语言进行搜索。操作系统显示语言可能与用户当前所在国家/地区的语言不符,这就是您要求的内容。 –

+0

谢谢邓肯,但我认为你需要重新阅读我原来的文章。我没有用当地语言要求结果 - 我只想要搜索文化和语言字符串来搜索结果,因此我首先获得了本地区/国家/地区的结果,而不是美国地址。 FindLocationsAsync实际上*完全*我所问的。 – nzmike

相关问题