Xamarin表格地图地理编码器不适用于UWP设备

时间:2017-07-13 14:46:18

标签: xamarin.forms

我的应用使用Xamarin.Forms.Maps显示地图以及地理编码。当用户从主页面导航到地图时,地图将显示在单独的页面上。我使用地理编码器反转地理编码当前位置,以便我有地址。这是从地图页面以外的其他地方完成的。

当我在设备上运行应用程序时(即使在调试模式下),地理编码器会立即在iOS和Android中运行,但在UWP中不起作用。导航到地图页面并显示地图后,返回其他页面以使用它开始工作的地理编码器。

我看到一个关于地图的线程没有使用发布版本,所以我添加了以下代码:

var laRendererAssemblies = new[] { typeof(Xamarin.Forms.Maps.UWP.MapRenderer).GetTypeInfo().Assembly };
Xamarin.Forms.Forms.Init(e, laRendererAssemblies);
//Xamarin.Forms.Forms.Init(e);
Xamarin.FormsMaps.Init("MyBingMapsKey");

这对Xamarin.Forms.Maps.Geocoder没有帮助。我也尝试在我的主页面中创建一个Xamarin.Forms.Maps.Map的实例,但这也没有帮助。有没有办法填充地图组件,以便Geocoder可以在设备上工作? (我的测试设备是ARM,但是当我在Local上运行时会发生这种情况 机器(Win 10)也是如此)

以下是对地理编码器的调用片段(一旦用户导航到地图页面并返回后工作正常 - 它在iOS和Android中运行正常 - 因此我不相信它是代码有问题,但这里是:)

    public static async Task<Plugin.Geolocator.Abstractions.Position> Geocode(string address)
    {
        try
        {
            var loGeocoder = new Xamarin.Forms.Maps.Geocoder();
            System.Diagnostics.Debug.WriteLine("Get Lat/Lon");
            var lcolPositions = await loGeocoder.GetPositionsForAddressAsync(address);
            if (lcolPositions != null)

2 个答案:

答案 0 :(得分:1)

在做了一些研究并确保您的geodecode类是静态的并不会弄乱UWP构建中的async / await模式。我在其他地方使用内置的Forms.Map geodecoder来了解这个特定问题的一些参考,不仅仅是UWP,它也被注意到了android

我花了一些时间来查看我们当前在应用商店中存在的跨平台应用程序之一,根据我们的内部文档,我们将xamarin.forms映射和自定义的geodecoder转换为

我们用于跨平台应用程序的插件是&#39; GelocatorPlugin&#39;由james montemagno创建,可以找到here.

如果您愿意,它可以作为Nuget包添加到您的项目中,并且它的实现与默认包的实现非常相似,因此只需更改很少的代码。主要好处是geodecode插件的UWP元素已经过修改,以考虑Windows高级跟踪方案(details found here)。

它应该比你使用的稳定得多,一旦安装你只需使用它:

  

反向地理编码

     

根据传入的位置,thi swill获取一个列表   地址。

     

UWP需要Bing Map Key,您可以通过阅读本文获取   piece of documentation

try
{ 
  var addresses = await locator.GetAddressesForPositionAsync (position, string mapKey = null);
  var address = addresses.FirstOrDefault();

  if(address == null)
    Console.WriteLine ("No address found for position.");
  else
    Console.WriteLine ("Addresss: {0} {1} {2}", address.Thoroughfare, address.Locality, address.Country);
}
catch(Exception ex)
{
  Debug.WriteLine("Unable to get address: " + ex);
}

类似问题的链接 - Link 1Link 2

答案 1 :(得分:0)

  在APP.xaml.cs(UWP项目)中添加以下行后解析

Xamarin.FormsMaps.Init("bingmapkey");
Windows.Services.Maps.MapService.ServiceToken = "bingmapkey";