作为背景…我正在开发一个原生Android应用程序使用Android谷歌地图v2。我的要求如下:
需求#1:显示由两个LatLng分隔的特定地理区域的卫星图像。注意,这些latlng表示我想要显示的矩形地图区域的"中心线端点"(与地图区域的东北角和东南角相反)。为了清晰起见,我想显示的地图区域是高尔夫球场上的一个球洞,我使用的两个latlng表示特定高尔夫球洞的Tee位置和Pin/hole位置。
这个没有问题....这部分的解决方案似乎很简单。我使用以下代码显示带有适当边界的地图:
public void onCameraChange(CameraPosition arg0) {
// Determine the bounds and then move camera
LatLngBounds bounds = new LatLngBounds.Builder()
.include(TPS_PIN)
.include(TPS_HOLE)
.build();
googleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 10));
要求#2:旋转地图图像,以便在纵向模式下Tee位置在手机屏幕的底部,Pin/孔位置在手机屏幕的顶部。
虽然有一个方法来旋转一个地图图像(camerposition。生成器使用它的"轴承"参数)显然你不能使用这个与latlnbounds方法(如上所述)来完成我的目标(绑定和旋转地图图像)。还有另一个StackOverflow张贴(Android地图V2 newlatlnbounds与轴承),作者有类似的目标,但不幸的是,提供的答案并没有解决问题。然而,如果他建议的答案不起作用(确实不起作用),回答者建议采用以下方法:
"你可能需要自己计算目标和缩放,使用投影,所以你可以设置边界作为上面第一个moveCamera()调用的一部分。"
遗憾的是没有提供更多的细节。我看过投影,但找不到一个方法来实现我的目标。
有没有人看到一个方法来实现我的目标(绑定和旋转)?也许有一种方法可以使用投影来做到这一点?记住,我只有两个LatLng点可用(发球台位置和球钉/洞位置)。我需要确保整个洞都能在屏幕上显示。
正如我上面提到的,我需要确定如何旋转图像,以便当手机处于拍照模式时,Tee位于手机屏幕的底部,而孔/引脚位置位于屏幕的顶部。再次需要确保整个洞(tee &针(孔)与屏幕吻合。有没有办法将一个特定的拉丁文"钉"到屏幕底部,另一个拉丁文"钉"到手机屏幕顶部?
只是重申,我需要一个解决方案,与Android地图v2 api工作。
如有任何建议,我将不胜感激。即使它们是高层次的"指向性"建议。也就是说,希望"指向性"的建议会有足够的细节,让我把这些点联系起来。回答我自己的问题。我不确定这是否是实现我的目标的最佳方式(即,显示绑定旋转图像(到90度)与适当的缩放级别)。如果有更好的方法,我很乐意听听。
在较高的层次上,我是这样做的:
- 使用latlnbounds首先获得包含我的两个LatLng坐标的地图图像。
- 获得该地图图像的投影,以提取/计算其他属性(目标,缩放级别,坡度/方位),然后用于显示图像。 然后我使用camerposition . builder()与上述参数提取/计算来构建和显示最终的地图图像。
所以这是有效的,但我不确定这是实现我的目标的最有效的方式。例如,我使用"LatLngBounds",然后"moveCamera(CameraUpdateFactory)"。newlatlnbounds (bounds, 25)"生成地图,这样我就可以提取缩放级别。不幸的是,使用"moveCamera"方法会导致在生成和显示最终旋转地图图像之前生成和显示"临时"地图图像(至少在模拟器中)。除了让第一张图像的残余物短暂出现在屏幕上的视觉"故障"之外,似乎生成一个临时地图来获得最终地图所需的关键属性是一种低效的方法。
也许有一种方法来获得缩放水平没有实际生成的图像?顺便说一句,在我的应用程序中,将zoomLevel设置为可能的最大级别,同时仍然显示整个洞是至关重要的。因为任何高尔夫球洞的长度都可能有很大的变化,所以zoomLevel在不同的洞之间也会有很大的变化,所以我不可能把zoomLevel设置为"X",并期望它对每个洞都有效。此外,我的解决方案需要与世界上任何40K以上的高尔夫球场一起工作,所以我不能为每个高尔夫球洞存储适当的变焦水平。