android百度地图:地图缩放、旋转、俯视角度以及屏幕像素与经纬度的转换Projection

本文介绍了如何在Android中使用百度地图API进行地图的缩放、旋转和俯视操作,以及如何利用Projection对象将屏幕坐标转换为经纬度。通过MapController的setZoom、setRotation和setOverlooking方法实现地图动态调整,同时展示了如何监听手势事件并进行坐标转换。此外,还提到了getProjection方法的几个关键功能,包括fromPixels、toPixels和metersToEquatorPixels。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MapControlDemo.java

  1.  通过MapController设置缩放、旋转、俯视角度
    private void perfomZoom(){
        	EditText  t  = (EditText) findViewById(R.id.zoomlevel);
        	try{
        	    float zoomLevel = Float.parseFloat(t.getText().toString());
        	    mMapController.setZoom(zoomLevel);
        	}catch(NumberFormatException e){
        		Toast.makeText(this, 
        	         "请输入正确的缩放级别", Toast.LENGTH_SHORT)
        		     .show();
        	}
        }
        /**
         * 处理旋转 
         * 旋转角范围: -180 ~ 180 , 单位:度   逆时针旋转  
         */
        private void perfomRotate(){
        	EditText  t  = (EditText) findViewById(R.id.rotateangle);
        	try{
        	    int rotateAngle = Integer.parseInt(t.getText().toString());
        	    mMapController.setRotation(rotateAngle);
        	}catch(NumberFormatException e){
        		Toast.makeText(this, 
        	         "请输入正确的旋转角度", Toast.LENGTH_SHORT)
        		     .show();
        	}
        }
        /**
         * 处理俯视
         * 俯角范围:  -45 ~ 0 , 单位: 度
         */
        private void perfomOverlook(){
        	EditText  t  = (EditText) findViewById(R.id.overlookangle);
        	try{
        	    int overlookAngle = Integer.parseInt(t.getText().toString());
        	    mMapController.setOverlooking(overlookAngle);
        	}catch(NumberFormatException e){
        		Toast.makeText(this, 
        	         "请输入正确的俯角", Toast.LENGTH_SHORT)
        		     .show();
        	}	
        }
        

  2. 调用mapview.getCurrentMap()截图
    @Override
    			public void onGetCurrentMap(Bitmap b) {
    				/**
    				 *  当调用过 mMapView.getCurrentMap()后,此回调会被触发
    				 *  可在此保存截图至存储设备
    				 */
    				File file = new File("/mnt/sdcard/test.png");
                    FileOutputStream out;
                    try{
                        out = new FileOutputStream(file);
                        if(b.compress(Bitmap.CompressFormat.PNG, 70, out)) 
                        {
                            out.flush();
                            out.close();
                        }
                        Toast.makeText(MapControlDemo.this, 
                        	    "屏幕截图成功,图片存在: "+file.toString(),	
                        		 Toast.LENGTH_SHORT)
                             .show();
                    } 
                    catch (FileNotFoundException e) 
                    {
                        e.printStackTrace();
                    } 
                    catch (IOException e) 
                    {
                        e.printStackTrace(); 
                    }
                    
    			}
    
    前面说过,只要调用mMapView.getCurrentMap() 就可触发MKMapViewListener的上述方法。
  3.  监听手势所在的屏幕坐标转换为经纬度
    listener = new OnTouchListener(){
    			@Override
    			public boolean onTouch(View arg0, MotionEvent arg1) {
    				/**
    				 * Projection 用于将屏幕坐标转换为地理位置坐标
    				 */
    				int x = (int)arg1.getX();
    				int y = (int)arg1.getY();
    				currentPt = mMapView.getProjection().fromPixels(x , y);
    				updateMapState();
    				/**
    				 * 传递点击事件给MapView,sdk会自己处理缩放,平移等手势操作
    				 */
    				return false;
    			}
            };
            mMapView.setOnTouchListener(listener);
    MapView调用getProjection返回的自然是Projection对象,Projection有3个方法:

      1 GeoPoint fromPixels(int x, int y) 根据屏幕像素坐标返回GeoPoint对象。

      2 Point toPixels(GeoPoint in, Point out)把给定的GeoPoint变换到当前MapView的屏幕像素坐标,Point out 是一个预先输入的对象,如         果为空,将返回一个新分配的像素点。(其实我对out的理解有些模糊,api里说的很不明确。不知道它的作用明确是什么,它与in的关系是什         么,与返回的Point对象有什么关系,在使用这个方法的时候是不是out的值默认为null)。根据我自己的代码的测试,out的值与输出数据并         无直接关系。可以在上述代码中添加以下代码验证我的结论:

   

Point point1 = new Point(200,900);
Point point= mMapView.getProjection().toPixels(p, point1);
Point point= mMapView.getProjection().toPixels(p, null);
System.out.println("point:"+point.x+","+point.y);

      3 float metersToEquatorPixels(float meters)。该方法把以米为计量单位的距离(沿赤道)在当前缩放水平下转换到一个以像素(水平)为计量单位的距离。 在默认的Mercator投影变换下,对于给定的距离,当远离赤道时,变换后确切的像素数量会增加。
参数:
meters - 以米为单位的距离
返回:
相对给定距离的像素数量。在当前的缩放水平,如果沿赤道测量,返回值可能是个近似值



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值