腾讯地图SDK Android版开发 10 InfoWindow

news2024/12/24 8:51:21

腾讯地图SDK Android版开发 10 InfoWindow

  • 前言
  • 介绍
    • 默认风格
    • 自定义样式
    • 实现方式
    • 交互操作
    • 播放信息窗口的动画
    • 开启多窗口模式
  • 相关类和接口
    • 默认样式
      • MarkerOptions 类
      • Marker 类
      • TencentMap类
      • TencentMap.OnInfoWindowClickListener 接口类
    • 自定义样式
      • TencentMap 类
      • TencentMap.InfoWindowAdapter 接口
  • 示例
    • 界面布局
    • MapInfoWindow类
      • 常量
      • 成员变量
      • 初始化
      • 创建与移除覆盖物
      • 设置属性
      • 自定义样式
      • 加载与移除地图
    • MapInfoWindowActivity 类
      • 控件响应事件
    • 运行效果图

前言

前文介绍的腾讯地图添加Marker覆盖物的使用方法,本文重点介绍如何结合Marker使用InfoWindow展示更多信息。

介绍

信息窗口,是依附于Marker之上的展现元素,用于对Marker进行详细描述。

腾讯地图SDK默认提供的InfoWindow分标题和简述两部分,开发者也可以自定义InfoWindow,满足个性化场景的要求。

主要功能有:

  1. 默认信息窗口的显示和隐藏

  2. 创建一个自定义信息窗口

  3. 注册信息窗口的事件监听

  4. 播放信息窗口的动画

  5. 开启多窗口模式

默认风格

  • 使用MarkerOptions或者Marker来开启InfoWindow和设置信息内容。

  • 当点击Marker的时候,将显示InfoWindow

  • 通过Marker的接口显示和隐藏InfoWindow

自定义样式

TencenMap接口中,TencentMap.InfoWindowAdapter类用来提供自定义窗口能力。

该类提供两个接口:无边框自定义View和带边框自定义View。

当配置了InfoWindowAdapter时,MarkerOptions中的titlesnippet属性即失效。

实现方式

InfoWindow有两种实现方式,开发者需要针对不同场景选择适合的类型,展示信息窗口。

  1. Bitmap型,通过View布局转化成Bitmap,然后由渲染引擎绘制在地图上展示。
  2. View型,通过View布局直接在地图上展示。

两者之间的对比表格:

类型定制化动画性能复杂度
Bitmap有限
View支持
  • 默认InfoWindow使用的是Bitmap类型,该类型整体是一张图片。

  • 还可以通过MarkerOptions指定当前MarkerInfoWindow使用View类型。

交互操作

  • SDK内置了InfoWindow的点击事件。

  • 通过TencentMap.setOnInfoWindowClickListener设置Marker气泡点击事件监听。

  • 当使用View类型时,infoWindow的事件监听由View来接管处理。也就是可以给View的任何一个子控件设置点击事件。

播放信息窗口的动画

  • 当使用Bitmap类型时,InfoWindow的动画由引擎内部支持,仅支持有限的几种动画类型,比如:渐变、缩放、平移、旋转。
  • 当使用View类型时,InfoWindow的动画由View系统支持,可由开发者自定义处理。

开启多窗口模式

  • 默认情况下,多窗口模式是关闭的,不能在地图上显示多个信息窗口。
  • 通过TencentMap.enableMultipleInfowindow(boolean)接口来开启和关闭多窗口模式。
  • 开启多窗口模式之后,在多个Marker上点击,都能正常显示信息窗口。

相关类和接口

默认样式

MarkerOptions 类

  • getter
类型方法说明
booleanisInfoWindowEnable()获取标注的InfoWindow是否可以弹出气泡
booleanisViewInfowindow()获取此 marker 的 infowindow 是否用 view 实现 infowindow
StringgetSnippet()获取标注的InfoWindow(气泡)的内容
StringgetTitle()获得标注的InfoWindow(气泡)的标题
  • setter
类型方法说明
MarkerOptionsinfoWindowEnable(boolean enabled)设置标注是否可以弹出InfoWindow(气泡)
MarkerOptionsviewInfoWindow(boolean enabled)设置此 marker 的 infowindow 是否用 view 实现 infowindow
MarkerOptionstitle(String s)设置标注的InfoWindow(气泡)的标题,如果设置了 TencentMap.setInfoWindowAdapter(TencentMap.InfoWindowAdapter) 则失效
MarkerOptionssnippet(String snippet)设置标注的InfoWindow(气泡)的内容,如果设置了 TencentMap.setInfoWindowAdapter(TencentMap.InfoWindowAdapter) 则失效
MarkerOptionsinfoWindowAnchor(float u, float v)设置infowindow anchor point
MarkerOptionsinfoWindowOffset(int offsetX, int offsetY)设置InfoWindow的偏移,在基准(InfoWindow在Marker正上方中间处显示 —— 默认位置)上偏移 方向:向右,向下为正方向,向左,向上为负方向
MarkerOptionsinfoWindowCollisionBy(MarkerCollisionItem… infoWindowCollisions)设置InfoWindow 可被碰撞的类型,默认无碰撞关系

Marker 类

  • getter
类型方法说明
booleanisInfoWindowEnable()获取标注的InfoWindow是否可以弹出气泡
StringgetSnippet()获取标注的InfoWindow(气泡)的内容
StringgetTitle()获得标注的InfoWindow(气泡)的标题
  • setter
类型方法说明
voidsetSnippet(String snippet)设置标注的InfoWindow(气泡)的内容,如果设置了 TencentMap.setInfoWindowAdapter(TencentMap.InfoWindowAdapter) 则失效
voidsetTitle(String s)设置标注的InfoWindow(气泡)的标题,如果设置了 TencentMap.setInfoWindowAdapter(TencentMap.InfoWindowAdapter) 则失效
voidsetInfoWindowEnable(boolean enabled)设置标注是否可以弹出InfoWindow(气泡)
voidsetInfoWindowAnchor(float anchorU, float anchorV)设置 infowindow 的锚点,默认 (0.5f, 1)
voidsetInfoWindowOffset(int offsetX, int offsetY)设置 infowindow 坐标偏移
  • 显示,隐藏和更新InfoWindow
类型方法说明
booleanisInfoWindowShown()获取让标注InfoWindow(气泡)是否正在显示
voidshowInfoWindow()让标注显示InfoWindow(气泡)
voidhideInfoWindow()让标注隐藏InfoWindow(气泡)
voidrefreshInfoWindow()更新infowindow

TencentMap类

类型方法说明
voidenableMultipleInfowindow(boolean enable)设置地图是否允许多InfoWindow模式,默认是false(只允许显示一个InfoWindow) 注意:此方法需要在addMarker之前调用。
voidsetOnTapMapViewInfoWindowHidden(boolean enable)点击地图其他区域时,InfoWindow是否需要隐藏
voidsetOnInfoWindowClickListener(TencentMap.OnInfoWindowClickListener listener)设置Marker气泡点击事件监听接口

TencentMap.OnInfoWindowClickListener 接口类

/**
 * 当 Marker 气泡窗口被点击时的回调
 */
public interface OnInfoWindowClickListener {
    /**
     * InfoWindow被点击时回调函数
     * @param Marker 被点击的InfoWindow所属的 Marker
     */
    void onInfoWindowClick(Marker Marker);

    /**
     * 当InfoWindow点击时,点击点的回调
     * @param windowWidth InfoWindow的宽度
     * @param windowHigh InfoWindow的高度
     * @param x 点击点在InfoWindow的x坐标点
     * @param y 点击点在InfoWindow的y坐标点
     */
    void onInfoWindowClickLocation(int windowWidth, int windowHigh, int x, int y);
}

自定义样式

TencentMap 类

类型方法说明
voidsetInfoWindowAdapter(TencentMap.InfoWindowAdapter infoWindowAdapter)设置气泡样式接口

TencentMap.InfoWindowAdapter 接口

类型方法说明
ViewgetInfoContents(Marker marker)自定义气泡的标题和内容
ViewgetInfoWindow(Marker marker)自定义整个气泡的InfoWindow
/**
 * 自定义 Marker气泡样式接口
 */
public interface InfoWindowAdapter {
    /**
     * 自定义整个气泡的InfoWindow
     * @param Marker 当前要弹出InfoWindow的 Marker
     *               每个 marker 应返回自己的 view,不同 marker 在使用相同的 view 时会报错
     * @return View
     */
    View getInfoWindow(Marker Marker);

    /**
     * 自定义气泡的标题和内容
     * @param Marker 当前要弹出InfoWindow的 Marker
     *               每个 marker 应返回自己的 view,不同 marker 在使用相同的 view 时会报错
     * @return View
     */
    View getInfoContents(Marker Marker);
}

示例

界面布局

在这里插入图片描述

  • 布局文件
<?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="MapInfoWindowActivity">

    <com.tencent.tencentmap.mapsdk.maps.TextureMapView
        android:id="@+id/mapview"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintBottom_toTopOf="@id/bottomView"
        app:layout_constraintTop_toTopOf="parent" />

    <androidx.appcompat.widget.LinearLayoutCompat
        android:id="@+id/bottomView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toBottomOf="@id/mapview">

        <RadioGroup
            android:id="@+id/RadioGroup"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@android:color/background_dark"
            android:gravity="center_horizontal"
            android:orientation="horizontal"
            android:paddingHorizontal="10dp">

            <RadioButton
                android:id="@+id/simple_mode"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:checked="true"
                android:onClick="setMarkerFlag"
                android:text="简单"
                android:textColor="@color/white"
                android:textStyle="bold" />

            <RadioButton
                android:id="@+id/adapter_window_mode"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1.5"
                android:onClick="setMarkerFlag"
                android:text="适配器(窗口)"
                android:textColor="@color/white"
                android:textStyle="bold" />

            <RadioButton
                android:id="@+id/adapter_content_mode"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1.5"
                android:onClick="setMarkerFlag"
                android:text="适配器(内容)"
                android:textColor="@color/white"
                android:textStyle="bold" />
        </RadioGroup>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|center"
            android:background="@android:color/background_dark"
            android:orientation="horizontal"
            android:paddingHorizontal="10dp">

            <CheckBox
                android:id="@+id/multiple_info_window"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="setMultipleInfoWindow"
                android:text="多窗口"
                android:textColor="@color/white"
                android:textStyle="bold" />

            <RadioGroup
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@android:color/background_dark"
                android:gravity="center_horizontal"
                android:orientation="horizontal"
                android:paddingHorizontal="10dp">

                <RadioButton
                    android:id="@+id/viewType"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:checked="false"
                    android:onClick="setInfoWindowType"
                    android:text="View类型"
                    android:textColor="@color/white"
                    android:textStyle="bold" />

                <RadioButton
                    android:id="@+id/bitmapType"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:checked="true"
                    android:onClick="setInfoWindowType"
                    android:text="Bitmap类型"
                    android:textColor="@color/white"
                    android:textStyle="bold" />

            </RadioGroup>
        </LinearLayout>
    </androidx.appcompat.widget.LinearLayoutCompat>
</androidx.constraintlayout.widget.ConstraintLayout>

MapInfoWindow类

  • 以下是MapInfoWIndows部分代码

常量

public static final String SIMPlE_MODE = "Simple";
public static final String ADAPTER_WINDOW_MODE = "AdapterWindowMode";
public static final String ADAPTER_CONTENT_MODE = "AdapterContentMode";

public static final String VIEW_TYPE = "ViewType";
public static final String BITMAP_TYPE = "BitmapType";

成员变量

// 覆盖物列表
List<Removable> overlays = new ArrayList<>();

// 选中的状态
String selectedMode = SIMPlE_MODE;
String selectedType = BITMAP_TYPE;

初始化

initEvent();
// 点击地图其他区域时,InfoWindow是否需要隐藏
map.setOnTapMapViewInfoWindowHidden(true);
private void initEvent() {
    map.setOnInfoWindowClickListener(new TencentMap.OnInfoWindowClickListener() {
        @Override
        public void onInfoWindowClick(Marker marker) {
            showToast("单击InfoWindow");
            // InfoWindow被点击时回调函数
            // marker.hideInfoWindow();
        }

        @Override
        public void onInfoWindowClickLocation(int windowWidth, int windowHigh, int x, int y) {
            // 当InfoWindow点击时,点击点的回调
        }
    });
}

创建与移除覆盖物

  • 创建覆盖物是设置InfoWindow是否用View实现
public void addMarkers() {
    List<LatLng> points = new ArrayList<>();
    points.add(new LatLng(39.97923, 116.357428));
    points.add(new LatLng(39.94923, 116.397428));
    points.add(new LatLng(39.97923, 116.437428));
    points.add(new LatLng(39.92353, 116.490705));
    points.add(new LatLng(40.023537, 116.289429));
    points.add(new LatLng(40.022211, 116.406137));

    // 设置此marker的InfoWindow是否用View实现
    boolean isView = VIEW_TYPE.equals(selectedType);

    int[] icons = BubbleIcons.Number;
    for (int i = 0; i < points.size(); ++i) {
        // 构建Marker图标
        BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(icons[i]);
        // 构建MarkerOption,用于在地图上添加Marker
        MarkerOptions option = new MarkerOptions(points.get(i))
                .icon(bitmap)
                .title("标题" + (i + 1))
                .snippet("详细信息" + (i + 1))
                .viewInfoWindow(isView);

        // 在地图上添加Marker,并显示
        Marker marker = map.addMarker(option);
        overlays.add(marker);
    }
}

public void removeOverlay() {
    // 清除地图上所有的标注类(Marker、Polyline、Polygon,TileOverlay除外)
    // map.clearAllOverlays();

    // 从地图移除覆盖物
    for (Removable overlay : overlays) {
        if (overlay instanceof Marker) {
            Marker marker = (Marker) overlay;
            marker.hideInfoWindow();
        }
        if (!overlay.isRemoved())
            overlay.remove();
    }
    overlays.clear();
}

设置属性

public void enableMultipleInfoWindow(boolean enable) {
    // 设置地图是否允许多InfoWindow模式
    map.enableMultipleInfowindow(enable);
}

public void setSelectedMode(String flag) {
    selectedMode = flag;

    for (Removable overlay : overlays) {
        if (overlay instanceof Marker) {
            Marker marker = (Marker) overlay;
            // 让标注隐藏InfoWindow(气泡)
            marker.hideInfoWindow();
        }
    }

    switch (selectedMode) {
    case SIMPlE_MODE:
        map.setInfoWindowAdapter(null);
        break;
    case ADAPTER_WINDOW_MODE:
        map.setInfoWindowAdapter(new WindowModeAdapter());
        break;
    case ADAPTER_CONTENT_MODE:
        map.setInfoWindowAdapter(new ContentModeAdapter());
        break;
    }
}

public void setSelectedType(String flag) {
    selectedType = flag;

    removeOverlay();
    addMarkers();
}

自定义样式

  • 自定义布局custom_infowindow.xml
<?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:background="@color/colorLightBlue"> <!--背景资源可以自己设置-->

    <!--用于展示自定义信息窗的内容-->
    <TextView
        android:id="@+id/tv_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:gravity="start|center"
        android:textColor="@color/black"
        android:textSize="18sp" />

</LinearLayout>
  • WindowModeAdapterContentModeAdapter
private class WindowModeAdapter implements TencentMap.InfoWindowAdapter {
    @Override
    public View getInfoWindow(Marker marker) {
        return createCustomInfoView(marker);
    }

    @Override
    public View getInfoContents(Marker marker) {
        return null;
    }
}

private class ContentModeAdapter implements TencentMap.InfoWindowAdapter {
    @Override
    public View getInfoWindow(Marker marker) {
        return null;
    }

    @Override
    public View getInfoContents(Marker marker) {
        return createCustomInfoView(marker);
    }
}

private View createCustomInfoView(Marker marker) {
    View view = LayoutInflater.from(context).inflate(R.layout.custom_infowindow, null);
    TextView tvTitle = view.findViewById(R.id.tv_title);
    // 设置自定义信息窗的内容
    tvTitle.append(marker.getTitle() + "\n" + marker.getSnippet());
    return view;
}

加载与移除地图

public void onMapLoaded() {
    addMarkers();
}

public void onMapDestroy() {
    removeOverlay();
}

MapInfoWindowActivity 类

  • 以下是MapInfoWindowActivity类部分代码

控件响应事件

  • 设置简单模式,窗口模式和内容模式
public void setMarkerFlag(View view) {
    boolean checked = ((RadioButton) view).isChecked();
    if (!checked)
        return;

    int id = view.getId();
    String flag;
    if (id == R.id.simple_mode)
        flag = mapInfoWindow.SIMPlE_MODE;
    else if (id == R.id.adapter_window_mode)
        flag = mapInfoWindow.ADAPTER_WINDOW_MODE;
    else if (id == R.id.adapter_content_mode)
        flag = mapInfoWindow.ADAPTER_CONTENT_MODE;
    else
        return;

    mapInfoWindow.setSelectedMode(flag);
}
  • 设置多窗口
public void setMultipleInfoWindow(View view) {
    boolean checked = ((CheckBox) view).isChecked();

    int id = view.getId();
    if (id == R.id.multiple_info_window) {
        mapInfoWindow.enableMultipleInfoWindow(checked);
    }
}
  • 设置InfoWindow显示方式:View或Bitmap
public void setInfoWindowType(View view) {
    boolean checked = ((RadioButton) view).isChecked();
    if (!checked)
        return;

    int id = view.getId();
    String flag;
    if (id == R.id.viewType)
        flag = mapInfoWindow.VIEW_TYPE;
    else if (id == R.id.bitmapType)
        flag = mapInfoWindow.BITMAP_TYPE;
    else
        return;

    mapInfoWindow.setSelectedType(flag);
}

运行效果图

简单适配器(窗口)适配器(内容)
在这里插入图片描述在这里插入图片描述在这里插入图片描述
自定义整个气泡的InfoWindow自定义气泡的标题和内容

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

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

相关文章

6.2高斯滤波

目录 实验原理 示例代码1 运行结果1 示例代码2 运行结果2 实验代码3 运行结果3 实验原理 在OpenCV中&#xff0c;高斯滤波&#xff08;Gaussian Filtering&#xff09;是一种非常常用的图像平滑处理方法。它通过使用一个高斯核&#xff08;即高斯分布函数&#xff09;对…

Pr 入门系列之二:导入与管理素材(下)

◆ ◆ ◆ 管理素材 导入素材后&#xff0c;项目面板中每一个媒体都只是原始素材的“链接”。 所以&#xff0c;视频编辑过程中一般情况下都不会破坏原始素材。 1、在不同视图模式下组织素材 项目面板提供了三大视图 View供选用&#xff1a;列表视图、图标视图以及自由格式视图…

基于VAE和流模型的AIGC技术

哇哦&#xff0c;VAE&#xff08;变分自编码器&#xff09;和流模型在AI生成内容&#xff08;AIGC&#xff09;领域可真是大放异彩呢&#xff01;&#x1f680;&#x1f31f; 它们就像魔法师一样&#xff0c;能够创造出各种各样、高质量的数据&#xff0c;从图像到音频&#xf…

计算机网络(三) —— 简单Udp网络程序

目录 一&#xff0c;初始化服务器 1.0 辅助文件 1.1 socket函数 1.2 填充sockaddr结构体 1.3 bind绑定函数 1.4 字符串IP和整数IP的转换 二&#xff0c;运行服务器 2.1 接收 2.2 处理 2.3 返回 三&#xff0c;客户端实现 3.1 UdpClient.cc 实现 3.2 Main.cc 实现 …

MongoDB 5.0版本副本集集群

一、MongoDB 5.0版本副本集集群部署 什么是MongoDB的副本集 MongoDB的副本集&#xff08;Replica Set&#xff09;是一种用于提高数据库系统可用性、可靠性和数据冗余性的机制。副本集包含一组相互连接的MongoDB节点&#xff0c;其中包括一个主节点&#xff08;Primary&#…

基于web的赴台展会人员管理系统设计与实现

博主介绍&#xff1a;专注于Java .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟 我的博客空间发布了1000毕设题目 方便大家学习使用 感兴趣的可以…

VSC++: 括号对称比较

括号的使用规则&#xff1a;大括号&#xff0c;中括号&#xff0c;小括号{[()]}&#xff1b;中括号&#xff0c;小括号[()]&#xff1b;小括号()&#xff1b;大括号、中括号、小括号、中括号、小括号、大括号{[()][()]}&#xff1b;大括号&#xff0c;中括号&#xff0c;小括号…

Reflection 70B:震撼AI行业的开源模型

随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;开源与闭源模型的竞争变得越来越激烈。近日&#xff0c;Reflection 70B模型的发布在AI行业引发了巨大的震动。这款拥有70亿参数的开源模型不仅在多项基准测试中取得了优异成绩&#xff0c;还在很多情况下超越…

无人机之报警器的工作原理

无人机报警器&#xff08;通常指的是无人机上搭载的某种警报系统或装置&#xff0c;用于在特定条件下触发警报&#xff09;的作用原理可能涉及多个方面&#xff0c;但具体到无人机报警器这一组件&#xff0c;其原理往往与无人机的整体安全监控、电池状态监测或任务执行中的特定…

基于Java+SpringBoot+Vue+MySQL的美发管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于SpringBootVue的美发管理系统【附源码文档】、前后端分…

揭秘循环购模式:如何实现消费增值与日常收益

欢迎各位&#xff0c;我是吴军&#xff0c;你们的电商策略顾问。今天&#xff0c;我将向大家介绍一种新颖的商业模式——循环购模式&#xff0c;它如何为商家和消费者创造价值。 你可能会好奇&#xff0c;为何会有“消费1000元&#xff0c;赠送2000元”的优惠&#xff1f;以及…

算法练习小技巧之有序集合--套路详细解析带例题(leetcode)

前言: 本文详细讲解Python中的有序集合SortedList和C中的有序集合multiset的用法&#xff0c;配合leetcode的例题来展示实际的用处。(本人水平不够&#xff0c;还无法讲解有序集合的实现方法&#xff0c;只会用) 觉得有帮助或者写的不错可以点个赞&#xff0c;后面也有几道我找…

[数据集][目标检测]抽烟检测数据集VOC+YOLO格式22559张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;22559 标注数量(xml文件个数)&#xff1a;22559 标注数量(txt文件个数)&#xff1a;22559 标…

本机ip地址怎么看是不是公网

在数字化时代&#xff0c;‌了解自己的网络连接属性&#xff0c;‌尤其是本机IP地址是否为公网IP&#xff0c;‌对于网络安全、‌远程访问、‌在线服务配置等方面都至关重要。‌公网IP&#xff0c;‌即互联网上的唯一地址&#xff0c;‌能让任何连接互联网的设备访问到你的设备…

java框架第五课(终极版本)SpringBoot

一.关于SpringBoot (1)回忆Spring 传统的Spring由Spring 框架(ioc,aop)加mybatis加Springweb组成&#xff0c;虽然相比原生的java程序Spring框架帮我们大大减少了代码量&#xff0c;减少了冗余&#xff0c;提高了开发效率但是由于Spring框架下的配置和相关的jar包依赖过多&am…

图像去噪:使用DAMRmF算法

在数字图像处理领域&#xff0c;噪声是不可避免的&#xff0c;它会影响图像的质量和可读性。为了提高图像的质量&#xff0c;去噪算法是必不可少的工具。在这篇文章中&#xff0c;我们将介绍一种名为DAMRmF的去噪算法&#xff0c;并展示如何使用MATLAB实现和应用它。 一、什么…

1-8 图像腐蚀 opencv树莓派4B 入门系列笔记

目录 一、提前准备 二、代码详解 kernelnp.ones((2,2),np.uint8) _, binary_image cv2.threshold(image, 127, 255, cv2.THRESH_BINARY) eroded_imagecv2.erode(binary_image,kernel,iterations1) eroded_image2cv2.erode(image2,kernel,iterations1) 三、运行现象 四…

如何处理忘记实现接口所有方法

在Java编程中&#xff0c;当你声明一个类实现了某个接口时&#xff0c;但没有实现接口中的所有方法&#xff0c;编译器会报错。这是因为接口规定了必须由实现类提供的功能&#xff0c;任何没有实现的接口方法&#xff0c;都会被认为是实现不完整的&#xff0c;导致编译失败。 …

[含视频和源码]CRUD的最佳实践,联动前后端,包含微信小程序,API,HTML等(三)

关说不练假把式&#xff0c;在上一&#xff0c;二篇中介绍了我心目中的CRUD的样子 基于之前的理念&#xff0c;我开发了一个命名为PasteTemplate的项目&#xff0c;这个项目呢后续会转化成项目模板&#xff0c;转化成项目模板后&#xff0c;后续需要开发新的项目就可以基于这…

【时时三省】(C语言基础)指针进阶 例题3

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 例题&#xff1a; 这个arr里面是放了&#xff3b;a b c d e f \0&#xff3d; 第一个arr 这个sizeof是计算这个数组的大小 这个里面加上\0一共是7个元素 所以打印7 第二个arr0 这个指数组…