模吧

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

1967查看 | 2回复

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

[复制链接]
发表于 2017-3-31 07:43:16 | 显示全部楼层 |阅读模式

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

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

x
覆盖物的实现

覆盖物
如标注、矢量图形元素(包括:折线和多边形和圆)、定位图标等。覆盖物拥有自己的地理坐标,当您拖动或缩放地图时,它们会相应的处理。
覆盖物包括:
  • 覆盖物的抽象基类:Overlay(核心类)
  • 文字绘制覆盖物:TextOverlay
  • 分条目覆盖物:ItemizedOverlay
  • 路线规划覆盖物:RouteOverlay
  • 换乘路线覆盖物:TransitOverlay
  • 我的位置覆盖物:MyLocationOverlay
    1、实现目的:在底图上画一个圆形的几何图形(覆盖物)
    实现过程:1、建一个基类实现基本的底图效果,再建一个类实现覆盖物,当前类继承基类;2、然后通过
    //①获取mapView存放覆盖物的集合
    List overlays = mapView.getOverlays();
    // ②创建自己的overlays信息并添加集合中
    GraphicsOverlay overlay = new GraphicsOverlay(mapView);
    // 设置几何图形
    setData(overlay);
    overlays.add(overlay);
    // ③刷新mapView的显示内容
    mapView.refresh();
    3、设置几何图形:通过新建一个图形Graphic(geometry, symbol),装几何元素+样式参数,然后将该图形添加到图形的overlay里面。overlay.setData(graphic);再设置几何元素和样式参数。
    4、再设置Manifest.xml的内容即可。
    实现效果:
    航拍编程计划:让你的航拍照片变地图(三分之三) 照片,计划 作者:@芋头 797
    GraphicsOverlayDemo.Java

  1. package huaxa.it.map;

  2. import java.util.List;

  3. import com.baidu.mapapi.map.Geometry;
  4. import com.baidu.mapapi.map.Graphic;
  5. import com.baidu.mapapi.map.GraphicsOverlay;
  6. import com.baidu.mapapi.map.Overlay;
  7. import com.baidu.mapapi.map.Symbol;

  8. import android.R.color;
  9. import android.R.drawable;
  10. import android.os.Bundle;

  11. /**
  12. * @项目名: BaiduMap
  13. * @包名: huaxa.it.map
  14. * @类名: GraphicsOverlayDemo
  15. * @创建者: 黄夏莲
  16. * @创建时间: 2016年12月1日 ,下午6:13:46
  17. *
  18. * @描述: TODO
  19. */
  20. public class GraphicsOverlayDemo extends BaseActivity
  21. {
  22.     @Override
  23.     protected void onCreate(Bundle savedInstanceState)
  24.     {
  25.         // TODO Auto-generated method stub
  26.         super.onCreate(savedInstanceState);
  27.         draw();
  28.     }

  29.     /**
  30.      * 绘制几何图形
  31.      */
  32.     private void draw()
  33.     {
  34.         // 覆盖物操作
  35.         // ①获取存放覆盖物的集合(MapView)
  36.         List<Overlay> overlays = mapView.getOverlays();
  37.         // ②创建自己的overlays信息添加集合中
  38.         GraphicsOverlay overlay = new GraphicsOverlay(mapView);
  39.         // 关于几何图形设置
  40.         setData(overlay);
  41.         overlays.add(overlay);
  42.         // ③刷新mapView的显示内容
  43.         mapView.refresh();

  44.     }

  45.     /**
  46.      * 几何图形设置
  47.      *
  48.      * @param overlay
  49.      */
  50.     private void setData(GraphicsOverlay overlay)
  51.     {

  52.         // 绘制圆
  53.         /**
  54.          * setCircle(GeoPoint geoPoint, int radius) 设置图形为圆 参数: geoPoint地理坐标
  55.          * radius圆的半径,单位:米
  56.          */
  57.         // 几何元素的定义
  58.         // 圆心+半径
  59.         Geometry geometry = new Geometry();
  60.         geometry.setCircle(geoPoint, 1000);
  61.         // 样式
  62.         // 颜色+是否填充+如果不填充,绘制圆的线条的粗细
  63.         Symbol symbol = new Symbol();
  64.         /**
  65.          * setSurface
  66.          *
  67.          * public void setSurface(Symbol.Color color, int status, int linewidth)
  68.          * 设置面样式 参数: color - 颜色 status - 填充状态,0表示不填充,1表示填充 linewidth -
  69.          * 线宽,当填充状态为填充时线宽无意义
  70.          */
  71.         Symbol.Color color = symbol.new Color();
  72.         //指定三色
  73.         color.red = 255;
  74.         color.green = 0;
  75.         color.blue = 0;
  76.         color.alpha = 100;
  77.         symbol.setSurface(color, 1, 0);
  78.         Graphic graphic = new Graphic(geometry, symbol);
  79.         overlay.setData(graphic);

  80.     }

  81. }
复制代码


再设置Manifest.xml的内容即可。
2、实现目的:在底图上画一个文本图形(覆盖物)
使用到TextOverlay类,其中用到TextItem对文本进行设置。
实现效果:
航拍编程计划:让你的航拍照片变地图(三分之三) 照片,计划 作者:@芋头 1131
TextOverlayDemo.java
  1. package huaxa.it.map;

  2. import java.util.List;

  3. import com.baidu.mapapi.map.Overlay;
  4. import com.baidu.mapapi.map.Symbol;
  5. import com.baidu.mapapi.map.TextItem;
  6. import com.baidu.mapapi.map.TextOverlay;



  7. import android.graphics.Typeface;
  8. import android.os.Bundle;

  9. /**
  10. * @项目名: BaiduMap
  11. * @包名: huaxa.it.map
  12. * @类名: TextOverlayDemo
  13. * @创建者: 黄夏莲
  14. * @创建时间: 2016年12月1日 ,下午6:13:46
  15. *
  16. * @描述: TODO
  17. */
  18. public class TextOverlayDemo extends BaseActivity
  19. {
  20.     @Override
  21.     protected void onCreate(Bundle savedInstanceState)
  22.     {
  23.         // TODO Auto-generated method stub
  24.         super.onCreate(savedInstanceState);
  25.         draw();
  26.     }

  27.     /**
  28.      * 绘制文本图形
  29.      */
  30.     private void draw()
  31.     {
  32.         // 覆盖物操作
  33.         // ①获取存放覆盖物的集合(MapView)
  34.         List<Overlay> overlays = mapView.getOverlays();
  35.         // ②创建自己的overlays信息添加集合中
  36.         TextOverlay overlay = new TextOverlay(mapView);
  37.         // 关于文本图形设置
  38.         setData(overlay);
  39.         overlays.add(overlay);
  40.         // ③刷新mapView的显示内容
  41.         mapView.refresh();

  42.     }

  43.     /**
  44.      * 文本条目设置
  45.      *
  46.      * @param overlay
  47.      */
  48.     private void setData(TextOverlay overlay)
  49.     {

  50.         TextItem Item = new TextItem();
  51.         //设置文本格式
  52.         // int align
  53.         // 文字对齐方式 ,为 ALIGN_TOP,ALIGN_CENTER, ALIGN_BOTTOM中的一个值
  54.         // static int ALIGN_BOTTOM
  55.         // 文字对齐参数,下边中点对齐
  56.         // static int ALIGN_CENTER
  57.         // 文字对齐参数,中心对齐
  58.         // static int ALIGN_TOP
  59.         // 文字对齐参数,上边中点对齐
  60.         // Symbol.Color bgColor
  61.         // 文字背景色, 默认为透明
  62.         // Symbol.Color fontColor
  63.         // 文字颜色
  64.         // int fontSize
  65.         // 字号大小
  66.         // GeoPoint pt
  67.         // 文字显示的位置,用经纬度坐标表示
  68.         // String text
  69.         // 要显示的文字内容
  70.         // Typeface typeface
  71.         // 文字字体, android 字体表示,为空则用系统默认字体.
  72.         Item.align = TextItem.ALIGN_TOP;
  73.         Item.fontColor = getColor();
  74.         Item.fontSize = 20;
  75.         Item.pt = geoPoint;
  76.         Item.text = "广东工业大学";
  77.         Item.typeface = Typeface.SERIF;
  78.         overlay.addText(Item);

  79.     }

  80.     private Symbol.Color getColor(){
  81.         Symbol symbol = new Symbol();
  82.         Symbol.Color color= symbol.new Color();
  83.         color.alpha=100;
  84.         color.blue=255;
  85.         color.red=0;
  86.         color.green=0;
  87.         return color;

  88.     }

  89. }
复制代码


3、实现目的:在底图上画一个多条目(覆盖物,如图标)
实现过程:使用到ItemizedOverlay类
ItemizedOverlay(
getResources().getDrawable(R.drawable.eat_icon), mapView);//第一个参数就是图片,第二个参数是mapView。
接着对OverlayItem进行设置,然后添加到itemizedOverlay里面就可以了。另外,可以设置多个条目,直接设置具体坐标,并添加到itemizedOverlay里面。
实现效果
航拍编程计划:让你的航拍照片变地图(三分之三) 照片,计划 作者:@芋头 4297

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

  2. import java.util.List;

  3. import android.os.Bundle;

  4. import com.baidu.mapapi.map.ItemizedOverlay;
  5. import com.baidu.mapapi.map.Overlay;
  6. import com.baidu.mapapi.map.OverlayItem;
  7. import com.baidu.platform.comapi.basestruct.GeoPoint;

  8. /**
  9. * @项目名: BaiduMap
  10. * @包名: huaxa.it.map
  11. * @类名: ItemizedOverlayDemo
  12. * @创建者: 黄夏莲
  13. * @创建时间: 2016年12月2日 ,上午9:14:17
  14. *
  15. * @描述: 多条目覆盖物
  16. */
  17. public class ItemizedOverlayDemo extends BaseActivity
  18. {
  19.     @Override
  20.     protected void onCreate(Bundle savedInstanceState)
  21.     {
  22.         // TODO Auto-generated method stub
  23.         super.onCreate(savedInstanceState);
  24.         controller.setZoom(16);
  25.         draw();
  26.     }

  27.     /**
  28.      * 绘制文本图形
  29.      */
  30.     private void draw()
  31.     {
  32.         // 覆盖物操作
  33.         // ①获取存放覆盖物的集合(MapView)
  34.         List<Overlay> overlays = mapView.getOverlays();
  35.         // ②创建自己的overlays信息添加集合中
  36.         ItemizedOverlay<OverlayItem> overlay = new ItemizedOverlay<OverlayItem>(
  37.                 getResources().getDrawable(R.drawable.eat_icon), mapView);
  38.         setData(overlay);
  39.         overlays.add(overlay);
  40.         // ③刷新mapView
  41.         mapView.refresh();

  42.     }

  43.     // 设置多条目数据
  44.     private void setData(ItemizedOverlay<OverlayItem> overlay)
  45.     {
  46.         // OverlayItem(GeoPoint point, String title, String snippet)
  47.         // protected GeoPoint mPoint
  48.         // 该item的位置
  49.         // protected String mTitle
  50.         // 该item的标题文本
  51.         // protected String mSnippet
  52.         // 该item的文字片段
  53.         String mSnippet = "该学校是由……";
  54.         OverlayItem Item = new OverlayItem(geoPoint, "广东工业大学", mSnippet);
  55.         overlay.addItem(Item);

  56.         Item = new OverlayItem(new GeoPoint(latitude, longitude+1000), "向东", "增加经度");
  57.         overlay.addItem(Item);

  58.         Item = new OverlayItem(new GeoPoint(latitude, longitude-1000), "向西", "减少经度");
  59.         overlay.addItem(Item);

  60.         Item = new OverlayItem(new GeoPoint(latitude+1000, longitude-1000), "向西北", "增加纬度,减少经度");
  61.         overlay.addItem(Item);
  62.     }
  63. }
复制代码

4、实现目的:对上面的多条目进行泡泡显示
实现过程:1、实现布局pop.xml;2、实现popView的初始化操作,设置popView不可见,并把popView添加到mapView里面。3、通过onTap()方法实现点击事件,需要更新mapView(当点击一个Item时,会弹出一个pop窗口),通过mapView.updateViewLayout(popView, params);更新View,而params里面需要设置pop窗口的位置,所以需要先重新定义params;再设置pop窗口可见,进而设置pop窗口的显示内容。注意:如果没有将popView中的TextView在此处实例化,会报空指针异常。
实现效果:
航拍编程计划:让你的航拍照片变地图(三分之三) 照片,计划 作者:@芋头 5734
pop.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.         android:id="@+id/user_info"
  4.         android:layout_width="wrap_content"
  5.         android:layout_height="wrap_content"
  6.         android:layout_marginBottom="20dip"
  7.         android:layout_weight="1"
  8.         android:background="@drawable/popupmap"
  9.         android:gravity="center_vertical"
  10.         android:orientation="horizontal" >

  11.         <ImageView
  12.             android:id="@+id/round"
  13.             android:layout_width="wrap_content"
  14.             android:layout_height="wrap_content"
  15.             android:layout_marginBottom="2dip"
  16.             android:src="@drawable/round" />

  17.         <TextView
  18.             android:id="@+id/title"
  19.             android:layout_width="wrap_content"
  20.             android:layout_height="wrap_content"
  21.             android:ellipsize="end"
  22.             android:text="标题"
  23.             android:textSize="20sp" />

  24.         <ImageView
  25.             android:id="@+id/roads"
  26.             android:layout_width="wrap_content"
  27.             android:layout_height="wrap_content"
  28.             android:src="@drawable/roads" />

  29. </LinearLayout>
复制代码

航拍编程计划:让你的航拍照片变地图(三分之三) 照片,计划 作者:@芋头 2184
修改java文件为:

  1. package huaxa.it.map;

  2. import java.util.List;

  3. import android.os.Bundle;
  4. import android.view.View;
  5. import android.view.ViewGroup.LayoutParams;
  6. import android.widget.TextView;

  7. import com.baidu.mapapi.map.ItemizedOverlay;
  8. import com.baidu.mapapi.map.MapView;
  9. import com.baidu.mapapi.map.Overlay;
  10. import com.baidu.mapapi.map.OverlayItem;
  11. import com.baidu.platform.comapi.basestruct.GeoPoint;

  12. /**
  13. * @项目名: BaiduMap
  14. * @包名: huaxa.it.map
  15. * @类名: ItemizedOverlayDemo
  16. * @创建者: 黄夏莲
  17. * @创建时间: 2016年12月2日 ,上午9:14:17
  18. *
  19. * @描述: 多条目覆盖物
  20. */
  21. public class ItemizedOverlayDemo extends BaseActivity
  22. {
  23.     private TextView    title;
  24.     private View        popView;
  25.     private OverlayItem Item;

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

  32.         initPop();
  33.         draw();
  34.     }

  35.     // 添加泡泡
  36.     // 点击某个具体的item的时候在其上方显示

  37.     // 加载pop
  38.     // 添加到mapview中,不用设置坐标,pop隐藏
  39.     // 当点击时,显示泡泡,位置更新

  40.     private void initPop()
  41.     {
  42.         // 初始化popView并且设置相应参数
  43.         popView = View.inflate(getApplicationContext(), R.layout.pop, null);   
  44.         MapView.LayoutParams params = new MapView.LayoutParams(
  45.                 MapView.LayoutParams.WRAP_CONTENT,
  46.                 MapView.LayoutParams.WRAP_CONTENT, null,
  47.                 MapView.LayoutParams.BOTTOM_CENTER);
  48.         mapView.addView(popView, params);
  49.         popView.setVisibility(View.INVISIBLE);// 不可见

  50.     }

  51.     /**
  52.      * 绘制文本图形
  53.      */
  54.     private void draw()
  55.     {
  56.         // 覆盖物操作
  57.         // ①获取存放覆盖物的集合(MapView)
  58.         List<Overlay> overlays = mapView.getOverlays();
  59.         // ②创建自己的overlays信息添加集合中
  60.         ItemizedOverlay<OverlayItem> overlay = new ItemizedOverlay<OverlayItem>(
  61.                 getResources().getDrawable(R.drawable.eat_icon), mapView)
  62.         {
  63.             @Override
  64.             protected boolean onTap(int index)
  65.             {
  66.                 OverlayItem item = getItem(index);

  67.                 // 更新pop
  68.                 MapView.LayoutParams params = new MapView.LayoutParams(
  69.                         MapView.LayoutParams.WRAP_CONTENT,
  70.                         MapView.LayoutParams.WRAP_CONTENT, item.getPoint(),
  71.                         MapView.LayoutParams.BOTTOM_CENTER);

  72.                 mapView.updateViewLayout(popView, params);

  73.                 popView.setVisibility(View.VISIBLE);
  74.                 //务必在这里实例化TextView空间,否则会报空指针异常。
  75.                 title = (TextView) findViewById(R.id.title);
  76.                     title.setText(item.getTitle());
  77.                 return super.onTap(index);
  78.             }
  79.         };

  80.         setData(overlay);
  81.         overlays.add(overlay);
  82.         // ③刷新mapView
  83.         mapView.refresh();

  84.     }

  85.     // 设置多条目数据
  86.     private void setData(ItemizedOverlay<OverlayItem> overlay)
  87.     {
  88.         // OverlayItem(GeoPoint point, String title, String snippet)
  89.         // protected GeoPoint mPoint
  90.         // 该item的位置
  91.         // protected String mTitle
  92.         // 该item的标题文本
  93.         // protected String mSnippet
  94.         // 该item的文字片段
  95.         String mSnippet = "该学校是由……";
  96.         Item = new OverlayItem(geoPoint, "广东工业大学", mSnippet);
  97.         overlay.addItem(Item);

  98.         Item = new OverlayItem(new GeoPoint(latitude, longitude + 1000), "向东",
  99.                 "增加经度");
  100.         overlay.addItem(Item);

  101.         Item = new OverlayItem(new GeoPoint(latitude, longitude - 1000), "向西",
  102.                 "减少经度");
  103.         overlay.addItem(Item);

  104.         Item = new OverlayItem(new GeoPoint(latitude + 1000, longitude - 1000),
  105.                 "向西北", "增加纬度,减少经度");
  106.         overlay.addItem(Item);
  107.     }
  108. }
复制代码


发表于 2017-4-1 00:40:39 | 显示全部楼层
学习了,以后可能用的上吧。
发表于 2017-4-2 00:07:01 | 显示全部楼层
好文章,技术贴。就是不太懂。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|关于模吧|APP下载|广告报价|小黑屋|手机版|企业会员|商城入驻|联系我们|模吧 ( 冀公网安备13080502000084号 )

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