我正在使用 Google Maps API v2 开发 Android 应用程序。我的地图上有标记,我想圈出其中一个。通过使用 Circle 和 Circle Options 类,我设法轻松地做到了这一点。但我也希望我的圆圈在缩放或取消缩放时在屏幕上保持相同的大小,就像标记一样。这意味着圆必须具有以像素为单位的恒定半径。遗憾的是,我们无法在 API v2 中设置以像素为单位的半径。
我尝试了几种解决方案,但我并不满意。
在第一个中,我只是乘以或除以半径:
@Override
public void onCameraChange(CameraPosition position)
{
if(previousZoom > position.zoom) {
mSelectionCircle.setRadius(Math.abs(position.zoom - previousZoom)*2*mSelectionCircle.getRadius());
}
else if(previousZoom < position.zoom) {
mSelectionCircle.setRadius(Math.abs(position.zoom - previousZoom)*mSelectionCircle.getRadius()/2);
}
previousZoom = position.zoom;
}
起初它似乎可以工作,但在快速缩放或用手指缩放时会产生错误的结果。此外,缩放在屏幕上清晰可见。
我的第二个解决方案使用像素米转换。这个想法是在缩放/取消缩放时重新计算以米为单位的半径,因此圆圈在屏幕上的大小是恒定的。为此,我在屏幕上获得了 Circle 的当前位置:
Point p1 = mMap.getProjection().toScreenLocation(mSelectionCircle.getCenter());
然后我在圆的边缘创建另一个点:
Point p2 = new Point(p1.x + radiusInPixels, p1.y);
在哪里
int radiusInPixels = 40;
之后,我使用一个函数返回这两点之间的距离(以米为单位)。
private double convertPixelsToMeters(Point point1, Point point2) {
double angle = Math.acos(Math.sin(point1.x) * Math.sin(point2.x)
+ Math.cos(point1.x) * Math.cos(point2.x) * Math.cos(point1.y- point2.y));
return angle * Math.PI * 6378100.0; // distance in meters
}
6378100 是地球的平均半径。最后,我设置了 Circle 的新半径:
mSelectionCircle.setRadius(convertPixelsToMeters(p1, p2));
它在理论上应该有效,但我得到荒谬的半径值(10 ^ 7 m!)。转换函数可能是错误的?
那么有没有更简单的方法可以做到这一点,或者如果没有,您能否帮助我理解为什么我的第二个解决方案不起作用?
谢谢!