vue 借助vue-amap插件对高德地图的简单使用

需求:实现点击获取经纬度、定位、对特殊位置标点及自定义信息窗体功能。

高德地图的官网API:概述-地图 JS API 1.4 | 高德地图API

vue-amap的中文文档:组件 | vue-amap

实现: 

1、安装vue-amap插件

npm install vue-amap --save

2、项目引入

在main.js中引入

需要提前申请高德key,步骤附在最后了

// 高德地图配置
import VueAMap from 'vue-amap' // 引入插件
Vue.use(VueAMap) // 使用插件
VueAMap.initAMapApiLoader({ // 初始化插件
  key: '高德申请的key', // 高德key
  plugin: ['AMap.Geocoder', 'AMap.PlaceSearch', 'AMap.Geolocation', 'AMap.CitySearch'], // 插件集合,根据自己的需求添加
  uiVersion: '1.0.11', // 不加会报错,加上吧
  v: '1.4.15' // 默认高德 sdk 版本为 1.4.4
})
// 申请的Web端(JS API)的需要写上下面这段话
window._AMapSecurityConfig = {
  securityJsCode: '高德申请的kedy对应的安全密钥' // 高德Web端安全密钥
}

3、新建一个Map.vue文件

这里直接放我封装的组件

<template>
  <div class="Map">
    <!-- 地图组件 -->
    <el-amap
      vid="amapContainer"
      class="amapClass"
      :zoom="zoom"
      :plugin="plugin"
      :center="center"
      :events="events"
    >
      <!-- 这里用于点击时的标点 -->
      <el-amap-marker
        v-for="(marker, index) in markers"
        :key="index + '1'"
        :position="marker"
      />
      <!-- 这里用于特殊位置的标点 -->
      <el-amap-marker
        v-for="(marker, index) in markerList"
        :key="index + '2'"
        :position="marker.lnglats"
        :icon="getIcon(marker)"
        :events="marker.events"
        :offset="[-24, -24]"
      />
      <!-- 信息窗体 -->
      <el-amap-info-window
        v-if="currentWindow.visible"
        :position="currentWindow.position"
        :visible.sync="currentWindow.visible"
        :content="currentWindow.content"
        :close-when-click-map="false"
        :events="currentWindow.events"
        :offset="[0, -24]"
      />
    </el-amap>
  </div>
</template>

<script>

import LED0 from '@/assets/imgs/LED-0.png'
import LED1 from '@/assets/imgs/LED-1.png'
import lamppost0 from '@/assets/imgs/lamppost-0.png'
import lamppost1 from '@/assets/imgs/lamppost-1.png'
import tourGuide0 from '@/assets/imgs/tourGuide-0.png'
import tourGuide1 from '@/assets/imgs/tourGuide-1.png'
export default {
  name: 'Map',
  props: {
    zoom: { // 地图缩放比例。zoom值越小,越宏观、越大,越微观。
      type: Number,
      default: 14
    },
    center: {
      type: Array,
      default: () => [120.147076, 30.245426] // 西湖风景区的经纬度
    },
    markers: {
      type: Array,
      default: () => []
    },
    markerList: {
      type: Array,
      default: () => []
    },
    currentWindow: {
      type: Object,
      default: () => ({
        position: [],
        visible: false,
        content: '测试'
      })
    }
  },
  data() {
    const self = this
    return {
      LED0,
      LED1,
      lamppost0,
      lamppost1,
      tourGuide0,
      tourGuide1,
      address: null,
      loaded: false,
      events: {
        init(o) {
          console.log('地图初始化', o)
          // ... 初始地图的一些操作
        },
        complete(){
          // ... 地图渲染完成后的一些操作
        }
        // 点击地图
        click: self.click
      },
      // 一些工具插件
      plugin: [
        {
          pName: 'Geocoder',
          events: {
            init(o) {
              console.log('Geocoder', o.getAddress())
            }
          }
        },
        {
          // 定位
          pName: 'Geolocation',
          events: {
            init(o) {
              // o是高德地图定位插件实例
              o.getCurrentPosition((status, result) => {
                // 会存在失败的时候,官网回答:https://lbs.amap.com/faq/js-api/map-js-api/position-related/43361/
                console.log('查询成功定位信息', status, result)
                if (result && result.position) {
                  // 根据经纬度设置坐标 --不想替换掉默认的center的可以先注释
                  self.$emit('update:center', [result.position.lng, result.position.lat])
                  // self.$emit('update:markers', [[result.position.lng, result.position.lat]])
                  // load
                  self.loaded = true
                  // 页面渲染好后
                  self.$nextTick()
                }
              })
            }
          }
        },
        {
          // 搜索 --我这里没用到
          pName: 'PlaceSearch',
          events: {
            init(instance) {
              console.log('搜索', instance)
            }
          }
        },
        {
          // 定位城市
          pName: 'CitySearch',
          events: {
            init(o) {
              // o是高德地图定位插件实例
              o.getLocalCity(function(status, result) {
                if (status === 'complete' && result.info === 'OK') {
                  // 查询成功,result即为当前所在城市信息
                  console.log('查询成功,当前所在城市信息', result)
                }
              })
            }
          }
        }
      ]
    }
  },
  methods: {
    // 点击地图获取经纬度和具体位置
    click(e) {
      const { lng, lat } = e.lnglat
      this.$emit('update:center', [lng, lat])
      this.$emit('update:markers', [[lng, lat]])
      console.log('[lng, lat]', [lng, lat])

      // 这里通过高德 SDK 完成。获取具体地址的
      const geocoder = new AMap.Geocoder({
        radius: 1000,
        extensions: 'all'
      })
      const that = this
      geocoder.getAddress([lng, lat], function(status, result) {
        if (status === 'complete' && result.info === 'OK') {
          if (result && result.regeocode) {
            that.address = result.regeocode.formattedAddress
            console.log('具体位置:', result.regeocode.formattedAddress)
            that.$nextTick()
          }
        }
        that.$emit('getLocation', { lng, lat, address: that.address })
      })
    },
    getIcon(item) {
      if (item.mediaTypeName === '灯杆屏') {
        return item.status ? this.lamppost0 : this.lamppost1
      } else if (item.mediaTypeName === '导览屏') {
        return item.status ? this.tourGuide0 : this.tourGuide1
      } else return item.status ? this.LED0 : this.LED1
    }
  }
}
</script>
<style lang="scss" scoped>
/* 指定地图的宽高 */
.amapClass, .Map {
  width: 100%;
  height: 100%;
}
</style>
 关于el-amap-marker的属性:

1、position:为marker点的坐标(经纬度),接收数组

2、icon:自定义图标地址

3、events:事件集合对象,click、dblclick、rightclick、mouseover、mouseout等

events: {
    click: (e) => {
        // ...点击操作
    },
    dblclick: (e) => {
        // ...双击操作
    },
    ...
}

4、offset:偏移量

其他我没用到的还有:

5、clickable:true允许用户可点击marker点(默认也是true)

6、animation:marker点的动画效果

      marker点弹跳效果:设置值为 AMAP_ANIMATION_BOUNCE

7、label:点显示的简略信息

8、content可以是文字字符串也可以是html

关于el-amap-info-window信息窗体的属性

静态属性

名称类型说明
vidString组件的ID。
isCustomBoolean是否自定义窗体。设为true时,信息窗体外框及内容完全按照content所设的值添加(默认为false,即在系统默认的信息窗体外框中显示content内容)
autoMoveBoolean是否自动调整窗体到视野内(当信息窗体超出视野范围时,通过该属性设置是否自动平移地图,使信息窗体完全显示)
closeWhenClickMapBoolean控制是否在鼠标点击地图后关闭信息窗体,默认false,鼠标点击地图后不关闭信息窗体
showShadowBooleanBoolean 控制是否显示信息窗体阴影,取值false时不显示窗体阴影,取值true时显示窗体阴影默认值:false
offsetArray相对于基点的偏移量。默认情况是信息窗体的底部中心点(BOTTOM_CENTER) 和基点之间的偏移量

动态属性

名称类型说明
contentString/HTML显示内容。支持字符串和HTML。
templateString支持传入 Vue 模板。v0.4.0 开始支持。
vnodeVNode 或 Funtion: (Instance) => VNode支持 VNode 渲染。v0.4.2 开始支持
contentRenderFunction: (createElement: () => VNode, instance) => VNode支持 VNode render 渲染。v0.4.3 开始支持
sizeSize信息窗体尺寸(isCustom为true时,该属性无效)
positionArray信息窗体显示基点位置(自v1.2 新增)
visibleBoolean信息窗体是否显示。这里需要注意的是,高德地图只支持同时一个信息窗体的显示。所以一旦有窗体显示切换的场景,visible数组的状态需要自行维护。

 ref 可用方法

提供无副作用的同步帮助方法

函数返回说明
$$getInstance()AMap.InfoWindow获取infoWindow实例

事件(也是events里的)

事件参数说明
initObject高德组件实例
change属性发生变化时
open信息窗体打开之后触发事件
close信息窗体关闭之后触发事件

 4、使用地图组件

我把使用的页面也全贴上了,但其实search-box里面的东西大家可以忽略,只是针对markerList的查询过滤

<template>
  <div class="box">
    <div class="search-box">
      <el-form ref="queryForm" label-width="auto" class="searchForm" :model="searchForm" style="padding: 16px 0 0;">
        <el-form-item label="类型" prop="mediaType">
          <el-select v-model="searchForm.mediaType">
            <el-option v-for="item in digitalTypeOptions" :key="item.value" :label="item.label" :value="item.value" />
          </el-select>
        </el-form-item>
        <el-form-item label="区域" prop="region">
          <el-select v-model="searchForm.region" clearable>
            <el-option v-for="item in regionOptions" :key="item.value" :label="item.label" :value="item.value" />
          </el-select>
        </el-form-item>
        <el-form-item label-width="20px">
          <el-button v-permission="['ResourceDistribution:query']" class="search-btn" icon="el-icon-search" type="primary" @click="getDetail">
            查询
          </el-button>
          <el-button class="reset-btn" icon="el-icon-refresh-left" @click="resetForm('queryForm')">
            重置
          </el-button>
        </el-form-item>
        <el-form-item label="设备名称" prop="">
          <el-select v-model="searchKey" filterable clearable placeholder="请输入关键字" @change="quickOrientation">
            <el-option v-for="item in markerList" :key="item.mediaCode" :label="item.mediaName" :value="item.mediaCode" />
          </el-select>
          <!-- <el-input id="search" v-model="searchKey" placeholder="请输入设备名称" /> -->
        </el-form-item>
        <el-form-item label-width="20px" style="width: 100px;">
          <el-button v-permission="['ResourceDistribution:query']" class="search-btn" type="primary" @click="quickOrientation">
            快速定位
          </el-button>
        </el-form-item>
      </el-form>
      <div class="rightType">
        <div v-for="item in digitalTypeOptions" :key="item.value" class="iconItem">
          <svg-icon v-if="item.label === '灯杆屏'" icon-class="lamppost" />
          <svg-icon v-else-if="item.label === '导览屏'" icon-class="tourGuide" />
          <svg-icon v-else icon-class="LED" />
          <span>{{ item.label }}</span>
        </div>
      </div>
    </div>
    <div class="rightBottom">
      <span class="successStatus">已启用</span>
      <span class="errorStatus">已禁用</span>
    </div>
    <!-- 地图组件 -->
    <Map
      :center.sync="center"
      :markers.sync="markers"
      :zoom.sync="zoom"
      :marker-list="markerList"
      :current-window="currentWindow"
      @getLocation="getLocation"
    />
  </div>
</template>

<script>
import Map from '@/components/Map'
import { dictList, deviceFilter } from '@/api/resource'
export default {
  name: 'GaodeDituAmap',
  components: { Map },
  data() {
    return {
      searchForm: {
        mediaType: '',
        region: ''
      },
      searchKey: '',
      digitalTypeOptions: [],
      regionOptions: [],
      currentWindow: {
        position: [],
        visible: false,
        content: '',
        events: {}
      },
      markerList: [],
      markers: [],
      center: [121.133858, 30.606042],
      zoom: 14 // 地图缩放比例。zoom值越小,越宏观、越大,越微观。
    }
  },
  mounted() {
    this.getDict()
    this.getDetail()
  },
  methods: {
    // 获取标点信息
    async getDetail() {
      this.currentWindow.visible = false
      const that = this
      const { data } = await deviceFilter(this.searchForm)
      data.forEach(item => {
        item.lnglats = [item.longitude, item.latitude]
        item.events = {
          click(e) {
            console.log('点击标点', e)
            that.center = item.lnglats
            that.currentWindow.content = that.createWinContent(item)
            that.currentWindow.position = item.lnglats
            that.currentWindow.events = {
              close(e) {
                console.log('窗体关闭', e)
                that.currentWindow.visible = false
              }
            }
            that.currentWindow.visible = true
          }
        }
      })
      this.markerList = data
    },
    /**
     * 基础配置信息
     */
    async getDict() {
      const { data: { area, digitalType }} = await dictList('dictNames=area&dictNames=digitalType')
      this.regionOptions = area
      this.digitalTypeOptions = digitalType
    },
    // 重置
    resetForm(formName) {
      this.$refs[formName].resetFields()
      this.zoom = this.$options.data.call(this).zoom
      this.getDetail()
    },
    // 快速定位
    quickOrientation() {
      if (!this.searchKey) {
        this.markers = []
        this.currentWindow.visible = false
        return
      }
      const cur = this.markerList.find(f => f.mediaCode === this.searchKey)
      if (cur) {
        this.center = [cur.longitude, cur.latitude]
        // this.markers = [this.center]
        this.currentWindow.content = this.createWinContent(cur)
        this.currentWindow.position = [cur.longitude, cur.latitude]
        this.currentWindow.visible = true
        this.zoom = 15
      }
    },

    // 获取经纬度及地理位置
    getLocation({ lng, lat, address }) {
      console.log('获取到经纬度和地址啦:', lng, lat, address)
    },
    // 画信息窗
    createWinContent(item) {
      return `
        <div>
          <div style="display: flex;margin-bottom: 12px">
            ${item.src ? `<img src="${item.src}" style="width: 120px;margin-right: 16px;">` : ''}
            <div style="display: flex;flex-direction: column;justify-content: space-around;">
              <strong style="font-size: 18px">${item.mediaName}</strong>
              <div style="margin-top: 6px">
                <span style="font-size: 14px;color: #0082FF;padding: 0px 6px;background: rgba(0,130,255,0.15);border-radius: 4px;">${item.mediaTypeName}</span>
                <span style="font-size: 14px;color: ${!item.status ? '#46A77B' : '#E30000'};padding: 0px 6px;background: ${!item.status ? '#46A77B26' : '#E3000026'};border-radius: 4px;">${!item.status ? '已启用' : '已禁用'}</span>
              </div>
              <div style="margin-top: 8px">
                <i class="el-icon-location" style="color: #0082FF"></i>
                <span style="font-size: 14px;">${item.regionName}</span>
              </div>
            </div>
          </div>
          <div style="font-size: 14px;color: #666666;line-height: 20px;">
            <span>${item.specification},</span>
            <span>${item.supplier},</span>
            <span>${item.supplierContact},</span>
            <span>${item.supplierPhone}</span>
          </div>
        </div>`
    }
  }
}
</script>
<style lang="scss" scoped>
.box {
  width: 100%;
  height: 100%;
  box-sizing: border-box;
  padding: 0px;
  position: relative;

  .search-box {
    position: absolute;
    background-color: #FFFFFF;
    width: calc(100% - 32px);
    top: 16px;
    left: 16px;
    z-index: 999;
    border-radius: 4px;

    .searchForm .el-form-item {
      margin: 0 0px 16px;
    }

    .tip-box {
      width: 100%;
      max-height: 260px;
      position: absolute;
      top: 30px;
      overflow-y: auto;
      background-color: #fff;
    }
    .rightType{
      position: absolute;
      right: 0px;
      bottom: -24px;
      transform: translateY(100%);
      z-index: 999;
      background: #FFFFFF;
      border-radius: 4px;
      padding: 16px;
      display: flex;
      align-items: center;
      flex-direction: column;
      .iconItem{
        font-size: 14px;
        color: #4A4A4A;
        display: flex;
        align-items: center;
        flex-direction: column;
        .svg-icon{
          width: 24px;
          height: 24px;
        }
      }
      .iconItem+.iconItem{
        margin-top: 24px;
      }
    }
  }
  .rightBottom{
    position: absolute;
    right: 16px;
    bottom: 16px;
    z-index: 999;
    padding: 16px;
    font-size: 14px;
    color: #4A4A4A;
    background-color: #FFFFFF;
    border-radius: 4px;
    .successStatus{
      margin-right: 24px;
    }
    .successStatus::before{
      content: '';
      display: inline-block;
      height: 8px;
      width: 8px;
      background-color: #46A77B;
      border-radius: 50%;
      margin-right: 5px;
    }
    .errorStatus::before{
      content: '';
      display: inline-block;
      height: 8px;
      width: 8px;
      background-color: #FF4747;
      border-radius: 50%;
      margin-right: 5px;
    }
  }
}

/* 指定地图的宽高 */
.amapClass {
  width: 100%;
  height: 100%;
}
</style>

成果大致样式如下:

附:高德Key申请

登录后到这个地址:我的应用 | 高德控制台

1、点击添加key

2、根据自己的需求选择服务平台,可以看看对应的“可使用服务” 来决定,我这里选择Web端

 3、提交后就有一条新增的记录,复制放进代码使用就好啦

参考地址:

vue-amap基于vue的高德地图使用_amap vue-CSDN博客

 1.5.1 信息窗体 - vue-amap 中文文档 - 开发文档 - 文江博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI预测福彩3D第20弹【2024年3月28日预测--第4套算法重新开始计算第6次测试】

今天继续对第4套算法进行测试&#xff0c;测试的目的主要是为了记录统计两套方案的稳定性和命中率&#xff0c;昨天的第二套方案已命中。今天是第5次测试&#xff0c;同样测试两个方案。废话不多说&#xff0c;直接上结果。 2024年3月28日福彩3D的七码预测结果如下 …

武忠祥《660题》高效刷题包+资料分享

660题的难度书虽然比较难&#xff0c;对于基础的考察比较深入&#xff0c;所以&#xff0c;有没有一种可能&#xff0c;做题太慢&#xff0c;是因为基础不好导致的&#xff01; 所以再继续做下去&#xff0c;就没有什么意义了&#xff0c;因为这就像是用一把钝刀去砍树&#x…

mybatis搭建开发环境

1.创建maven工程 2.配置pom.xml <!--数据库驱动--> <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version> </dependency> <!--Mybatis--> <depend…

vscode使用sftp上传

1.用vscode打开项目 2.安装一下这个sftp 3.使用快捷键 ctrlshiftP 打开指令窗口&#xff0c;输入 sftp:config&#xff0c;选中回车&#xff0c;在当前目录中会自动生成 .vscode 文件夹及 sftp.json 4.修改sftp.json文件配置&#xff0c;改成以下&#xff08;默认的参数可能上传…

八种顺序读写函数的介绍(fput/getc;fput/gets;fscanf,fprintf;fwrite,fread)

一&#xff1a;读写的含义的解释&#xff1a; 读&#xff08;读出&#xff09;&#xff1a;即从文件里面读出数据----------->和scanf从键盘里面读出数据类似 写&#xff08;写入&#xff09;&#xff1a;即把数据写入文件里面----------->和printf把数据写入到屏幕上类…

【leetcode】双“指针”

标题&#xff1a;【leetcode】双指针 水墨不写bug 我认为 讲清楚为什么要用双指针 比讲怎么用双指针更重要&#xff01; &#xff08;一&#xff09;快乐数 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数…

Unity 窗口化设置

在Unity中要实现窗口化&#xff0c;具体设置如下&#xff1a; 在编辑器中&#xff0c;选择File -> Build Settings。在Player Settings中&#xff0c;找到Resolution and Presentation部分。取消勾选"Fullscreen Mode"&#xff0c;并选择"Windowed"。设…

Linux:Jenkins:参数化版本回滚(6)

上几章我讲到了自动集成和部署 Linux&#xff1a;Jenkins全自动持续集成持续部署&#xff08;4&#xff09;-CSDN博客https://blog.csdn.net/w14768855/article/details/136977106 当我们觉得这个页面不行的时候&#xff0c;需要进行版本回滚&#xff0c;回滚方法我这里准备了…

Linux 反引号、单引号以及双引号的区别

1.单引号—— 单引号中所有的字符包括特殊字符&#xff08;$,,和\&#xff09;都将解释成字符本身而成为普通字符。它不会解析任何变量&#xff0c;元字符&#xff0c;通配符&#xff0c;转义符&#xff0c;只被当作字符串处理。 2.双引号——" 双引号&#xff0c;除了$,…

LangSAM项目优化,将SAM修改为MoblieSAM,提速5~6倍

Language Segment-Anything 是一个开源项目&#xff0c;它结合了实例分割和文本提示的强大功能&#xff0c;为图像中的特定对象生成蒙版。它建立在最近发布的 Meta 模型、segment-anything 和 GroundingDINO 检测模型之上&#xff0c;是一款易于使用且有效的对象检测和图像分割…

定时任务 之 cron 表达式

Cron 表达式产生的背景&#xff1a;在Unix系统中&#xff0c;用户经常需要设置一些周期性被执行的任务&#xff0c;如定期备份文件、发送邮件等。为了满足这种需求&#xff0c;Unix系统提供了crontab命令&#xff0c;允许用户定义任务的时间表&#xff0c;并在指定的时间点自动…

实现实时查询并带有查询结果列表的输入框

这个功能主要是实现了一个可以实时查询结果的搜索框&#xff0c;并具备点击外部关闭搜索结果框体的功能&#xff0c;除了v-show和transition依托于vue实现以外其余功能都基于原生JS实现。 效果图&#xff1a; 该功能的实现主要是很久之前面试被问到过&#xff0c;当时没有做出…

Linux:进程控制

进程创建 进程&#xff1a;内核的相关管理数据结构&#xff08;task_structmm_struct页表&#xff09;代码&#xff08;<-共享&#xff09;和数据(<-写时拷贝) fork函数初识 在 linux 中 fork 函数时非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程…

1992-2022年经过矫正的夜间灯光数据

DMSP/OLS夜间灯光的年份是1992-2013年&#xff0c;NPP/VIIRS夜间灯光的年份是2012-2021&#xff0c;且由于光谱分辨率、空间分辨率、辐射分辨率、产品更新周期等方面的差异&#xff0c;DMSP-OLS和SNPP-VIIRS数据不兼容&#xff0c;也就是说我们无法直接对比分析DMSP-OLS和SNPP-…

Linux常用命令-文件操作

文章目录 ls基本用法常用选项组合选项示例注意事项 cd基本用法示例注意事项 pwd基本用法示例选项总结 cp基本用法常见选项示例注意事项 rm基本用法常见选项示例删除单个文件&#xff1a;交互式删除文件&#xff1a;强制删除文件&#xff1a;递归删除目录&#xff1a;交互式递归…

实验02-1 C#和ASP.NET控件:在Web窗体中输出九九乘法表

【实验内容及要求】 1. 在Web窗体中输出九九乘法表 浏览效果如图2-1所示。 图2-1 在Default.aspx.cs中编写C#代码 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls;public par…

项目四-图书管理系统

1.创建项目 流程与之前的项目一致&#xff0c;不再进行赘述。 2.需求定义 需求: 1. 登录: ⽤⼾输⼊账号,密码完成登录功能 2. 列表展⽰: 展⽰图书 3.前端界面测试 无法启动&#xff01;&#xff01;&#xff01;--->记得加入mysql相关操作记得在yml进行配置 配置后启动…

操作系统系列学习——多级页表与快表

文章目录 前言多级页表与快表 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招&#xff0c;计划学习操作系统并完成6.0S81&#xff0c;加油&#xff01; 本文总结自B站【哈工大】操作系统 李治军&#xff08;全32讲&#xff09; 老师课程讲的非常好&#xff0c;感谢 【哈工…

PythonGUI应用:模拟航空订票小程序

在本教程中&#xff0c;我们将创建一个基本的航空订票管理系统GUI应用&#xff0c;用户可以通过图形界面执行各种操作。我们将使用Python编程语言和Tkinter库来实现此应用。 功能概述&#xff1a; 航班管理&#xff1a; 用户可以添加新的航班&#xff0c;输入航班号、起始地、目…

Convex and Semi-Nonnegative Matrix Factorizations

我们提出了非负矩阵分解&#xff08;NMF&#xff09;主题的几种新变体。考虑形式为X FG^T的因子分解&#xff0c;我们关注的是G被限制为包含非负元素的算法&#xff0c;但允许数据矩阵X具有混合符号&#xff0c;从而扩展了NMF方法的适用范围。我们还考虑了基向量F被约束为数据…