@芋头 发表于 2017-3-24 10:44:32

航拍编程计划:让你的航拍照片变地图(三分之二)

一共两个楼层:


交通图、卫星图的实现


什么是地图图层
地图可以包含一个或多个图层,每个图层在每个级别都是由若干个图块组成的,它们覆盖了地图的整个表面。例如您所看到包括街道、兴趣点、学校、公园等内容的地图展现就是一个图层,另外交通流量的展现也是通过图层来实现的。
图层分类
1、底图
基本的地图图层,包括若干个缩放级别,显示基本的地图信息,包括道路、街道、学校、公园等内容。
2、实时交通信息图: MapView.setTraffic(true)
3、卫星图: MapView.setSatellite(true)
卫星地图是卫星拍摄的真实的地理面貌,所以卫星地图可用来检测地面的信息,你可以了解到地理位置,地形等。
布置一个MainActivity来装这些加强篇,即各个图形实现效果;
实现目的:MainActivity用一个ListView,文本方式采用自制的item样式,然后通过intent跳转到LayerDemo这个activity中,这个activity主要还是需要实现KEY的校验、底图的实现,另外增加的是交通图和卫星图,只要通过MapView.xxx调用即可。
实现效果:
当键盘点击1、2、3数字时,分别出现底图、交通图和卫星图。




MainActivity.Javapackage huaxa.it.map;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MainActivity extends Activity
{

    private static String[]         objects = new String[]
                                          { "hello world", "图层", "几何图形元素",
            "展示文字", "多条目绘制", "矩形范围内搜索", "圆形区域", "全城搜索", "驾车路线", "步行路线", "公交换乘",
            "我的位置"                        };
    private static Class[]          clazzs= new Class[]
                                          { HelloWorld.class,
      LayerDemo.class};

    private ListView                list;
    private ArrayAdapter<String>    adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      list = (ListView) findViewById(R.id.list);

      adapter = new ArrayAdapter<String>(getApplicationContext(),
                R.layout.item, objects);// Context context, int resource, int
                                        // textViewResourceId, List<T> objects)<--objects代表listView
      list.setAdapter(adapter);
      list.setOnItemClickListener(new OnItemClickListener()
      {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                  int position, long id)
            {
                Intent intent = new Intent(getApplicationContext(),
                        clazzs);
                startActivity(intent);
            }

      });

    }

}

LayerDemo.javapackage huaxa.it.map;

import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.MKGeneralListener;
import com.baidu.mapapi.map.MKEvent;
import com.baidu.mapapi.map.MapController;
import com.baidu.mapapi.map.MapView;
import com.baidu.platform.comapi.basestruct.GeoPoint;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.widget.Toast;

/**
* @项目名: BaiduMap
* @包名: huaxa.it.map
* @类名: LayerDemo
* @创建者: 黄夏莲
* @创建时间: 2016年11月29日 ,上午10:14:15
*
* @描述:地图图层(底图、实时交通、卫星图)
*/
public class LayerDemo extends Activity
{
    private BMapManager   manager;
    private MapController   controller;
    private MapView         mapView;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
      super.onCreate(savedInstanceState);
      // KEY的校验
      initManager();
      setContentView(R.layout.common);
      init();
    }

    private void init()
    {
      mapView = (MapView) findViewById(R.id.MapView);
      controller = mapView.getController();
      controller.setZoom(12);// 设置地图的缩放级别。 这个值的取值范围是。
      mapView.setBuiltInZoomControls(true);// 设置是否启用内置的缩放控件。
      // 如果启用,MapView将自动显示这些缩放控件。
    }

    /**
   * 初始化地图引擎
   */
    private void initManager()
    {
      manager = new BMapManager(getApplicationContext());

      /**
         * public boolean init(String strKey, MKGeneralListener listener) 参数:
         * strKey - 申请的授权验证码 listener -
         * 注册回调事件,该接口返回网络状态,授权验证等结果,用户需要实现该接口以处理相应事件
         */
      // KEY的校验
      manager.init(CanstantValue.KEY,null);

    }
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)
    {
      //地图图层(底图、实时交通、卫星图)
      switch (keyCode)
      {
            case KeyEvent.KEYCODE_1:
                // 底图
                mapView.setSatellite(false);
                mapView.setTraffic(false);
                break;
            case KeyEvent.KEYCODE_2:
                // 实时交通
                mapView.setTraffic(true);
                mapView.setSatellite(false);
                break;
            case KeyEvent.KEYCODE_3:
                // 卫星图
                mapView.setSatellite(true);
                mapView.setTraffic(false);

                break;
            default:
                break;
      }
      return super.onKeyDown(keyCode, event);
    }

    @Override
    protected void onResume()
    {
      // TODO Auto-generated method stub
      super.onResume();
      mapView.onResume();
    }

    @Override
    protected void onPause()
    {
      // TODO Auto-generated method stub
      super.onPause();
      mapView.onPause();
    }

    @Override
    protected void onDestroy()
    {
      // TODO Auto-generated method stub
      super.onDestroy();
      mapView.destroy();
    }

}
item.xml<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/text"
    android:layout_width="match_parent"
    android:layout_height="50dip"
    android:textColor="@android:color/black"
    android:textSize="20sp"
    android:gravity="center_vertical"
    />
activity_main.xml<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <ListView
      android:id="@+id/list"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content" />

</RelativeLayout>
Manifest.xml<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="huaxa.it.map"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
      android:minSdkVersion="16"
      android:targetSdkVersion="16" />

    <!-- gps -->
    <!-- 这个权限用于进行网络定位 -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" >
    </uses-permission>
    <!-- 这个权限用于访问GPS定位 -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" >
    </uses-permission>
    <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
    </uses-permission>
    <!-- 获取运营商信息,用于支持提供运营商信息相关的接口 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
    </uses-permission>
    <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位 -->
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >
    </uses-permission>
    <!-- 用于读取手机当前的状态 -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" >
    </uses-permission>
    <!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
    </uses-permission>
    <!-- 访问网络,网络定位需要上网 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- SD卡读取权限,用户写入离线定位数据 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" >
    </uses-permission>

    <application
      android:allowBackup="true"
      android:icon="@drawable/ic_launcher"
      android:label="@string/app_name"
      android:theme="@style/AppTheme" >


             <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
      </activity>


      <activity
            android:name=".HelloWorld"
            android:label="@string/app_name" >
      </activity>
                <activity
            android:name=".LayerDemo"
            android:label="@string/app_name" >
      </activity>
    </application>

</manifest>


@芋头 发表于 2017-3-24 10:44:55

本帖最后由 @芋头 于 2017-3-24 10:47 编辑

定位实现
1、实现目的:
MyLocationOverlay一个负责显示用户当前位置的Overlay。
自2.0.0版本开始,MyLocationOverlay只负责显示我的位置,位置数据请使用百度定位SDK获取,将获取的位置数据放在一个LocationData结构中并用该结构设置MyLcationOverlay的数据源,即可创建MyLocationOverlay。
LocationData数据获取
创建监听器:当获取到位置信息时,将信息添加到LocationData中,监听器需要实现BDLocationListener接口,
两个方法需要实现:
1.接收异步返回的定位结果,参数是BDLocation类型参数。
2.接收异步返回的POI查询结果,参数是BDLocation类型参数。
监听的设置:
创建LocationClient对象,注册监听registerLocationListener
设置定位参数(LocationClientOption):定位模式(单次定位,定时定位),返回坐标类型,是否打开GPS等等。
通过LocationClient的start、stop控制定位信息获取,在做中间可以手动发起定位的请求requestLocation前期准备:
离线文件下载,指定机型和城市下载对应的离线地图
2.0以上版本处理步骤
1、将下载好的离线地图包解压缩。
2、找到解压出的”BaiduMap”文件夹,把它放入手机存储卡根目录。在上述过程中如遇提示“是否需要覆盖文件”,点击确定即可。
断开与电脑连接,打开百度手机地图(如已打开请重启),系统会提示导入成功。
提示:下载多个城市包时,经解压后,这些城市数据都会被同时解压到BaiduMap文件夹中,不同城市不会出现被覆盖的情况。
1.X版本处理步骤
1、将离线地图加压,把Mapdata文件夹拷入SD卡根目录下的BaiduMapSdk下
2、利用MKOfflineMap在初始化(init)后调用scan()扫描本地地图资源。
实现过程:
百度开发者中心的相关文档http://lbsyun.baidu.com/index.php?title=android-locsdk/guide/getloc
实现效果:

MyLocationOverlayDemo .Javapackage huaxa.it.map;

import android.os.Bundle;
import android.os.Handler;
import android.util.Log;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.map.LocationData;
import com.baidu.mapapi.map.MyLocationOverlay;
import com.baidu.platform.comapi.basestruct.GeoPoint;

/**
* @项目名: BaiduMap
* @包名: huaxa.it.map
* @类名: MyLocationOverlayDemo
* @创建者: 黄夏莲
* @创建时间: 2016年12月3日 ,下午2:32:14
*
* @描述: TODO
*/
public class MyLocationOverlayDemo extends BaseActivity
{

    public LocationClient       mLocationClient;
    public BDLocationListener   myListener;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
      // TODO Auto-generated method stub
      super.onCreate(savedInstanceState);

      location();
    }

    private void location()
    {
      // ①发起定位请求
      mLocationClient = new LocationClient(getApplicationContext()); // 声明LocationClient类
      // ②参数设置
      LocationClientOption option = new LocationClientOption();
      option.setCoorType("bd09ll");// 可选,默认gcj02,设置返回的定位结果坐标系
      int span = 1000;
      option.setScanSpan(span);// 可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
      option.setOpenGps(true);// 可选,默认false,设置是否使用gps
      option.setLocationNotify(true);// 可选,默认false,设置是否当GPS有效时按照1S/1次频率输出GPS结果
      mLocationClient.setLocOption(option);
      // MyLocationClient myLocationClient = new MyLocationClient();
      // myLocationClient.start();
      myListener = new MyListener();
      mLocationClient.registerLocationListener(myListener); // 注册监听函数
      // ③设置响应,结果处理

    }

    // class MyLocationClient extends Handler implements Runnable
    // {
    //
    // @Override
    // public void run()
    // {
    // // ②参数设置
    // LocationClientOption option = new LocationClientOption();
    // option.setCoorType("bd09ll");// 可选,默认gcj02,设置返回的定位结果坐标系
    // int span = 1000;
    // option.setScanSpan(span);// 可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
    // option.setOpenGps(true);// 可选,默认false,设置是否使用gps
    // option.setLocationNotify(true);// 可选,默认false,设置是否当GPS有效时按照1S/1次频率输出GPS结果
    // mLocationClient.setLocOption(option);
    //
    // post(this);
    //
    // }
    //
    // public void start()
    // {
    // post(this);
    //
    // }
    //
    // }

    class MyListener implements BDLocationListener
    {

      @Override
      public void onReceiveLocation(BDLocation location)
      {
            if (location == null)
                return;
            MyLocationOverlay overlay = new MyLocationOverlay(mapView);
            LocationData locData = new LocationData();
            locData.latitude = location.getLatitude();
            locData.longitude = location.getLongitude();
            overlay.setData(locData);
            mapView.getOverlays().clear();
            mapView.getOverlays().add(overlay);
            mapView.refresh();
            // 地图移动
            controller.animateTo(new GeoPoint(
                  (int) (locData.latitude*1E6),(int)(locData.longitude*1E6)));
      }

      @Override
      public void onReceivePoi(BDLocation location)
      {

      }

    }

    /**
   * GPS很耗费资源,为了减少资源
   */
    @Override
    protected void onResume()
    {
      // TODO Auto-generated method stub
      super.onResume();
      mLocationClient.start();
    }

    @Override
    protected void onPause()
    {
      // TODO Auto-generated method stub
      super.onPause();
      mLocationClient.stop();
    }

}

阿明flying 发表于 2017-3-24 12:55:59

看不懂

@芋头 发表于 2017-3-24 13:28:32

阿明flying 发表于 2017-3-24 12:55
看不懂

百度手机地图使用航拍图片代替,实现公交等便民服务。

kenneth_chun 发表于 2017-3-24 15:22:13

http://www.moz8.com//mobcent//app/data/phiz/default/25.pnghttp://www.moz8.com//mobcent//app/data/phiz/default/25.pnghttp://www.moz8.com//mobcent//app/data/phiz/default/25.png

34535345135 发表于 2017-3-24 17:04:13

这个有点专业啊

清枫城主 发表于 2017-3-24 23:05:43

666很厉害

15968419451 发表于 2017-3-25 23:22:11

厉害,收藏了

tjcdq 发表于 2017-3-26 23:19:08

整的太专业了吧!
页: [1]
查看完整版本: 航拍编程计划:让你的航拍照片变地图(三分之二)