Android 腾讯位置服务地图简单使用

news2024/9/22 15:46:28

文章目录

  • 概述
    • 腾讯位置服务地图SDK
    • 兼容性
  • 创建工程
    • 获取Appkey
    • 配置AppKey
    • 配置工程
    • 代码混淆
    • 权限配置
  • 地图
    • 基础地图
    • 地图类型
    • 个性化地图
    • 3D建筑
    • 行政区划
  • 出现的问题及解决
  • 源码


概述


本文参考腾讯位置服务官方文档:Android地图SDK | 腾讯位置服务 (qq.com)

腾讯位置服务地图SDK

腾讯位置服务地图SDK(Android)是一套基于Android 4.3及以上版本的多种地理位置服务的应用程序接口。 通过调用该接口,您可以轻松访问腾讯地图服务和数据,构建功能丰富、交互性强、契合各种行业场景的地图类应用程序。也可以在自己的Android应用中加入地图相关的功能,包括:地图展示、标注、绘制图形等。

兼容性

支持Android 4.3及以上系统。

创建工程

腾讯位置服务链接

获取Appkey

Appkey

配置AppKey

在AndroidManifest.xml的application标签中配置key

 <application>
        ...
        <meta-data android:name="TencentMapSDK" android:value="您申请的Key" />
    </application>

配置工程

方法1:主动添加SDK

  1. 将jar放在libs目录下
    放置jar包

  2. 右键该jar包,选择Add AS Library,弹出窗口选择确定
    Create_Library

  3. 变成下图所示为导入成功
    jar_success

  4. 将jni目录下的所有文件按照原目录格式,拷贝到AndroidStudio项目对应的 app/src/main/jniLibs/ 目录下:
    local_jni
    import_so
    方法2:Gradle配置maven或jcenter仓库集成SDK
    在 Project 的 build.gradle 文件中配置 repositories,添加 maven 或 jcenter仓库地址。AndroidStudio 默认会在 Project 的 build.gradle 为所有module自动添加 jcenter 仓库地址,如果已存在,则不需要重复添加:


buildscript {
    repositories {
        google()
        jcenter()
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:版本'
    }
}
//向所有模块配置仓库:
allprojects {
    repositories {
        google()
        jcenter()
        mavenCentral()
    }
}

在 build.gradle 文件的 dependencies 中增加配置

implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.tencent.map:tencent-map-vector-sdk:版本号'

代码混淆

如果需要混淆工程,在module里找到proguard-rules.pro文件,添加如下混淆脚本:

-keep public class com.tencent.lbssearch.** {*;}
-keep public class com.tencent.map.** {*;}
-keep public class com.tencent.mapsdk.** {*;}
-keep public class com.tencent.tencentmap.**{*;}
-keep public class com.tencent.tmsbeacon.**{*;}
-keep public class com.tencent.tmsbeacon.**{*;}
-dontwarn com.qq.**
-dontwarn com.tencent.**

权限配置

地图SDK需要使用网络,访问硬件存储等系统权限,在AndroidManifest.xml文件里,添加如下权限:

请在manifest文件下配置如下权限:

<!--腾讯地图 SDK 要求的权限(开始)-->
<!--访问网络获取地图服务-->
<uses-permission android:name="android.permission.INTERNET"/>
<!--检查网络可用性-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!-- 访问WiFi状态 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!--需要外部存储写权限用于保存地图缓存-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--获取 device id 辨别设备-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<!--腾讯地图 SDK 要求的权限(结束)-->

地图

基础地图

地图视图:

  • MApView:普通地图视图
  • TextureMapView:纹理化地图视图
  • MapRenderLayer:地图渲染层容器
    差异:
视图类型内部实现视图动画性能ListView显示多实例
MapViewGLSurfaceView不支持不流畅支持
TextureMapViewTextureView支持不流畅支持
MapRenderLayerSurface+GLThread外部控制外部控制流畅支持

绑定地图生命周期:创建地图视图后,需要绑定应用生命周期,以保障地图在应用的不同生命周期中能正确处理显示和刷新逻辑。

应用生命周期地图生命周期
onStart()onStart()
onResume()onResume()
onPause()onPause()
onStop()onStop()
onDestory()onDestory()

基础地图布局

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".BaseMapActivity">

    <!--基础地图-->
    <com.tencent.tencentmap.mapsdk.maps.TextureMapView
        android:id="@+id/mapView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>

创建基础地图的activity

public class BaseMapActivity extends AppCompatActivity {
    private TextureMapView mapView;
    private TencentMap tencentMap;

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

        TencentMapInitializer.setAgreePrivacy(true);

        mapView = findViewById(R.id.mapView);

        tencentMap = mapView.getMap();
    }

    /**
     * mapview的生命周期管理
     */
    @Override
    protected void onStart() {
        super.onStart();
        mapView.onStart();
    }

    @Override
    protected void onResume() {
        super.onResume();
        mapView.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        mapView.onPause();
    }

    @Override
    protected void onStop() {
        super.onStop();
        mapView.onStop();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mapView.onDestroy();
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        mapView.onRestart();
    }

}

效果图:
基础地图

地图类型

常量说明
TecentMapMAP_TYPE_NORMAL普通地图(默认)
TecentMapMAP_TYPE_SATELLITE卫星地图
TecentMapMAP_TYPE_DARK暗色地图
TecentMapMAP_TYPE_NIGHT夜景地图
TecentMapMAP_TYPE_NAVI导航地图

实时路况:
腾讯地图SDK还提供了实时路况图层,可以为提供实时交通数据的城市展示实时交通状况。

//开启路况服务
tencentMap.setTrafficEnabled(true);

地图类型布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MapTypeActivity">
    <RadioGroup
        android:id="@+id/map_type"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <RadioButton
            android:id="@+id/normal"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:checked="true"
            android:text="普通图">
        </RadioButton>
        <RadioButton
            android:id="@+id/satellite"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="卫星图">
        </RadioButton>
        <RadioButton
            android:id="@+id/dark"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="暗色图">
        </RadioButton>
        <RadioButton
            android:id="@+id/traffic"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"

            android:text="路况">
        </RadioButton>     
    </RadioGroup>

    <com.tencent.tencentmap.mapsdk.maps.MapView
        android:layout_below="@+id/map_type"
        android:id="@+id/basemap"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </com.tencent.tencentmap.mapsdk.maps.MapView>
</RelativeLayout>

地图类型Activity

public class MapTypeActivity extends AppCompatActivity implements RadioGroup.OnCheckedChangeListener {

    private MapView mapView;
    private TencentMap tencentMap;
    private RadioGroup radioGroup;
    private MapLifecycle mapLifecycle;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_map_type);
        TencentMapInitializer.setAgreePrivacy(true);
        mapView=findViewById(R.id.basemap);
        radioGroup=findViewById(R.id.map_type);
        radioGroup.setOnCheckedChangeListener(this);
        tencentMap=mapView.getMap();
        mapLifecycle=new MapLifecycle(mapView);
        getLifecycle().addObserver(mapLifecycle);
    }

    @Override
    public void onCheckedChanged(RadioGroup radioGroup, int i) {
        switch (i){
//            普通地图
            case R.id.normal:
                tencentMap.setTrafficEnabled(false);
                tencentMap.setMapType(TencentMap.MAP_TYPE_NORMAL);
                break;
//            卫星地图
            case R.id.satellite:
                tencentMap.setTrafficEnabled(false);
                tencentMap.setMapType(TencentMap.MAP_TYPE_SATELLITE);
                break;
//            暗色地图
            case R.id.dark:
                tencentMap.setTrafficEnabled(false);
                tencentMap.setMapType(TencentMap.MAP_TYPE_DARK);
                break;
//            路况地图
            case R.id.traffic:
                tencentMap.setTrafficEnabled(true);
                break;
            default:
                break;

        }
    }
}

效果图:
地图类型

个性化地图

  1. 在个性化地图中我的样式中选择样式
    选择样式
  2. 在样式应用中查看已经绑定的样式
    已绑定的样式

界面布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <RadioGroup
        android:id="@+id/personalizemap_type"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        >
        <RadioButton
            android:id="@+id/yulu"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:checked="true"
            android:text="玉露">
        </RadioButton>

        <RadioButton
            android:id="@+id/yancui"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="烟翠">
        </RadioButton>

        <RadioButton
            android:id="@+id/danyue"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="澹月">
        </RadioButton>

    </RadioGroup>

    <com.tencent.tencentmap.mapsdk.maps.MapView
        android:id="@+id/personalize_map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/personalizemap_type">

    </com.tencent.tencentmap.mapsdk.maps.MapView>

</LinearLayout>

个性化地图Activity


public class PersonalizeMapActivity extends AppCompatActivity implements RadioGroup.OnCheckedChangeListener {
    private MapView mapView;
    private TencentMap tencentMap;
    private RadioGroup radioGroup;
    private MapLifecycle mapLifecycle;

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

        TencentMapInitializer.setAgreePrivacy(true);

        mapView=findViewById(R.id.personalize_map);
        radioGroup=findViewById(R.id.personalizemap_type);
        radioGroup.setOnCheckedChangeListener(this);
        tencentMap=mapView.getMap();
        mapLifecycle=new MapLifecycle(mapView);
        getLifecycle().addObserver(mapLifecycle);
    }

    @Override
    public void onCheckedChanged(RadioGroup radioGroup, int i) {
        switch (i){
            //雨露
            case R.id.yulu:
                tencentMap.setMapStyle(1);
                break;
//                烟翠
            case R.id.yancui:
                tencentMap.setMapStyle(2);
                break;
//                澹月
            case R.id.danyue:
                tencentMap.setMapStyle(3);
            default:
                break;
        }
    }
}

效果图:
玉露翠烟澹月

3D建筑

方法说明
TencentMapsetBuilding3dEffectEnable(boolean enableEffect)默认使用3D模式绘制楼块

//显示3D建筑物
tencentMap.setBuilding3dEffectEnable(true);

//隐藏3D建筑物
tencentMap.setBuilding3dEffectEnable(false);

在个性化地图布局中插入显示3D建筑开关组件

  <View
        android:layout_width="match_parent"
        android:layout_height="0.5dp"
        android:background="@android:color/darker_gray" />
    <Switch
        android:id="@+id/switch_open"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textOn="开3D"
        android:textOff="关2D"
        android:gravity="center_vertical"
        android:showText="true"
        android:checked="true" />

在个性化地图Activity中插入显示3D建筑开关监听


 aSwitch=findViewById(R.id.switch_open);

         aSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                PorterDuff.Mode buttonTintMode=compoundButton.getButtonTintMode();
                if(b){
                    //显示3D建筑物
                    tencentMap.setBuilding3dEffectEnable(true);
                }else {
                    //隐藏3D建筑物
                    tencentMap.setBuilding3dEffectEnable(false);
                }
            }
        });

效果图:
3D_2D

行政区划

接口名称功能
getDistrictList(HttpResponseListener listener)获取全部行政区化数据
getDistrictChildren(DistrictChildrenParam object, HttpResponseListener listener)获取指定行政区划的子级行政区划
getDistrictSearch(DistrictSearchParam object, HttpResponseListener listener)根据关键词搜索行政区划

请求参数概览:

  1. getDistrictList(HttpResponseListener listener)

查询成功后,listener返回所有行政区划数据。

  1. getDistrictChildren(DistrictChildrenParam object, HttpResponseListener listener)
接口名功能
DistrictChildrenParam()构造请求参数
id(int id)父级行政区划 ID,缺省时则返回最顶级行政区划, 行政区划 ID 可以使用 getDistrictList 获取
  1. getDistrictSearch(DistrictSearchParam object, HttpResponseListener listener)
接口名功能
DistrictSearchParam(String keyword)构造请求参数,并设置查询关键字
keyword(String keyword)设置行政区划查询关键字

行政区化界面布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <Spinner
        android:id="@+id/sp_province"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
    </Spinner>
    <Spinner
        android:id="@+id/sp_city"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

    </Spinner>
    <Spinner
        android:id="@+id/sp_district"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
    </Spinner>
    
    <com.tencent.tencentmap.mapsdk.maps.MapView
        android:id="@+id/district_map"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </com.tencent.tencentmap.mapsdk.maps.MapView>
</LinearLayout>

行政区划Activity:

public class DistrictActivity extends AppCompatActivity {
    private Spinner province;
    private Spinner city;
    private Spinner district;
    private List<LatLng> latLngs=new ArrayList<>();
    private TencentMap tencentMap;
    private MapView mapView;
    private MapLifecycle mapLifecycle;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_district);
        TencentMapInitializer.setAgreePrivacy(true);
        initView();
        initSpinner();

    }

    protected void initView(){
        province=(Spinner) findViewById(R.id.sp_province);
        city=(Spinner) findViewById(R.id.sp_city);
        district=(Spinner) findViewById(R.id.sp_district);
        mapView=findViewById(R.id.district_map);
        tencentMap=mapView.getMap();
        mapLifecycle=new MapLifecycle(mapView);
        getLifecycle().addObserver(mapLifecycle);
    }

    protected void initSpinner(){
        getDistrict(0, R.id.sp_province);
        AdapterView.OnItemSelectedListener onItemSelectedListener = new AdapterView.OnItemSelectedListener() {

            @Override
            public void onItemSelected(AdapterView<?> parent, View view,
                                       int position, long id) {
                // TODO Auto-generated method stub
                switch (parent.getId()) {
                    case R.id.sp_province:
                        getDistrict(((List<Integer>) parent.getTag()).
                                get(position).intValue(), R.id.sp_city);
                        break;
                    case R.id.sp_city:
                        getDistrict(((List<Integer>) parent.getTag()).
                                get(position).intValue(), R.id.sp_district);
                        break;
                    case R.id.sp_district:
                        getDistrict(((List<Integer>) parent.getTag()).
                                get(position).intValue(), R.id.sp_district);
                        tencentMap.moveCamera(CameraUpdateFactory.newCameraPosition(new CameraPosition(latLngs.get(position), 15f, 0, 0)));
                    default:
                        break;
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
                // TODO Auto-generated method stub

            }
        };
        province.setOnItemSelectedListener(onItemSelectedListener);
        city.setOnItemSelectedListener(onItemSelectedListener);
        district.setOnItemSelectedListener(onItemSelectedListener);

    }

    /**
     * 获取行政区划
     */
    protected void getDistrict(int pDistrict, final int spId){
        TencentSearch tencentSearch=new TencentSearch(this);
        DistrictChildrenParam districtChildrenParam=new DistrictChildrenParam();
        Log.d("eqrwqeqewr","getdistrict" + spId);

         //如果不设置id,则获取全部数据
        if (spId != R.id.sp_province && spId == R.id.sp_city) {
            districtChildrenParam.id(pDistrict);
        }
        if (spId != R.id.sp_province && spId != R.id.sp_city) {
            districtChildrenParam.id(pDistrict);
        }

        tencentSearch.getDistrictChildren(districtChildrenParam, new HttpResponseListener<BaseObject>() {
            @Override
            public void onSuccess(int i, BaseObject baseObject) {
                if (baseObject==null){
                    return;
                }
                DistrictResultObject obj=(DistrictResultObject) baseObject;
                switch (spId){
                    case R.id.sp_province:
                        setDistrictAdapter(province, obj);
                        break;
                    case R.id.sp_city:
                        setDistrictAdapter(city, obj);
                        break;
                    case R.id.sp_district:
                        setDistrictAdapter(district, obj);
                        break;

                    default:
                        break;
                }
            }

            @Override
            public void onFailure(int i, String s, Throwable throwable) {

            }
        });

    }
    /**
     * 设置行政区划的adapter
     *
     * @param spinner 要设置adapter的spinner
     * @param obj     用于填充adapter的数据源
     */
    protected void setDistrictAdapter(Spinner spinner, final DistrictResultObject obj){
        List<String> names = new ArrayList<String>();
        List<Integer> ids = new ArrayList<Integer>();
        latLngs.clear();
        final List<DistrictResultObject.DistrictResult> districtResults = obj.result.get(0);
        for (final DistrictResultObject.DistrictResult result : districtResults) {
            names.add(result.fullname);
            ids.add(result.id);
            latLngs.add(result.latLng);
            Log.d("位置", "setDistrictAdapter: " + result.fullname);

        }
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_spinner_item, names);
        spinner.setAdapter(adapter);
        //将行政区划编码附到spinner方便后续查询
        spinner.setTag(ids);
    }
    protected void printResult(final String r) {
        runOnUiThread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
            }
        });
    }
}

效果图:
行政区划

出现的问题及解决

  1. 问题1: 跳转地图页面时,出现白屏,且程序未报错
    问题1
    解决:
    开发者使用v4.5.6及之后的版本需要保证用户同意隐私协议,设置同意地图SDK的隐私协议后才能正常使用地图SDK功能。
    在调用地图的activity中的onCreat()方法中,添加一句:
/**
 * 设置用户是否同意隐私协议
 * 需要在初始化地图之前完成,传入true后才能正常使用地图功能
 * @param isAgree 是否同意隐私协议
 */
TencentMapInitializer.setAgreePrivacy(true)

  1. 问题2:找不到jniLibs文件夹

解决1:解决:在Project模式中,app -> build.gradle 中android{}中添加,so库文件全部拷贝到libs文件夹下。


sourceSets{  
      main{  
          jniLibs.srcDirs=['libs']  
      }  
  }  

同步之后,模式切换为Android后就会出现jniLibs文件夹,libs文件夹变成jniLibs文件夹。

解决2:

在app->src->main文件中新建jniLibs文件夹。

源码

源码地址

作者:赖艺娜
原文链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/57738.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构与算法】一套链表 OJ 带你轻松玩转链表

✨个人主页&#xff1a;bit me ✨当前专栏&#xff1a;数据结构 ✨刷题专栏&#xff1a;基础算法 链 表 OJ&#x1f3f3;️一. 移除链表元素&#x1f3f4;二.反转链表&#x1f3c1;三.链表的中间结点&#x1f6a9;四.链表中倒数第k个结点&#x1f3f3;️‍&#x1f308;五.合并…

华为阿里等技术专家15年开发经验总结:SSM整合开发实战文档

前言 都说程序员工资高、待遇好&#xff0c; 2022 金九银十到了&#xff0c;你的小目标是 30K、40K&#xff0c;还是 16薪的 20K&#xff1f;作为一名 Java 开发工程师&#xff0c;当能力可以满足公司业务需求时&#xff0c;拿到超预期的 Offer 并不算难。然而&#xff0c;提升…

Spring基础篇:事务开发

Spring整合持久层 Spring技术为什么要与持久层技术进行整合&#xff1f; 1、JavaEE开发过程中我们需要持久才能进行数据库的访问操作。 2、JDBC Hibernate MyBatis进行持久层过程中存在大量的代码冗余。 3、Spring基于模板设计模式对这些持久层技术呢作出了封装。 ps注释&…

[附源码]计算机毕业设计疫情期间小学生作业线上管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【Android App】在线直播之搭建WebRTC的服务端(图文解释 简单易懂)

有问题或需要源码请点赞关注收藏后评论区留言私信~~~ 一、WebRTC的系统架构 WebRTC&#xff08;网页即时通信&#xff09;是一个支持浏览器之间实时音视频对话的新型技术&#xff0c;WebRTC体系由应用于实时通信的编程接口和一组通信协议组成&#xff0c;已成为互联网流媒体通…

(八) 共享模型之管程【ReentrantLock】

相对于 synchronized 具备如下特定&#xff1a; &#xff08;1&#xff09;可中断 &#xff08;2&#xff09;可以设置超市时间 &#xff08;3&#xff09;可以设置为公平锁 &#xff08;4&#xff09;支持多个条件变量 与 synchronized 一样&#xff0c;都支持可重入 基本语法…

回归预测 | MATLAB实现基于RF随机森林的用水量预测(多因素、多指标)

回归预测 | MATLAB实现基于RF随机森林的用水量预测(多因素、多指标) 目录 回归预测 | MATLAB实现基于RF随机森林的用水量预测(多因素、多指标)预测效果基本介绍模型原理程序设计参考资料预测效果 基本介绍 将随机森林回归原理应用到了预测领域,构建了基于随机森林的预测模型,…

Spring-Cloud-Zipkin-05

前言 1、链路追踪由来&#xff1a;在微服务框架中&#xff0c;一个由客户端发起的请求在后端系统中会经过多个不同的服务节点调用来协同产生最后的请求结果&#xff0c;每一个请求都会开成一条复杂的分布式服务调用链路&#xff0c;链路中的任何一环出现高延时或错误都会引导起…

一文读懂vue3和vue2的API风格对比

Vue3 组合式 API&#xff08;Composition API&#xff09; 主要用于在大型组件中提高代码逻辑的可复用性。 传统的组件随着业务复杂度越来越高&#xff0c;代码量会不断的加大&#xff0c;整个代码逻辑都不易阅读和理解。 Vue3 使用组合式 API 的地方为 setup。 在 setup 中…

JavaEE-多线程初阶1

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录1.认识线程1.1概念1.2多线程程序1.3创建线程2.Thread类及常见方法2.1Thread 的常见构造方法2.2 Thread 的几个常见属性2.3中断…

在本地利用服务器显卡跑代码

除了使用xshell等连接服务器以外&#xff0c;pycharm也可以连接服务器&#xff0c;在服务器上运行代码&#xff0c;上传下载文件等操作。 参考&#xff1a;https://cloud.tencent.com/developer/article/1738482 步骤如下&#xff1a; 1、pycharm工具栏&#xff1a;Tools– D…

基于51单片机的压力监测仪(MPX4115)(Proteus仿真+程序)

编号&#xff1a;28 基于51单片机的压力监测仪(MPX4115) 功能描述&#xff1a; 本设计由51单片机最小系统MPX4115压力传感器ADC0832模块液晶1602模块 1、主控制器是AT89C82单片机 2、MPX4115压力传感器采集气压力&#xff0c;通过ADC0832模数转换器进行A/D转换&#xff0c;读…

Java语言与系统设计课程实验报告

做个课设做的我人间失格&#xff0c;写了一晚上没保存&#xff0c;真是哭死 一、目的与要求 &#xff08;一&#xff09;、实验目的 掌握Java语言与系统设计的基本思路和方法。 利用所学的基本知识和技能&#xff0c;解决简单的Java语言与系统设计问题。 &#xff08;二&…

挂耳式蓝牙耳机性价比推荐,几款高性能的耳机分享

无论是在日常还是运动的场景下&#xff0c;我们通常都会选择佩戴着耳机&#xff0c;让我们能够顺利过渡掉枯燥的生活&#xff0c;之前人们会选择入耳式的耳机&#xff0c;在长期佩戴过后会有不小的疾病诞生&#xff0c;在近些年迅速火起的骨传导耳机成为了焦点&#xff0c;其保…

Java线程池理解与学习

线程过多就容易引发内存溢出&#xff0c;因此我们有必要使用线程池的技术 线程池的好处 降低资源消耗&#xff1a; 通过重复利用已创建的线程降低线程创建和销毁造成的消耗 提高响应速度&#xff1a; 当任务到达时&#xff0c;任务可以不需要等待线程创建就能立即执行 提高线…

GEE:关系、条件和布尔运算

ee.Image对象具有一组用于构建决策表达式的关系、条件和布尔运算方法。这些方法可以用来掩膜、绘制分类地图和重新赋值。 本文记录了在GEE&#xff08;Google Earth Engine&#xff09;平台上的关系运算符和布尔运算符&#xff0c;分别应用到了三个不用的场景&#xff08;筛选低…

【坚持不懈的每日一题——力扣篇】1796. 字符串中第二大的数字(简单)+set 用法复习

GitHub同步更新&#xff08;已分类&#xff09;&#xff1a;Data_Structure_And_Algorithm-Review 公众号&#xff1a;URLeisure 的复习仓库 公众号二维码见文末 以下是本篇文章正文内容&#xff0c;下面案例可供参考。 一、题目描述 力扣今天推的每日一题是道简单题&#x…

[附源码]计算机毕业设计心理健康系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

读写锁三种关系的证明(读者和读者互补影响、写者和写者互斥、读者和写者互斥)

目录 1、读者和读者互不影响 2、写者和写者互斥 3、读者和写者互斥 (1) 读者持有锁 (2) 写者持有锁 1、读者和读者互不影响 假设现在只有读者线程&#xff0c;我们让一个读者线程申请锁以后&#xff0c;但是不释放读写锁。 #include <stdio.h> #include <unist…

[附源码]JAVA毕业设计计算机专业在线学习评估软件-演示录像-(系统+LW)

[附源码]JAVA毕业设计计算机专业在线学习评估软件-演示录像-&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&…