我正在使用地图控件开发一个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;
}
所以我显然想做的是根据设备的当前位置(即:country)得出该字符串,而不是从设备的区域设置中得出。因此,例如,如果某人正在使用该应用程序,我想指定EN-US,如果他们在新西兰,那将是en-nz,如果在法国,那将是" fr-fr"等。我可以做到吗?我阅读的有关本地化的所有内容都使用设备设置而不是当前的物理位置,因此我仍在尝试找出如何做。
如果有人能提供帮助,我将非常感谢: - )
有一个官方示例,有关如何在https://github.com/microsoft/windows-universal-samples/tree/master/master/samples/geolocation获取位置
这将返回纬度和经度。然后,您可以使用不同的Bing API根据该lat/long获取该国。
这将为您提供一个国家名称。有了这个,您可以在国家名称的预先生成的代码列表(用计算机上使用CultureInfo.GetCultures()
创建),也可以查看此操作时在运行时这样做的方法,因为UWP中不支持GetCultures()
。
使用区域设置更简单,但是如果要使用实际位置,那么这就是要走的方式。对于无法访问位置的设备,区域设置可能是一个不错的备份。
另一种方法将是各种公共API之一,它将为您提供基于IP地址的位置等信息。由于在不同国家/地区使用代理等,这也不是完美的。
感谢您的回复,但我在Bing Maps论坛的帮助下弄清楚了如何做到这一点。而不是使用REST API AM使用FindLocationsAsync调用作为UWP MAP API的一部分,而是在地址中传递的一部分,而是使用启动参考的本地地理点(aka a"提示"位置)和要返回的最大匹配项...这是我使用的代码完美工作。(请注意,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;
}