第3章(第24讲) 示例24-- OpenGL绘制功能

分类:C#、Android、百度地图应用; 日期:2016-02-04

一、简介

百度地图SDK为广大开发者开放了OpenGL绘制接口,帮助开发者在地图上实现更灵活的样式绘制,丰富地图使用效果体验。

二、运行截图

简介:介绍如何使用OpenGL在地图上实现自定义绘制。

详述:

(1)利用OpenGL绘制基本折线;

(2)利用OpenGL在地图上进行纹理绘制;

本示例运行截图如下:

三、设计步骤

1、添加demo24_opengl.xml文件

在layout文件夹下添加该文件,然后将代码改为下面的内容:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
  <com.baidu.mapapi.map.TextureMapView
      android:id="@+id/bmapView"
      android:layout_width="match_parent"
      android:layout_height="fill_parent" />
</RelativeLayout>

2、添加Demo24OpenGL.cs文件

在SrcSdkDemos文件夹下添加该文件,然后将代码改为下面的内容:

using Android.App;
using Android.OS;
using Com.Baidu.Mapapi.Map;
using Com.Baidu.Mapapi.Model;
using Android.Graphics;
using Android.Util;
using System.Collections.Generic;
using Javax.Microedition.Khronos.Opengles;
using Java.Nio;
using Android.Opengl;

namespace BdMapV371Demos.SrcSdkDemos
{
    /// <summary>
    /// 此demo用来展示如何在地图绘制的每帧中再额外绘制一些用户自己的内容
    /// </summary>
    [Activity(Label = "@string/demo_name_opengl")]
    public class Demo24OpenGL : Activity, BaiduMap.IOnMapDrawFrameCallback
    {
        // 地图相关
        private TextureMapView mMapView;
        private BaiduMap mBaiduMap;
        private Bitmap bitmap;
        private LatLng latlng1 = new LatLng(39.97923, 116.357428);
        private LatLng latlng2 = new LatLng(39.94923, 116.397428);
        private LatLng latlng3 = new LatLng(39.96923, 116.437428);
        private IList<LatLng> latLngPolygon;
        private float[] vertexs;
        private FloatBuffer vertexBuffer;
        private int textureId = -1;
        private readonly string LTAG = "Demo24OpenGL";

        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.demo24_opengl);
            mMapView = FindViewById<TextureMapView>(Resource.Id.bmapView);
            mBaiduMap = mMapView.Map;
            latLngPolygon = new List<LatLng>()
            {
                latlng1,latlng2,latlng3
            };
            mBaiduMap.SetOnMapDrawFrameCallback(this);
            bitmap = BitmapFactory.DecodeResource(Resources,
                Resource.Drawable.ground_overlay);
        }

        protected override void OnPause()
        {
            mMapView.OnPause();
            base.OnPause();
        }
        protected override void OnResume()
        {
            mMapView.OnResume();
            textureId = -1;
            base.OnResume();
        }

        protected override void OnDestroy()
        {
            mMapView.OnDestroy();
            base.OnDestroy();
        }

        public void OnMapDrawFrame(IGL10 gl, MapStatus drawingMapStatus)
        {
            if (mBaiduMap.Projection != null)
            {
                calPolylinePoint(drawingMapStatus);
                drawPolyline(gl, Color.Argb(255, 255, 0, 0), vertexBuffer, 10, 3,
                        drawingMapStatus);
                drawTexture(gl, bitmap, drawingMapStatus);
            }
        }
        public void calPolylinePoint(MapStatus mspStatus)
        {
            PointF[] polyPoints = new PointF[latLngPolygon.Count];
            vertexs = new float[3 * latLngPolygon.Count];
            int i = 0;
            foreach (LatLng xy in latLngPolygon)
            {
                polyPoints[i] = mBaiduMap.Projection.ToOpenGLLocation(xy, mspStatus);
                vertexs[i * 3] = polyPoints[i].X;
                vertexs[i * 3 + 1] = polyPoints[i].Y;
                vertexs[i * 3 + 2] = 0.0f;
                i++;
            }
            for (int j = 0; j < vertexs.Length; j++)
            {
                Log.Debug(LTAG, "vertexs[" + j + "]: " + vertexs[j]);
            }
            vertexBuffer = makeFloatBuffer(vertexs);
        }

        private FloatBuffer makeFloatBuffer(float[] fs)
        {
            ByteBuffer bb = ByteBuffer.AllocateDirect(fs.Length * 4);
            bb.Order(ByteOrder.NativeOrder());
            FloatBuffer fb = bb.AsFloatBuffer();
            fb.Put(fs);
            fb.Position(0);
            return fb;
        }

        private void drawPolyline(IGL10 gl, int color, FloatBuffer lineVertexBuffer,
                float lineWidth, int pointSize, MapStatus drawingMapStatus)
        {

            gl.GlEnable(GL10.GlBlend);
            gl.GlEnableClientState(GL10.GlVertexArray);

            gl.GlBlendFunc(GL10.GlSrcAlpha, GL10.GlOneMinusSrcAlpha);

            float colorA = Color.GetAlphaComponent(color) / 255f;
            float colorR = Color.GetRedComponent(color) / 255f;
            float colorG = Color.GetGreenComponent(color) / 255f;
            float colorB = Color.GetBlueComponent(color) / 255f;

            gl.GlVertexPointer(3, GL10.GlFloat, 0, lineVertexBuffer);
            gl.GlColor4f(colorR, colorG, colorB, colorA);
            gl.GlLineWidth(lineWidth);
            gl.GlDrawArrays(GL10.GlLineStrip, 0, pointSize);

            gl.GlDisable(GL10.GlBlend);
            gl.GlDisableClientState(GL10.GlVertexArray);
        }

        /// <summary>
        /// 使用opengl坐标绘制
        /// </summary>
        /// <param name="gl"></param>
        /// <param name="bitmap"></param>
        /// <param name="drawingMapStatus"></param>
        public void drawTexture(IGL10 gl, Bitmap bitmap, MapStatus drawingMapStatus)
        {
            PointF p1 = mBaiduMap.Projection.ToOpenGLLocation(latlng2,
                    drawingMapStatus);
            PointF p2 = mBaiduMap.Projection.ToOpenGLLocation(latlng3,
                    drawingMapStatus);
            ByteBuffer byteBuffer = ByteBuffer.AllocateDirect(4 * 3 * 4);
            byteBuffer.Order(ByteOrder.NativeOrder());
            FloatBuffer vertices = byteBuffer.AsFloatBuffer();
            vertices.Put(new float[] { p1.X, p1.Y, 0.0f, p2.X, p1.Y, 0.0f, p1.X,
                p2.Y, 0.0f, p2.X, p2.Y, 0.0f });

            ByteBuffer indicesBuffer = ByteBuffer.AllocateDirect(6 * 2);
            indicesBuffer.Order(ByteOrder.NativeOrder());
            ShortBuffer indices = indicesBuffer.AsShortBuffer();
            indices.Put(new short[] { 0, 1, 2, 1, 2, 3 });

            ByteBuffer textureBuffer = ByteBuffer.AllocateDirect(4 * 2 * 4);
            textureBuffer.Order(ByteOrder.NativeOrder());
            FloatBuffer texture = textureBuffer.AsFloatBuffer();
            texture.Put(new float[] { 0, 1f, 1f, 1f, 0f, 0f, 1f, 0f });

            indices.Position(0);
            vertices.Position(0);
            texture.Position(0);

            // 生成纹理
            if (textureId == -1)
            {
                int[] textureIds = new int[1];
                gl.GlGenTextures(1, textureIds, 0);
                textureId = textureIds[0];
                Log.Debug(LTAG, "textureId: " + textureId);
                gl.GlBindTexture(GL10.GlTexture2d, textureId);
                GLUtils.TexImage2D(GL10.GlTexture2d, 0, bitmap, 0);
                gl.GlTexParameterf(GL10.GlTexture2d, GL10.GlTextureMinFilter, GL10.GlNearest);
                gl.GlTexParameterf(GL10.GlTexture2d, GL10.GlTextureMagFilter, GL10.GlNearest);
                gl.GlBindTexture(GL10.GlTexture2d, 0);
            }

            gl.GlEnable(GL10.GlTexture2d);
            gl.GlEnableClientState(GL10.GlVertexArray);
            gl.GlEnableClientState(GL10.GlTextureCoordArray);
            gl.GlEnable(GL10.GlBlend);
            gl.GlBlendFunc(GL10.GlSrcAlpha, GL10.GlOneMinusSrcAlpha);
            gl.GlColor4f(1.0f, 1.0f, 1.0f, 1.0f);

            // 绑定纹理ID
            gl.GlBindTexture(GL10.GlTexture2d, textureId);
            gl.GlVertexPointer(3, GL10.GlFloat, 0, vertices);
            gl.GlTexCoordPointer(2, GL10.GlFloat, 0, texture);
            gl.GlDrawElements(GL10.GlTriangleStrip, 6, GL10.GlUnsignedShort, indices);
            gl.GlDisable(GL10.GlTexture2d);
            gl.GlDisableClientState(GL10.GlVertexArray);
            gl.GlDisableClientState(GL10.GlTextureCoordArray);
            gl.GlDisable(GL10.GlBlend);
        }
    }
}

3、修改MainActivity.cs文件

在MainActivity.cs文件的demos字段定义中,去掉【示例24】下面的注释。

运行观察效果。

时间: 2024-10-13 02:32:39

第3章(第24讲) 示例24-- OpenGL绘制功能的相关文章

零元学Expression Blend 4 - Chapter 24 以实作了解Cover Flow功能

原文:零元学Expression Blend 4 - Chapter 24 以实作了解Cover Flow功能 今天要介绍一个Silverlight Toolkit内好用且在图片展示操作上很常见的元件-「Cover Flow」 今天要介绍一个??Codeplex??内好用且在图片展示操作上很常见的元件-「Cover Flow」 ? 请点击後方图片做切换 很抱歉,阁下使用的浏览器并不支援 IFrame,不能正常浏览我的网页 ? 01 首先,需要先到Codeplex? 下载Cover Flow 点击

一个新手的Python自学之旅 #MacBook #《“笨办法”学Python》#第三章:言归正传讲Python:Mac系统的终端Terminal命令行快速入门

第三章:言归正传讲Python:Mac系统的终端Terminal命令行快速入门 以后我都会将<“笨办法”学Python>简称为“这本书” 本人用了近5年的MacBook,但在此之前,从未使用过电脑自带的“终端Terminal”(图标:).在非程序员的世界里,建立和删除文件夹或文件,都是:鼠标右键点新建/删除,这是UI带来的便利.但是,却不知道如何利用命令行实现这些操作. 首先,要掌握几个我们平时常用,但在代码界有另外名称的名词:目录.路径.打印. --目录:我们认为它是这样的:标题:第一章:第

一个新手的Python自学之旅 #MacBook #《“笨办法”学Python》#第四章:言归正传讲Python:Mac系统的终端Terminal命令行快速入门之较复杂的命令

第四章:言归正传讲Python:Mac系统的终端Terminal命令行快速入门之"较复杂的命令" 在写第三章的时候,发现自己已经忘记了好多命令.其实我并没有按照Zed A.Shaw的提示,将这些命令做成小卡片,然后每天去记忆.可能源于我的目的并非是为了掌握并精研Python,我写博客并不是单纯为了分享自己的学习经验.而是希望自己能够通过学习python和写博客的形式,让自己以后养成这样的学习和记录习惯,有助于以后技能的掌握和积累.Python起到抛砖引玉的作用. 闲话少说,下面开始介绍

java-第四章-升级我行我素购物管理系统,实现换购功能

import java.util.Scanner; public class A05 { /**  * @param args  */ public static void main(String[] args) { // TODO Auto-generated method stub Scanner input = new Scanner(System.in); System.out.println("请输入消费金额:"); int money = input.nextInt();

调试器第二讲,单步步入/步过功能实现,以及基本的断点功能实现

调试器第二讲,单步步入/步过功能实现,以及基本的断点功能实现 昨天,我们实现了调试器的基本框架,那么今天我们实现单步功能,还有断点功能,以及使用反汇编引擎 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) 一丶反汇编引擎的编译,生成LIB 首先,我们有一个反汇编引擎的代码,现在我们编译连接一下(注意,可以使用GitHub下载,或者百度Google下载) 关于反汇编引擎的介绍: 请参考转载博客 http://blog.c

病毒分析第二讲,分析病毒的主要功能

---恢复内容开始--- 病毒分析第二讲,分析病毒的主要功能 经过昨天病毒分析第一讲,得出一个被注入的DLL 开始分析DLL主要功能 PS: IDA中,DLL会有各种初始化的代码,和释放资源,所以不再看,只看重要的API 一丶行为分析(创建命名互斥体,防止病毒多开) 进入函数去看,从DLLmain入口点分析. 得出,第一步,病毒为了防止重复注入IE,创建命名互斥体. 名字是:  "KyUffThOkYwRRtgPP" 二丶拼接字符串,创建文件,写入系统当前时间 进入DLLmain第二个

第3章(第23讲) 示例23--瓦片图功能

分类:C#.Android.百度地图应用: 日期:2016-02-04 一.简介 地图SDK自v3.6.0起,新增瓦片图层(tileOverlay), 该图层支持开发者添加自有瓦片数据,包括本地加载和在线下载两种方式.该图层可随地图的平移.缩放.旋转等操作做相应的变换,它仅位于底图之上(即瓦片图层将会遮挡底图,不遮挡其他图层),瓦片图层的添加顺序不会影响其他图层(例如:POI搜索图层.我的位置图层等)的叠加关系,适用于开发者拥有某一区域的地图,并希望使用此区域地图覆盖相应位置的百度地图. 1.瓦

DT梦工厂 第24讲 scala中sam转换实战详解

王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 腾讯微云:http://url.cn/TnGbdC 360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2土豆:http://www.tudou.com/programs/view/dHz5JKJxurM/优酷:http://v.youku.com/v_show/id_

第24讲 python文件的写操作基础

write---> 写字符串 writelines--->写字符串序列(序列:一堆字符串,逗号隔开.例如:字典.列表.元组) file_obj.write(content_obj) content_obj + '\n'  #me:如果不加 \n 则写入的内容不换行 eg1: file_obj=open('test.txt','w')  文件存在则打开,不存在则创建 file_obj=open('test.txt','w+') "+" 代表可读,可写 eg2: file_ob