我想要将地图视图放大到1公里半径,但不能弄清楚如何?
该文档说,缩放级别1将地球赤道映射到256像素。 那么如何计算需要设置的缩放级别,以便地图视图显示1KM半径的区域?
更新: 阅读几篇博客文章后,我写了以下代码:
private int calculateZoomLevel() { double equatorLength = 6378140; // in meters double widthInPixels = screenWidth; double metersPerPixel = equatorLength / 256; int zoomLevel = 1; while ((metersPerPixel * widthInPixels) > 2000) { metersPerPixel /= 2; ++zoomLevel; } Log.i("ADNAN", "zoom level = "+zoomLevel); return zoomLevel; }这个想法是,首先我计算缩放级别1中的每像素的米数 ,根据谷歌显示赤道地球使用256个像素。 现在每个随后的缩放级别放大2的等级,所以每个缩放级别每像素的一半米。 我做到这一点,直到我有一个缩放级别, 每米像素乘以屏幕宽度使我小于2000,即2公里。
但我不认为我得到的缩放级别显示2Km半径的地图。 有人可以告诉我我在这里做错了吗?
I want to set the map view zoomed to 1km radius but cant figure out how?
The doc says that the zoom level 1 will map earths equator to 256 pixels. So how do I calculate which zoom level I need to set so that the map view shows area in 1KM radius?
UPDATE: After reading a few blog posts I wrote the following code:
private int calculateZoomLevel() { double equatorLength = 6378140; // in meters double widthInPixels = screenWidth; double metersPerPixel = equatorLength / 256; int zoomLevel = 1; while ((metersPerPixel * widthInPixels) > 2000) { metersPerPixel /= 2; ++zoomLevel; } Log.i("ADNAN", "zoom level = "+zoomLevel); return zoomLevel; }The idea is that first I calculate Meters per pixel in the zoom level 1, which according to google shows equator of earth using 256 pixels. Now every subsequent zoom level magnifies by a level of 2 so I half the meters per pixel for every zoom level. I do this until I have a zoom level where meters per pixel multiplied by the screen width gives me less than 2000 i.e 2 Km across.
But I dont think that the zoom level I am getting is showing the map of 2Km radius. Can some one tell me what I am doing wrong here?
最满意答案
虽然这个答案是合乎逻辑的,我发现它工作,但结果不准确我不知道为什么,但我厌倦了这种方法,这种技术是更准确的。
1)在所需半径的物体上做一个圆
Circle circle = mGoogleMap.addCircle(new CircleOptions().center(new LatLng(latitude, longitude)).radius(getRadiusInMeters()).strokeColor(Color.RED)); circle.setVisible(true); getZoomLevel(circle);2)将该对象传递给此功能并设置缩放级别以下是一个链接
public int getZoomLevel(Circle circle) { if (circle != null){ double radius = circle.getRadius(); double scale = radius / 500; zoomLevel =(int) (16 - Math.log(scale) / Math.log(2)); } return zoomLevel; }The following code is what ended up using. Given the screen width and the fact that at zoom level 1 the equator of Earth is 256 pixels long and every subsequent zoom level doubles the number of pixels needed to represent earths equator, the following function returns the zoom level where the screen will show an area of 2Km width.
private int calculateZoomLevel(int screenWidth) { double equatorLength = 40075004; // in meters double widthInPixels = screenWidth; double metersPerPixel = equatorLength / 256; int zoomLevel = 1; while ((metersPerPixel * widthInPixels) > 2000) { metersPerPixel /= 2; ++zoomLevel; } Log.i("ADNAN", "zoom level = "+zoomLevel); return zoomLevel; }更多推荐
发布评论