EVSDK二次开发文档
2023-01-03 10:07:06
120次阅读
0个评论
最后修改时间:2023-01-03 10:26:43

EVSDK二次开发包下载地址: http://bbs.ev-image.com:9094/thread?topicId=5

新建项目

- 1、app下的buid.gradle配置
EV_SDK目前针对适配了android6.0-android8.0 以及高版本
```java
android {
    compileSdkVersion 28
    buildToolsVersion '28.0.3'


    defaultConfig {
        applicationId "com.earthview.world.demomap"
        minSdkVersion 24
        targetSdkVersion 28
        versionCode 100001
        versionName "1.00.001"
        ndk {
            abiFilters 'armeabi-v7a' //'armeabi' 自行适配其他cpu架构
        }
        sourceSets.main {
            jni.srcDirs = []
            jniLibs.srcDir "src/main/libs" //指定jar包的存放路径
        }
    }
...
}
```
高版本的Android Studio可能要求targetSdkVersion 高于30 ;targetSdkVersion 28可能会报错。忽略即可。不影响使用

- 2、gradle版本指定
 项目的build.gradule配置 gradle版本号为3.5.1
 ```java
buildscript {
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.1'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}
allprojects {
    repositories {
        google()
        jcenter()
    }
}
 ```
 修改gradle-wrapper.properties  distributionUrl设置为gradle-5.4.1-all.zip
 ```
 distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
 ```
 - 3、添加库文件
 -- 3.1、添加jar文件到app/libs文件夹下,jar库文件在EVMapSDK_package目录libs下;
  同时修改build.gradle  添加EVSDK.jar依赖
  ```java
dependencies {

    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'com.google.android.material:material:1.3.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'

    implementation files('libs\\EVSDK.jar')
}
 ``` 
 - 3.2、添加so库到app/src/main/libs/armeabi-v7a,so库文件在EVMapSDK_package目录libs_so下;
  修改AndroidManifest.xml文件,添加可能用到的权限和gles的版本号
  ```xml
    <uses-feature android:glEsVersion="0x00020000" />
    <uses-feature android:name="android.hardware.location.gps" />

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  ```

- 4、创建Assert资源文件夹
导入必要的资源文件,assert资源目录结构如下
--assert
  |_dex
  |_evproj
  |_Font3D
  |_fonts:
  |_images:
  |_license
  |_Render2DEnginePlugin
  |_Resource
  |_shader
  |_versioninfo.xml
  简单介绍一下,这几个文件的作用,
  dex:将app/libs下的jar包使用ndk的dx.bat脚本打包生成的dex文件
  evproj:默认地图数据
  Font3D:字体相关
  fonts:字体相关
  images:显示在地图上的图片
  license: 证书验证相关的配置文件
  Render2DEnginePlugin:下的so可供AGG插件使用,不用管
  Resource:下的NSL文件,海图继续相关
  shader:着色器脚本
  versioninfo.xml:标记assert资源的版本号

- 5、完成上述配置过程后可以进行项目开发了
- 5.1、Activity 中添加地图功能
1、activity_main.xml中添加GlobeGLSurface
```xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.earthview.world.evmapsdk.renderview.GlobeGLSurface
        android:id="@+id/globeGLSurface"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/white"
        android:visibility="gone" />
</RelativeLayout>
```
2、Application配置,自定义application。继承自EVMapApplication
```java
public class ControlApplication extends EVMapApplication {

    private final String TAG = this.getClass().getSimpleName();
    @Override
    protected void attachBaseContext(Context base) {
        Log.i(TAG, "Attaching base context");
        super.attachBaseContext(base);
        MultiDex.install(this);
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.i(TAG, "Application onCreate");
    }
}
```
同时记得修改AndroidManifest.xml,在applicaiton标签中添加 android:name=".ControlApplication" 
3、MapActivity配置
&ensp;&ensp;3.1 MapActivity要继承自EVBaseActivity
```java
public class MainActivity extends EVBaseActivity {}
```
&nbsp;&nbsp; 3.2 MainActivity类中加载so库
```java
static {
        System.loadLibrary("EV_Core_Java");
        System.loadLibrary("EV_ProjectManager_Java");// ProjectManager
        System.loadLibrary("EV_SpatialInterface_Java");
        System.loadLibrary("EV_Download_Java");// WebManager
        System.loadLibrary("EV_Plugin_GLMap");// initAsset
    }
```
&nbsp;&nbsp; 3.3 初始化地图,加载地图函数,在onCreate方法中调用即可
```java
    public void initMap() {
        MapContext.getInstance().init(this, this.getAssets());
    }

    @NeedsPermission({Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE})
    public void loadMap() {
        setMapLoadCallBack(new MapLoadCallBack() {
            @Override
            public void beforeMapLoad() {
                // 加载地图前的回调函数
            }

            @Override
            public void loadSuccess(EventBusEntity.MapLoadedEntity entity) {
                // 地图加载成功回调函数
            }

            @Override
            public void loadError(EventBusEntity.MapLoadedEntity entity) {
                // 地图加载失败回调函数
            }
        });
        loadMapProject(mGlobeSurface); //loadMapProject 继承自父类,开始加载地图
    }
```
&nbsp;&nbsp; 下面是MainActivity的完整代码
```java
@RuntimePermissions
public class MainActivity extends EVBaseActivity {

    static {
        System.loadLibrary("EV_Core_Java");
        System.loadLibrary("EV_ProjectManager_Java");// ProjectManager
        System.loadLibrary("EV_SpatialInterface_Java");
        System.loadLibrary("EV_Download_Java");// WebManager
        System.loadLibrary("EV_Plugin_GLMap");// initAsset
    }


    private GlobeGLSurface mGlobeSurface = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initMap(); // copy即可

        initView(); // 开发实现
        /*initData(); // 开发实现*/

        //调用的时候要确保申请了权限,防止因为没有权限报错。如果自己确认已经授予了权限,直接调用loadMap()加载地图即可,不需要使用permissionsDispatcher
        MainActivityPermissionsDispatcher.loadMapWithPermissionCheck(this);
        //loadMap(); //copy即可
    }

    private void initView() {
        mGlobeSurface = findViewById(R.id.globeGLSurface);
    }

    public void initMap() {
        MapContext.getInstance().init(this, this.getAssets());
        WebManager.getSingleton().installServicePlugin("EV_EarthView_Download", "http://192.168.5.3:8088");
    }

    @NeedsPermission({Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE})
    public void loadMap() {
        setMapLoadCallBack(new MapLoadCallBack() {
            @Override
            public void beforeMapLoad() {
                // 加载地图前的回调函数
            }

            @Override
            public void loadSuccess(EventBusEntity.MapLoadedEntity entity) {
                // 地图加载成功回调函数
            }

            @Override
            public void mapSurfaceShow() {
                // 地图显示后回调,如 获取图层可见性 控制图层显影
            }

            @Override
            public void loadError(EventBusEntity.MapLoadedEntity entity) {
                // 地图加载失败回调函数
            }
        });
        
        loadMapProject(mGlobeSurface); //loadMapProject 继承自父类,开始加载默认地图地图
        // loadMapProject("map20220324.evproj", mGlobeSurface); //loadMapProject 继承自父类,开始加载指定地图地图
    }

    @OnNeverAskAgain({Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE})
    void showNeedPermissionWhy() {
        Toast.makeText(this, "拒绝授予权限,并不再询问", Toast.LENGTH_SHORT).show();
    }

    @OnPermissionDenied({Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE})
    public void permissionsDenied() {
        Toast.makeText(this, "授予权限被拒绝", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        //生成辅助类_动态注册权限
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        MainActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
    }

}
```
其中“map20220324.evproj”是手动导入的离线地图数据,默认显示的地图数据内置apk中的小数据。更详细的地图数据很大,需要导入sdcard中加载。

【注】 当assets资源更新后,需要将assets/versioninfo.xml中的版本号+1,避免出现不必要的问题。


4、图元绘制 EVSDk1.00.003添加该功能 见EVMapSDK_package_20220219.zip

4.1 声明绘制点,线,面图元的封装对象
```java
    // 绘制点的对象
    SimplePointSet simplePointSet = null;
    // 绘制线的对象
    DrawLineEntity drawLineEntity = null;
    List<DrawLineEntity> drawLineEntities = new ArrayList<>();
```

4.2 在地图加载完成后
初始化刚刚声明的对象
```java
setMapLoadCallBack(new MapLoadCallBack() {
            @Override
            public void loadSuccess(EVSDKEntity.MapLoadedEntity entity) {
                //在地图加载完成后初始化绘制点 线, 面的接口类
                simplePointSet = new SimplePointSet();
                drawLineEntity = new DrawLineEntity();
            }
        });
```

4.3 设置测量分析的回调监听
```java
// 添加测量事件的监听
        setMeasureResultListener(new MeasureResultListener() {
            @Override
            public void getMeasureResult(MeasureResult measureResult) {
                switch (measureResult.getMeasureType()) {
                    case 0:
                        //距离测量
                        Log.i(TAG, "距离 = " + measureResult.getDistance());
                        Toast.makeText(MainActivity.this, "距离 = " + measureResult.getDistance(), Toast.LENGTH_SHORT).show();
                        break;
                    case 1:
                        //面积周长
                        Log.i(TAG, "面积 = " + measureResult.getArea() + " 周长 = " + measureResult.getPerimeter());
                        Toast.makeText(MainActivity.this, "面积 = " + measureResult.getArea() + " 周长 = " + measureResult.getPerimeter(), Toast.LENGTH_SHORT).show();
                        break;
                    case 2:
                        //角度
                        Log.i(TAG, "角度 = " + measureResult.getAngle());
                        Toast.makeText(MainActivity.this, "角度 = " + measureResult.getAngle(), Toast.LENGTH_SHORT).show();
                        break;
                }
            }
        });
```

4.4 图元绘制,测量分析demo
```java
case R.id.use_default_listener:
                // 设置使用默认的双击事件(放大地图)。
                // 在调用MapWidgetHelper.getSingleton().setMapClickListener后,如果要切原来的双击事件,调用setDefaultDoubleClickEnable(true)
                mapWidgetHelper.getGlSurface().getMapGestureDetector().setDefaultDoubleClickEnable(true);
                break;
            case R.id.use_user_listener:
                // 同双击事件一样
                mapWidgetHelper.getGlSurface().getMapGestureDetector().setSingleClickEnable(true);
                break;
            case R.id.point_add:
                // 定义一个simplePoint对象,
                SimplePoint simplePoint = new SimplePoint();
                simplePoint.setLongLang(114.399774, 30.480749);
                // 添加到simplePointSet 即刻显示到地图上
                simplePointSet.addSimplePoint(simplePoint);
                break;
            case R.id.point_add_point_list:
                // 定义一个点的集合显示到地图上
                testRemoveSimplePoints.add(new SimplePoint(114.399774, 30.480749, 0));
                testRemoveSimplePoints.add(new SimplePoint(115.399774, 31.480749, 0));
                testRemoveSimplePoints.add(new SimplePoint(116.399774, 32.480749, 0));
                testRemoveSimplePoints.add(new SimplePoint(117.399774, 33.480749, 0));
                testRemoveSimplePoints.add(new SimplePoint(118.399774, 34.480749, 0));
                testRemoveSimplePoints.add(new SimplePoint(119.399774, 35.480749, 0));
                simplePointSet.addSimplePoint(testRemoveSimplePoints);
                break;
            case R.id.point_delete_point:
                // 移除index 为3 的点
                simplePointSet.removeSimplePoint(3);
                break;
            case R.id.point_delete_point_list:
                // 移除一组点
                simplePointSet.removeSimplePoint(testRemoveSimplePoints);
                break;
            case R.id.point_delete_all_point:
                // 清除全部的点
                simplePointSet.clear();
                break;
            case R.id.point_add_500_point:
                //性能测试添加5000个点对象到地图上
                double lon = 114.399774;
                double lat = 30.480749;
                List<SimplePoint> largerNumberPoint = new ArrayList<>();
                for (int i = 1; i < 500; i++) {
                    for (int j = 1; j < 20; j++) {
                        largerNumberPoint.add(new SimplePoint(lon + i * 0.1, lat + j + 0.001, 0));
                    }
                }
                simplePointSet.addSimplePoint(largerNumberPoint);
                break;
            case R.id.point_hide:
                // 切换是否隐藏屏幕上的点,(不是删除) 可以再次点击显示
                boolean isShowPointSet = simplePointSet.isShowPointSet;
                if (isShowPointSet) {
                    simplePointSet.hidePointSet();
                } else {
                    simplePointSet.showPointSet();
                }
                break;
            case R.id.point_set_style:
                // 设置点的样式为方形的点,点的类型见EVSimpleMarkerType类
                int pointColor = 0X00FF00;
                int pointSize = 40;
                EVSimpleMarkerSymbol.Builder builder = new EVSimpleMarkerSymbol.Builder();
                builder.setColor(new RgbColor((short) Color.red(pointColor), (short) Color.green(pointColor), (short) Color.blue(pointColor), RegisteredWhenConstruct.RWC_NotCallBack));
                builder.setStyle(EVSimpleMarkerType.SMT_SIMPLEMARKERTYPE_SQUARE);
                builder.setSize(pointSize);
                simplePointSet.setMarkerSymbol(builder.build());
                break;

            case R.id.draw_line_add_point:
                // 绘制一条线段,在线上添加第一个点显示
                drawLineEntity.addPoint(new SimplePoint(111.399774, 29.480749, 0));
                break;
            case R.id.draw_line_add_point_list:
                // 在线上添加一组点
                removeSimplePoints.add(new SimplePoint(114.399774, 30.480749, 0));
                removeSimplePoints.add(new SimplePoint(115.399774, 31.480749, 0));
                removeSimplePoints.add(new SimplePoint(116.399774, 32.480749, 0));
                removeSimplePoints.add(new SimplePoint(117.399774, 33.480749, 0));
                removeSimplePoints.add(new SimplePoint(118.399774, 34.480749, 0));
                removeSimplePoints.add(new SimplePoint(119.399774, 35.480749, 0));
                drawLineEntity.addPoints(removeSimplePoints);
                break;
            case R.id.draw_line_set_point_list:
                // 重新设置线上一组点 并清除原来的点
                removeSimplePoints.add(new SimplePoint(124.399774, 40.480749, 0));
                removeSimplePoints.add(new SimplePoint(125.399774, 41.480749, 0));
                removeSimplePoints.add(new SimplePoint(126.399774, 42.480749, 0));
                removeSimplePoints.add(new SimplePoint(127.399774, 43.480749, 0));
                removeSimplePoints.add(new SimplePoint(128.399774, 44.480749, 0));
                removeSimplePoints.add(new SimplePoint(129.399774, 45.480749, 0));
                drawLineEntity.setPoints(removeSimplePoints);
                break;
            case R.id.draw_line_delete_point:
                // 移除线段上index为4的点
                drawLineEntity.removePoint(4);
                break;
            case R.id.draw_line_delete_end_point:
                // 移除线上最后一个点
                drawLineEntity.removeEndPoint();
                break;
            case R.id.draw_line_delete_point_list:
                // 移除线上index从3开始 后面的3个点
                drawLineEntity.removePoint(3, 3);
                break;
            case R.id.draw_line_delete_all_point:
                // 清除线上全部的点
                drawLineEntity.clearPoint();
                break;
            case R.id.draw_line_set_style:
                // 随机设置线的颜色和宽度
                RgbColor markerColor = new RgbColor((short) rd.nextInt(255), (short) rd.nextInt(255), (short) rd.nextInt(255), RegisteredWhenConstruct.RWC_NotCallBack);
                SimpleLineSymbol simpleLineSymbol = new SimpleLineSymbol(RegisteredWhenConstruct.RWC_NotCallBack);
                simpleLineSymbol.setColor(markerColor);
                simpleLineSymbol.setWidth(rd.nextInt(30));
                markerColor.dispose(true);
                drawLineEntity.setLineSymbol(simpleLineSymbol);
                break;
            case R.id.draw_line_add_line:
                // 重新绘制一条线
                drawLineEntity = new DrawLineEntity();
                drawLineEntities.add(drawLineEntity);
                break;
            case R.id.draw_line_show_point:
                // 控制点上的点是否显示
                boolean flag = drawLineEntity.isShowPointSet();
                drawLineEntity.setShowPointSet(!flag);
                break;
            case R.id.draw_line_show_line:
                // 控制线的显示和隐藏
                boolean isShowDrawEntity = drawLineEntity.isShowDrawEntity();
                if (isShowDrawEntity) {
                    drawLineEntity.setHideEntity();
                } else {
                    drawLineEntity.setShowEntity();
                }
                break;
            case R.id.draw_line_set_point_symbol:
                // 设置线上的点的样式
                int pointColor1 = 0X00FF00;
                int pointSize1 = 40;
                EVSimpleMarkerSymbol.Builder builder1 = new EVSimpleMarkerSymbol.Builder();
                builder1.setColor(new RgbColor((short) Color.red(pointColor1), (short) Color.green(pointColor1), (short) Color.blue(pointColor1), RegisteredWhenConstruct.RWC_NotCallBack));
                builder1.setStyle(EVSimpleMarkerType.SMT_SIMPLEMARKERTYPE_SQUARE);
                builder1.setSize(pointSize1);
                drawLineEntity.setPointStyle(builder1.build());
                break;
            case R.id.draw_line_measure:
                // 测量两点直接的距离
                if (drawLineEntity.getEntityPointSet().getSize() >= 2) {
                    // 第一个点和最后一个点 两个点的距离
                    MapControl mapControl = mapWidgetHelper.getMapControl();

                    SimplePointSet simplePointSet = drawLineEntity.getEntityPointSet();
                    int count = simplePointSet.getSize();
                    SimplePoint point1 = simplePointSet.getSimplePoints().get(count - 1);
                    SimplePoint point2 = simplePointSet.getSimplePoints().get(0);
                    point1.deviceToGeographicPoints(mapControl); // 转换成经纬坐标
                    point2.deviceToGeographicPoints(mapControl); // 转换成经纬坐标

                    Imap map = mapControl.getMap();
                    Ispatialreference sr = map.getSpatialReference();

                    GeodesicMeasure mea = new GeodesicMeasure(sr.getCEllipseSphere().getSamiMajor(), sr.getCEllipseSphere().getInvFlattening(),
                            RegisteredWhenConstruct.RWC_NotCallBack);
                    double res = mea.distanceMeasure(point1.longitude, point1.latitude,
                            point2.longitude, point2.latitude, null, 50);
                    Log.i(TAG, "res = " + res);

                }
                break;
            case R.id.draw_area_show_area:
                /*boolean drawLineEntity.isLine();*/
                // setLine(false); 表示当前drawLineEntity绘制的是面图元
                drawLineEntity.setLine(false);
                break;
            case R.id.draw_area_set_style:
                //设置面的样式
                drawLineEntity.setLine(false);
                AreaConfig areaConfig = drawLineEntity.getAreaConfig();
                int color = 0x00FF00;
                areaConfig.setAreaColor(color);
                areaConfig.setAreaLineWidth(rd.nextInt(30));
                drawLineEntity.setAreaSymbol(areaConfig.getDefaultFillSymbol());
                break;

            case R.id.draw_area_show_line:
                // 设置面上的线是否可以显示
                boolean isShowAreaLine = drawLineEntity.isShowAreaLine();
                drawLineEntity.setShowAreaLine(!isShowAreaLine);
                break;
            case R.id.draw_area_set_point_symbol:
                // 设置面上的线是否需要显示
                LineConfig lineConfig = new LineConfig();
                int c = 0x0000FF;
                lineConfig.setPointColor(c);
                drawLineEntity.setPointStyle(lineConfig.getLinePointSymbol());
                break;
            case R.id.draw_area_set_line_symbol:
                // 设置面图元上的线的样式
                AreaConfig areaConfig1 = drawLineEntity.getAreaConfig();
                int pp = 0x00FFFF;
                areaConfig1.setAreaLineColor(pp);
                drawLineEntity.setAreaSymbol(areaConfig1.getDefaultFillSymbol());
                break;

            case R.id.draw_line_enable_measure:
                //使能测量功能,图元绘制的时候关闭,测量的回调接口不触发器
                drawLineEntity.setNeedMeasure(true);
                break;
            case R.id.draw_angle:
                clickMapShowAngle();
                break;
            case R.id.draw_angle_delete_end:
                drawAngleEntity.removeEndAngle();
                break;
```

4.5 文字绘制demo
```java
            case R.id.draw_text_show_text:
                // 设置点击地图的监听事件,绘制文字
                clickMapShowText();
                break;
            case R.id.draw_text_add_text:
                TextEntity textEntity = new TextEntity();
                Location location = new Location("");
                location.setLongitude(114.399774);
                location.setLatitude(30.48074);
                textEntity.setSimplePoint(new SimplePoint(location));
                textEntity.setMsg("text-" + textCount);
                drawTextEntity.addText(textEntity);
                textCount++;
                break;
            case R.id.draw_text_remove_last:
                drawTextEntity.removeLastText();
                break;
            case R.id.draw_text_remove_list:
                // 移除位置3 4上的两个文字
                drawTextEntity.removeText(2, 2);
                break;
            case R.id.draw_text_clear:
                drawTextEntity.clearText();
                textCount = 0;
                break;
```
其中定义的文字封装实体类
```java
    // 绘制文字对象
    DrawTextEntity drawTextEntity = null;
    int textCount = 0;
    // 绘制图片
    ImageEntity imageEntity = null;
    List<ImageEntity> imageEntities = new ArrayList<>();
```

在地图加载完成的回调方法中初始换drawTextEntity
```java
@Override
            public void loadSuccess(EVSDKEntity.MapLoadedEntity entity) { 
                drawTextEntity = new DrawTextEntity();
                imageEntity = new ImageEntity();

                // 设置大小
                imageEntity.setImageSize(50);
                imageEntity.setAssertImageFile("hl.png");  // assets/images/hl.png
                imageEntities.add(imageEntity);
            }
```

4.6、图片绘制Demo调用
```java
            case R.id.draw_image_show_image:
                imageEntity = new ImageEntity();
                // 设置显示另一张图片
                imageEntity.setImageSize(50);
                imageEntity.setAssertImageFile("location.png");  // assets/images/location.png
                //imageEntity.setRepeatDraw(false);
                imageEntities.add(imageEntity);
                clickMapShowImage();
                break;
            case R.id.draw_image_add_image:
                imageEntity.addImageAt(new SimplePoint(119.399774, 29.480749, 0));
                break;
            case R.id.draw_image_remove_last:
                imageEntity.removeLastImage();
                break;
            case R.id.draw_image_remove_list:
                imageEntity.removeImage(3, 2);
                break;
            case R.id.draw_image_clear:
                imageEntity.removeAllImage();
                break;
```

4.7 贝塞尔(光滑)曲线绘制
```java

    // 定义曲线对象
    // 绘制贝塞尔曲线
    DrawBezierLineEntity drawBezierLineEntity = null;
    // 绘制的是否是贝塞尔曲线
    private boolean isBezierLine = false;

            //点击事件添加点到曲线上
            case R.id.draw_bezier_line_set_is_bezier_close_line:
                isBezierLine = true;
                // 设置点击地图的监听事件,绘制闭合的贝塞尔曲线
                clickMapShowLineArea();
                drawBezierLineEntity = new DrawBezierLineEntity();
                drawBezierLineEntity.setDrawEntityType(DrawBezierLineEntity.DRAW_BEZIER_LINE);
                EVBezierLine evBezierLine = new EVBezierLine();
                evBezierLine.setLineType(EVBezierLine.CLOSED_LINE);// 闭合曲线
                //evBezierLine.setLineType(EVBezierLine.LINE);// 非闭合曲线
                // 贝塞尔曲线暂时不支持删除一个重新绘制,只支持添加点
                evBezierLine.setStep(0.1);// 分10段 ,也是默认值
                drawBezierLineEntity.setEvBezierLine(evBezierLine);
                break;
            case R.id.draw_bezier_line_set_is_bezier_line:
                isBezierLine = true;
                // 设置点击地图的监听事件,绘制闭合的贝塞尔曲线
                clickMapShowLineArea();
                drawBezierLineEntity = new DrawBezierLineEntity();
                drawBezierLineEntity.setDrawEntityType(DrawBezierLineEntity.DRAW_BEZIER_LINE);
                EVBezierLine evBezierLine1 = new EVBezierLine();
                evBezierLine1.setLineType(EVBezierLine.LINE);// 闭合曲线
                //evBezierLine.setLineType(EVBezierLine.LINE);// 非闭合曲线
                // 贝塞尔曲线暂时不支持删除一个重新绘制,只支持添加点
                evBezierLine1.setStep(0.1);// 分10段 ,也是默认值
                drawBezierLineEntity.setEvBezierLine(evBezierLine1);
                break;
            case R.id.draw_bezier_line_add_points:
                //drawBezierLineEntity1上添加一组点
                List<SimplePoint> addBezierPoinst = new ArrayList<>();
                addBezierPoinst.add(new SimplePoint(117.399774, 33.480749, 0));
                addBezierPoinst.add(new SimplePoint(119.399774, 29.480749, 0));
                addBezierPoinst.add(new SimplePoint(120.399774, 25.480749, 0));
                addBezierPoinst.add(new SimplePoint(127.399774, 20.480749, 0));
                drawBezierLineEntity.addPoints(addBezierPoinst);
                break;

            case R.id.draw_bezier_line_delete_points:
                // 删除一组点
                drawBezierLineEntity.removePoint(0, 2);
                break;
            case R.id.draw_bezier_line_delete_all:
                drawBezierLineEntity.clearPoint();
                break;
            case R.id.draw_bezier_line_set_bezier_area_style:
                drawBezierLineEntity.setAreaSymbol(DrawBezierLineEntity.DRAW_BEZIER_AREA);
                break;
            case R.id.draw_bezier_line_set_bezier_line__style:
                drawBezierLineEntity.setLineSymbol(DrawBezierLineEntity.DRAW_BEZIER_LINE);
                break;
            case R.id.draw_bezier_line_hide_side_point:
                //控制点的显示
                boolean showPoint = drawBezierLineEntity.isShowPointSet();
                drawBezierLineEntity.setShowPointSet(!showPoint);
                break;
            case R.id.draw_bezier_line_hide_side_line:
                // 控制线的显隐藏 ,如果当前绘制的是线,请使用setHideEntity方法控制,此方式只针对面的绘制
                boolean showLine = drawBezierLineEntity.isShowAreaLine();
                drawBezierLineEntity.setShowAreaLine(!showLine);
                break;
            case R.id.draw_bezier_line_hide_entity:
                // 控制全部的显示隐藏
                boolean showEntity = drawBezierLineEntity.isShowDrawEntity();
                if (showEntity) {
                    drawBezierLineEntity.setHideEntity();
                } else {
                    drawBezierLineEntity.setShowEntity();
                }
                break;
```

4、8 角度测量
```java
            case R.id.draw_angle:
                clickMapShowAngle();
                break;
            case R.id.draw_angle_delete_end:
                drawAngleEntity.removeEndAngle();
                break;
```

4、9 证书验证功能(相关代码见EVSDKDemo):
```java
            case R.id.action_license:
                if (Constant.enableLicense) {
                    registerLicense();
                } else {
                    Log.e(TAG, "未使能证书验证功能");
                }
                break;
            case R.id.action_unregister_license:
                if (Constant.enableLicense) {
                    unregisterLicense();
                } else {
                    Log.e(TAG, "未使能证书验证功能");
                }
                break;
```

- 5.2、Fragment中添加地图功能(和Activity大同小异)
  1、先在activity中加载so库
```java
    // copy 固定调用
    static {
        System.loadLibrary("EV_Core_Java");
        System.loadLibrary("EV_ProjectManager_Java");// ProjectManager
        System.loadLibrary("EV_SpatialInterface_Java");
        System.loadLibrary("EV_Download_Java");// WebManager
        System.loadLibrary("EV_Plugin_GLMap");// initAsset
    }
```
2、MapFragment继承自EVBaseFragment
3、在onViewCreated方法中完成地图的初始胡和加载过程initMap,loadMap
```java
/**
     * 初始化地图
     */
    private void initMap() {
        MapContext.getInstance().init(mContext, mContext.getAssets());
    }

    /**
     * 加载地图,要求获取到文件读取权限。可以先在activity中申请
     */
    private void loadMap() {
        setMapLoadCallBack(new MapLoadCallBack() {
            @Override
            public void beforeMapLoad() {
                // 加载地图前的回调函数
            }

            @Override
            public void loadSuccess(EventBusEntity.MapLoadedEntity entity) {
                // 地图加载成功回调函数
            }

            @Override
            public void loadError(EventBusEntity.MapLoadedEntity entity) {
                // 地图加载失败回调函数
            }
        });
        loadMapProject(mGlobeGLSurface); //loadMapProject 继承自父类,开始加载地图
        //loadMapProject("map20220324.evproj", mGlobeSurface); //loadMapProject 继承自父类,开始加载指定地图
    }
```
完整代码见EVSDK二次开发包中的EVSDKDemo
收藏 0 0

登录 后评论。没有帐号? 注册 一个。

林亮

研发
  • 0 回答
  • 0 粉丝
  • 0 关注