【问题标题】:Android GoogleMap getProjection() not workingAndroid GoogleMap getProjection()不起作用
【发布时间】:2013-09-02 17:28:06
【问题描述】:

这是我在这里的第一篇文章,所以我希望我能足够清楚地解释我的问题:

我正在扩展 FragmentActivity 类以创建 HeatMapActivity。在这个活动中,我使用了一个 GoogleMap 对象,我获得如下:

// Try to obtain the map from the SupportMapFragment.
map = ((SupportMapFragment) getSupportFragmentManager()
      .findFragmentById(R.id.heatmap)).getMap();

现在,在做空检查等之后,我在 setUpMap() 方法中添加了一个 TileOverlay,如下所示:

// Configure and add overlay
tileProvider = new HeatMapTileProvider(map);
map.addTileOverlay(new TileOverlayOptions()
      .tileProvider(tileProvider));

好的,到目前为止完全没有问题。我实现了TileProvider 接口来为热图叠加提供图块。

我想使用 Projection 对象在屏幕上的像素之间转换纬度/经度。 Projection 对象应该由GoogleMap 类的getProjection() 方法返回。

所以现在问题来了:如果我在 HeatMapActivity 类中使​​用以下代码,一切都很好:

System.err.println("Test1: " + map.getProjection().fromScreenLocation(new Point(50,  50)));

但是,如果我将 GoogleMap 对象分别转发给 TileProvider,我使用的渲染器,代码将不再工作:

public byte[] render(int x, int y, int zoom, GoogleMap map) {
  ...
  System.err.println("Test2: " + map);
  System.err.println("Test3: " + map.getProjection().fromScreenLocation(new Point(50,  50)));
  ...
}

我绝对知道,map 参数不为空(参见测试 2),但是当我调用 getProjection() 时,代码似乎被阻塞了。没有错误出现,如果我不使用 Projection 对象,其他一切都可以正常工作。我没有任何线索,为什么我不应该被允许从另一个类而不是活动调用 getProjection()...

我正在使用适用于 Windows 的 ADT 包(版本 x86_64-20130729),Android SDK 版本从 8 到 17,目前在 Android 2.3.5 上进行测试。显示地图,包含所需的库,并在 android 清单中设置权限。

有什么想法吗?任何帮助或提示表示赞赏。

赛博

【问题讨论】:

    标签: java android google-maps


    【解决方案1】:

    这里的问题是 getTile(和您的 render 方法)在 UI 线程之外被调用。
    这将导致您看不到的异常,因为它可能由调用getTile 的代码静默处理。这真的很糟糕,它不会崩溃,所以有人可以在 gmaps api 问题上发布问题。
    尝试在 try-catch 中封装对 getProjection 的调用以查看它。

    因为你不应该在主线程之外与GoogleMap进行交互,你将不得不找到另一种方式来实现,你想要实现的......

    无论如何,我可以想象没有充分的理由需要在getTile 中致电getProjection。也许是另一个描述你真正问题的问题?

    【讨论】:

    • “真正的问题”很简单:我想知道在哪里绘制热图的圆圈。我只有纬度/经度中“热点”的坐标,并且为了渲染图块,我需要知道在哪里绘制“热点”/以像素为单位的圆圈......因此我想使用投影,(丑陋的)可以找到替代方案here
    • 更新:你是绝对正确的,异常(尝试在 getProjection() 周围捕获)说:“不在主线程上”。所以我想我唯一的机会就是手工完成,如上面的链接中所述。还有其他(更优雅的)想法吗?
    • @user2740543 是的,这是一个真正的问题。遗憾的是,TileOverlay 在创建时并未考虑到动态叠加。 My answer here 还可以帮助您检查您的 LatLngs 是否在当前计算的图块内,然后通过简单的算术近似像素。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-31
    • 1970-01-01
    • 2014-05-16
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多