模吧

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

4875查看 | 8回复

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

[复制链接]
发表于 2017-3-24 10:44:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
一共两个楼层:


交通图、卫星图的实现



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

航拍编程计划:让你的航拍照片变地图(三分之二) 交通图,照片,计划 作者:@芋头 2169

航拍编程计划:让你的航拍照片变地图(三分之二) 交通图,照片,计划 作者:@芋头 6106

航拍编程计划:让你的航拍照片变地图(三分之二) 交通图,照片,计划 作者:@芋头 5361

航拍编程计划:让你的航拍照片变地图(三分之二) 交通图,照片,计划 作者:@芋头 6379
MainActivity.Java
  1. package huaxa.it.map;

  2. import android.app.Activity;
  3. import android.content.Intent;
  4. import android.os.Bundle;
  5. import android.view.View;
  6. import android.widget.AdapterView;
  7. import android.widget.AdapterView.OnItemClickListener;
  8. import android.widget.ArrayAdapter;
  9. import android.widget.ListView;

  10. public class MainActivity extends Activity
  11. {

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

  19.     private ListView                list;
  20.     private ArrayAdapter<String>    adapter;

  21.     @Override
  22.     protected void onCreate(Bundle savedInstanceState)
  23.     {
  24.         super.onCreate(savedInstanceState);
  25.         setContentView(R.layout.activity_main);
  26.         list = (ListView) findViewById(R.id.list);

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

  33.             @Override
  34.             public void onItemClick(AdapterView<?> parent, View view,
  35.                     int position, long id)
  36.             {
  37.                 Intent intent = new Intent(getApplicationContext(),
  38.                         clazzs[position]);
  39.                 startActivity(intent);
  40.             }

  41.         });

  42.     }

  43. }
复制代码


LayerDemo.java
  1. package huaxa.it.map;

  2. import com.baidu.mapapi.BMapManager;
  3. import com.baidu.mapapi.MKGeneralListener;
  4. import com.baidu.mapapi.map.MKEvent;
  5. import com.baidu.mapapi.map.MapController;
  6. import com.baidu.mapapi.map.MapView;
  7. import com.baidu.platform.comapi.basestruct.GeoPoint;

  8. import android.app.Activity;
  9. import android.os.Bundle;
  10. import android.util.Log;
  11. import android.view.KeyEvent;
  12. import android.widget.Toast;

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

  27.     @Override
  28.     protected void onCreate(Bundle savedInstanceState)
  29.     {
  30.         super.onCreate(savedInstanceState);
  31.         // KEY的校验
  32.         initManager();
  33.         setContentView(R.layout.common);
  34.         init();
  35.     }

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

  44.     /**
  45.      * 初始化地图引擎
  46.      */
  47.     private void initManager()
  48.     {
  49.         manager = new BMapManager(getApplicationContext());

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

  57.     }
  58.     @Override
  59.     public boolean onKeyDown(int keyCode, KeyEvent event)
  60.     {
  61.         //地图图层(底图、实时交通、卫星图)
  62.         switch (keyCode)
  63.         {
  64.             case KeyEvent.KEYCODE_1:
  65.                 // 底图
  66.                 mapView.setSatellite(false);
  67.                 mapView.setTraffic(false);
  68.                 break;
  69.             case KeyEvent.KEYCODE_2:
  70.                 // 实时交通
  71.                 mapView.setTraffic(true);
  72.                 mapView.setSatellite(false);
  73.                 break;
  74.             case KeyEvent.KEYCODE_3:
  75.                 // 卫星图
  76.                 mapView.setSatellite(true);
  77.                 mapView.setTraffic(false);

  78.                 break;
  79.             default:
  80.                 break;
  81.         }
  82.         return super.onKeyDown(keyCode, event);
  83.     }

  84.     @Override
  85.     protected void onResume()
  86.     {
  87.         // TODO Auto-generated method stub
  88.         super.onResume();
  89.         mapView.onResume();
  90.     }

  91.     @Override
  92.     protected void onPause()
  93.     {
  94.         // TODO Auto-generated method stub
  95.         super.onPause();
  96.         mapView.onPause();
  97.     }

  98.     @Override
  99.     protected void onDestroy()
  100.     {
  101.         // TODO Auto-generated method stub
  102.         super.onDestroy();
  103.         mapView.destroy();
  104.     }

  105. }
复制代码

item.xml
  1. <TextView xmlns:android="http://schemas.android.com/apk/res/android"
  2.     android:id="@+id/text"
  3.     android:layout_width="match_parent"
  4.     android:layout_height="50dip"
  5.     android:textColor="@android:color/black"
  6.     android:textSize="20sp"
  7.     android:gravity="center_vertical"
  8.     />
复制代码

activity_main.xml
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2.     xmlns:tools="http://schemas.android.com/tools"
  3.     android:layout_width="match_parent"
  4.     android:layout_height="match_parent"
  5.     tools:context=".MainActivity" >

  6.     <ListView
  7.         android:id="@+id/list"
  8.         android:layout_width="fill_parent"
  9.         android:layout_height="wrap_content" />

  10. </RelativeLayout>
复制代码

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

  6.     <uses-sdk
  7.         android:minSdkVersion="16"
  8.         android:targetSdkVersion="16" />

  9.     <!-- gps -->
  10.     <!-- 这个权限用于进行网络定位 -->
  11.     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" >
  12.     </uses-permission>
  13.     <!-- 这个权限用于访问GPS定位 -->
  14.     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" >
  15.     </uses-permission>
  16.     <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->
  17.     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
  18.     </uses-permission>
  19.     <!-- 获取运营商信息,用于支持提供运营商信息相关的接口 -->
  20.     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
  21.     </uses-permission>
  22.     <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位 -->
  23.     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >
  24.     </uses-permission>
  25.     <!-- 用于读取手机当前的状态 -->
  26.     <uses-permission android:name="android.permission.READ_PHONE_STATE" >
  27.     </uses-permission>
  28.     <!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据 -->
  29.     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
  30.     </uses-permission>
  31.     <!-- 访问网络,网络定位需要上网 -->
  32.     <uses-permission android:name="android.permission.INTERNET" />
  33.     <!-- SD卡读取权限,用户写入离线定位数据 -->
  34.     <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" >
  35.     </uses-permission>

  36.     <application
  37.         android:allowBackup="true"
  38.         android:icon="@drawable/ic_launcher"
  39.         android:label="@string/app_name"
  40.         android:theme="@style/AppTheme" >


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

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


  49.         <activity
  50.             android:name=".HelloWorld"
  51.             android:label="@string/app_name" >
  52.         </activity>
  53.                 <activity
  54.             android:name=".LayerDemo"
  55.             android:label="@string/app_name" >
  56.         </activity>
  57.     </application>

  58. </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
实现效果:
航拍编程计划:让你的航拍照片变地图(三分之二) 交通图,照片,计划 作者:@芋头 4039
MyLocationOverlayDemo .Java
  1. package huaxa.it.map;

  2. import android.os.Bundle;
  3. import android.os.Handler;
  4. import android.util.Log;

  5. import com.baidu.location.BDLocation;
  6. import com.baidu.location.BDLocationListener;
  7. import com.baidu.location.LocationClient;
  8. import com.baidu.location.LocationClientOption;
  9. import com.baidu.mapapi.map.LocationData;
  10. import com.baidu.mapapi.map.MyLocationOverlay;
  11. import com.baidu.platform.comapi.basestruct.GeoPoint;

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

  23.     public LocationClient       mLocationClient;
  24.     public BDLocationListener   myListener;

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

  30.         location();
  31.     }

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

  49.     }

  50.     // class MyLocationClient extends Handler implements Runnable
  51.     // {
  52.     //
  53.     // @Override
  54.     // public void run()
  55.     // {
  56.     // // ②参数设置
  57.     // LocationClientOption option = new LocationClientOption();
  58.     // option.setCoorType("bd09ll");// 可选,默认gcj02,设置返回的定位结果坐标系
  59.     // int span = 1000;
  60.     // option.setScanSpan(span);// 可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
  61.     // option.setOpenGps(true);// 可选,默认false,设置是否使用gps
  62.     // option.setLocationNotify(true);// 可选,默认false,设置是否当GPS有效时按照1S/1次频率输出GPS结果
  63.     // mLocationClient.setLocOption(option);
  64.     //
  65.     // post(this);
  66.     //
  67.     // }
  68.     //
  69.     // public void start()
  70.     // {
  71.     // post(this);
  72.     //
  73.     // }
  74.     //
  75.     // }

  76.     class MyListener implements BDLocationListener
  77.     {

  78.         @Override
  79.         public void onReceiveLocation(BDLocation location)
  80.         {
  81.             if (location == null)
  82.                 return;
  83.             MyLocationOverlay overlay = new MyLocationOverlay(mapView);
  84.             LocationData locData = new LocationData();
  85.             locData.latitude = location.getLatitude();
  86.             locData.longitude = location.getLongitude();
  87.             overlay.setData(locData);
  88.             mapView.getOverlays().clear();
  89.             mapView.getOverlays().add(overlay);
  90.             mapView.refresh();
  91.             // 地图移动
  92.             controller.animateTo(new GeoPoint(
  93.                     (int) (locData.latitude*1E6),(int)(locData.longitude*1E6)));
  94.         }

  95.         @Override
  96.         public void onReceivePoi(BDLocation location)
  97.         {

  98.         }

  99.     }

  100.     /**
  101.      * GPS很耗费资源,为了减少资源
  102.      */
  103.     @Override
  104.     protected void onResume()
  105.     {
  106.         // TODO Auto-generated method stub
  107.         super.onResume();
  108.         mLocationClient.start();
  109.     }

  110.     @Override
  111.     protected void onPause()
  112.     {
  113.         // TODO Auto-generated method stub
  114.         super.onPause();
  115.         mLocationClient.stop();
  116.     }

  117. }
复制代码

发表于 2017-3-24 12:55:59 | 显示全部楼层
看不懂
 楼主| 发表于 2017-3-24 13:28:32 | 显示全部楼层

百度手机地图使用航拍图片代替,实现公交等便民服务。
发表于 2017-3-24 15:22:13 | 显示全部楼层
航拍编程计划:让你的航拍照片变地图(三分之二) 交通图,照片,计划 作者:kenneth_chun 4735 航拍编程计划:让你的航拍照片变地图(三分之二) 交通图,照片,计划 作者:kenneth_chun 5546 航拍编程计划:让你的航拍照片变地图(三分之二) 交通图,照片,计划 作者:kenneth_chun 9218
发表于 2017-3-24 17:04:13 | 显示全部楼层
这个有点专业啊
发表于 2017-3-24 23:05:43 | 显示全部楼层
666很厉害
发表于 2017-3-25 23:22:11 | 显示全部楼层
厉害,收藏了
发表于 2017-3-26 23:19:08 | 显示全部楼层
整的太专业了吧!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|关于模吧|APP下载|广告报价|手机版|企业会员|商城入驻|联系我们|模吧 ( 黔ICP备2022002348号-1 )

© 2013-2020 Moz8.com 模吧,玩出精彩!