map-box地图点击图标高亮事件

npm install --save mapbox-gl

<template>
  <div id="map-box"></div>
</template>

<script>
import mapboxgl from 'mapbox-gl' // 引入map-box
const loadId = 'map-box' // 唯一的id
const IMAGES = { // 这些都是地图大点图标,直接引入自己喜欢的图标就行
  [loadId + 'parking']: require('./img/illegal_parking.png'),
  [loadId + 'parking-selected']: require('./img/illegal_parking-selected.png'),
  [loadId + 'personnel']: require('./img/personnel_aggregation_density.png'),
  [loadId + 'personnel-selected']: require('./img/personnel_aggregation_density-selected.png'),
  [loadId + 'pedlar']: require('./img/coord-pedlar.png'),
  [loadId + 'pedlar-selected']: require('./img/coord-pedlar-selected.png'),
  [loadId + 'roadside']: require('./img/roadside_booths.png'),
  [loadId + 'roadside-selected']: require('./img/roadside_booths-selected.png')
}
const data = {  // 模拟的点位假数据
  'type': 'FeatureCollection',
  'features': [
    {
      "id": 167932,
      "type": "Feature",
      'properties': {
        'event_subtype_code': '0405',
        'selected':0
      },
      "geometry": {
        "type": "Point",
        "coordinates": [
          104.9093974867,
          31.1110811505
        ],
      }
    },
    {
      "id": 167931,
      "type": "Feature",
      'properties': {
        'event_subtype_code': '0406',
        'selected':0
      },
      "geometry": {
        "type": "Point",
        "coordinates": [
          104.5093984867,
          31.3110841505
        ],
      }
    },
    {
      "id": 167847,
      "type": "Feature",
      'properties': {
        'event_subtype_code': '0407',
        'selected':0
      },
      "geometry": {
        "type": "Point",
        "coordinates": [
          104.5995422476,
          31.1364776882
        ],
      }
    },

    {
      "id": 167763,
      "type": "Feature",
      'properties': {
        'event_subtype_code': '0408',
        'selected':1
      },
      "geometry": {
        "type": "Point",
        "coordinates": [
          104.3715422674,
          31.1384774881
        ],
      }
    }
  ]
}
export default {
  data() {
    return {
      map: null
    }
  },
  mounted() {
    this.mapBox()
  },
  methods: {
    onMapClick(map) { // 点击地图图标事件(打印map看不到features属性) map.features 
      console.log(map.features[0]);
      const projection=map.features[0].properties
      data.features.forEach(item=>{
        item.properties.selected=0
        if (projection.event_subtype_code===item.properties.event_subtype_code) {
          item.properties.selected=1
        }
      })
      this.map&&this.map.getSource(loadId).setData(data) // 重新放回addSource里面
    },
    mapBox() {
      // map-box秘钥token
      mapboxgl.accessToken = 'pk.eyJ1Ijoiemhhb3h1eHUiLCJhIjoiY2w3azVnbGx3MGdlaTNxb2JhdTR4NHpwZiJ9.yM69RYEDfy5o5u0b9Lb_nw';
      const map = new mapboxgl.Map({
        container: loadId, // ID
        style: {
          version: 8,
          sources: {
            'gd-satellite': {
              type: 'raster',
              tiles: [
                // 高德地图 卫星影像
                'http://ak.dynamic.t0.tiles.virtualearth.net/comp/ch/{quadkey}?mkt=zh-CN&it=A,G,L&og=819&n=z',
              ],
              tileSize: 206, // 文字大小
            },
          },
          layers: [
            {
              id: 'gd-satellite',
              type: 'raster',
              source: 'gd-satellite', // 对应sources里的属性
              layout: {
                visibility: 'visible', // 显示地图  隐藏地图none
              },
              minzoom: 0,
              maxzoom: 20,
            },
          ],
        },
        center: [104.3995192745, 31.1364077264], // 中线点
        zoom: 10,  // 视角远近
        projection: 'globe' 
      });
      this.map = map
      map.on('load', () => {
        map.addSource(loadId, {
          "type": "geojson",
          "data": data  // 初始展示的图标数据
        });
        if (!map.hasImage(loadId)) {
          Object.keys(IMAGES).forEach((key) => {
            map.loadImage(IMAGES[key], function (error, image) { // 放入图片以及每种图片唯一key
              if (error) throw error
              map.addImage(key, image)
            })
          })
        }
        map.addLayer({  // 图标添加到视图上
          id: loadId,
          type: 'symbol',
          source: loadId,  
          layout: { // 图标点击高亮显示
            'icon-anchor': 'bottom',
            'icon-image': [ // 图标对应的data中的属性
              'case',
              ['all', ['==', ['get', 'selected'], 1], ['==', ['get', 'event_subtype_code'], '0405']], loadId + 'parking-selected',
              ['all', ['==', ['get', 'selected'], 1], ['==', ['get', 'event_subtype_code'], '0406']], loadId + 'personnel-selected',
              ['all', ['==', ['get', 'selected'], 1], ['==', ['get', 'event_subtype_code'], '0407']], loadId + 'pedlar-selected',
              ['all', ['==', ['get', 'selected'], 1], ['==', ['get', 'event_subtype_code'], '0408']], loadId + 'roadside-selected',
              ['==', ['get', 'event_subtype_code'], '0405'], loadId + 'parking',
              ['==', ['get', 'event_subtype_code'], '0406'], loadId + 'personnel',
              ['==', ['get', 'event_subtype_code'], '0407'], loadId + 'pedlar',
              loadId + 'roadside'],
            'icon-offset': [-8, -8],
            visibility: 'visible'
          }
        });
        map.on('click', loadId, this.onMapClick) // 点击事件
        setTimeout(() => {
          //判断存在才移除
          //图层Id
          // if (map.getLayer(loadId)) {
          //   map.removeLayer(loadId);
          // }
          // //图片Id
          // if (map.hasImage(loadId)) {
          //   map.removeImage(loadId);
          // }

          // if (map.getSource(loadId)) {
          //   map.removeSource(loadId);
          // }

        }, 5000)
      })
    }
  }
}
</script>

<style>
#map-box {
  width: 100%;
  height: 100%;
}
</style>

出图效果

 

<think>好的,用户之前问过关于company插件的问题,现在他们想详细了解如何为Emacs配置代码提示和补全,特别是针对新手。首先,我需要回忆之前提供的company插件的信息,确保这次回答与之前的内容一致,但这次要更详细地指导配置步骤。 用户是新手,可能需要从安装开始讲起,所以步骤要分清楚,可能包括安装、基本配置、语言特定配置、优化调整、常见问题解决等。需要确保每个步骤都有具体的代码示例,并且解释清楚每部分的作用,这样新手能理解为什么要这样做。 另外,用户可能使用不同的编程语言,所以需要覆盖常见的几种,比如Python、JavaScript、C/C++,可能需要提到lsp-mode和对应的语言服务器。还要注意可能遇到的依赖问题,比如需要安装语言服务器,或者需要配置路径等。 还要考虑用户可能遇到的常见问题,比如补全不触发、延迟问题、后端冲突等,给出解决方案。需要提醒用户遇到问题时检查哪些配置,或者如何调试。 同时,要确保使用中文,并且按照之前的格式要求,行内公式用$...$,独立公式用$$...$$,虽然在这个配置指南中可能用不到太多数学公式,但如果有性能相关的部分,可能需要用到。另外,代码块要用正确的语法高亮,比如elisp、shell等。 需要检查是否有遗漏的部分,比如全局启用company-mode,设置快捷键,调整补全延迟时间,以及如何添加自定义后端。还要提到如何与其它插件配合使用,比如lsp-mode、yasnippet等,增强补全功能。 最后,确保结构清晰,分步骤讲解,每个部分有标题,代码示例正确,语言通俗易懂,避免专业术语过多,或者在必要时解释术语。可能还需要推荐一些额外的插件或配置,帮助用户进一步提升体验,比如company-box美化补全界面,或者company-quickhelp显示文档。 总之,整个思考过程需要围绕如何让新手一步步配置成功,避免出现问题,同时提供足够的细节和解释,确保用户能够理解和应用。</think>以下是为Emacs新手配置代码提示/补全的详细指南(以最新LSP工作流为基础),包含关键配置步骤和优化技巧: --- ### 一、基础框架安装 #### 1. 包管理器初始化 ```elisp ;; 在~/.emacs.d/init.el中添加 (require 'package) (add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/")) (package-initialize) ``` #### 2. 安装核心组件 ```shell # 在终端执行 emacs --batch --eval "(package-refresh-contents)" emacs --batch --eval "(package-install 'company)" # 补全框架 emacs --batch --eval "(package-install 'lsp-mode)" # 语言服务器协议 emacs --batch --eval "(package-install 'yasnippet)" # 代码片段 ``` --- ### 二、基础配置(逐条解析) #### 1. 全局补全设置 ```elisp ;; 启用公司模式 (global-company-mode 1) ;; 响应速度优化(单位:秒) (setq company-idle-delay 0.2 ; 输入后触发延迟 company-minimum-prefix-length 1) ; 输入1字符即触发 ;; 可视化设置 (setq company-tooltip-limit 10 ; 最多显示10条候选 company-show-quick-access t ; 显示快捷数字键 company-frontends '(company-pseudo-tooltip-frontend)) ; 现代悬浮样式 ``` #### 2. 快捷键绑定 ```elisp ;; 使用TAB键循环选择候选 (define-key company-active-map (kbd "<tab>") 'company-complete-selection) ;; 使用C-n/C-p导航 (define-key company-active-map (kbd "C-n") 'company-select-next) (define-key company-active-map (kbd "C-p") 'company-select-previous) ``` --- ### 三、语言专项配置 #### 1. Python开发 ```elisp ;; 安装依赖 (package-install 'python-mode) (package-install 'lsp-pyright) ;; 配置LSP (with-eval-after-load 'lsp-mode (require 'lsp-pyright) (add-hook 'python-mode-hook #'lsp-deferred)) ;; 设置虚拟环境路径(示例) (setenv "WORKON_HOME" "~/anaconda3/envs/") ``` #### 2. JavaScript/TypeScript ```elisp (package-install 'typescript-mode) (package-install 'lsp-tsserver) ;; 配置Node路径(根据实际安装位置调整) (setq lsp-clients-typescript-server "~/node_modules/.bin/typescript-language-server") ``` #### 3. C/C++ ```elisp (package-install 'ccls) # 需要预先安装ccls二进制 (setq ccls-executable "/usr/local/bin/ccls") (add-hook 'c-mode-hook #'lsp-deferred) (add-hook 'c++-mode-hook #'lsp-deferred) ``` --- ### 四、进阶优化 #### 1. 混合补全策略 ```elisp ;; 后端优先级设置(示例) (setq company-backends '(company-capf ; LSP补全 company-files ; 文件路径 company-keywords ; 语言关键字 company-yasnippet ; 代码片段 company-dabbrev-code)) ; 基于上下文的猜测 ``` #### 2. 性能调优公式 $$ \text{响应时间} = \frac{\text{候选数}}{\text{后端数量}} \times k + c $$ ```elisp ;; 限制并行后端数量 (setq company-async-redisplay-delay 0.01 company-async-redisplay-count 20) ``` #### 3. 主题美化 ```elisp (package-install 'company-box) ; 现代图标化界面 (require 'company-box) (company-box-mode 1) ``` --- ### 五、验证配置 1. **基础测试**:新建test.py文件,输入`im`应提示`import` 2. **LSP验证**:在C++文件中输入`std::`应显示STL函数列表 3. **片段测试**:输入`for`后按TAB应展开完整循环结构 --- ### 六、常见问题解决 | 现象 | 解决方案 | |---------------------|----------------------------| | 补全菜单不弹出 | 检查`company-minimum-prefix-length`值 | | LSP无响应 | 运行`M-x lsp-restart-workspace` | | 候选列表闪烁 | 降低`company-async-redisplay-delay` | | 特定语言无补全 | 确认对应语言的LSP服务器已安装 | --- ### 七、推荐扩展 1. `company-quickhelp` - 悬浮显示文档 2. `company-statistics` - 学习你的补全习惯 3. `company-math` - LaTeX符号补全 通过以上配置,可获得类似VSCode的现代化智能补全体验。建议逐步调整参数(如延迟时间、候选数量)以适应个人编码节奏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值