数据可视化:地图使用案例

2023-10-27

推荐技术栈

  • amap + g2/ amap + L7
  • mapbox + deck.gl/echarts.gl

地理相关库

amap
mapbox
Leaflet
Cesium
deck.gl
g2 map类
turfjs

工具

http://geojson.io/#map=2/20.0...
地图选择器

地图3D

https://codepen.io/AlexZ33/pe...
https://codepen.io/AlexZ33/pe...
北京市居住人口3D分布

楼宇

https://codepen.io/AlexZ33/pe...  用css实现太累

城市统计

上海城市统计

图层

Mapv - 地理信息可视化开源库
https://github.com/chengquan2...

高德地图api

百度地图api

http://lbsyun.baidu.com/index...
http://mapv.baidu.com/gallery...
vue-baidu-map

注意
百度地图webapi接口文档
百度地图javascript api文档

使用百度地图的服务,需使用BD09坐标。

若使用非BD09坐标、未经过坐标转换(非BD09转成BD09)直接叠加在地图上,地图展示位置会偏移,因此通过其他坐标(WGS84、GCJ02)调用服务时,需先将其他坐标转换为BD09。

非百度坐标系,如何转换成百度坐标系?
http://lbsyun.baidu.com/index...
http://lbsyun.baidu.com/index...

图吧地图api

Mapbox api

地图API和工具

坐标拾取器械

https://codepen.io/AlexZ33/pe...
另外,百度地图api的开发文档下的工具支持中有很多类似的工具
Vue Baidu Map

地图选择器

GeoJSON

turf.js

坐标系统说明

图片描述
高德地图: GCJ-02 我国地图坐标系统 
百度地图: BD-09 (BD-09II/bd09mc)

  • 普通GPS定位出来的数值都是基于WSG-84坐标系标准,这是世界通用的坐标系。(美国的)
  • GCJ-02和WSG-84之间的坐标系转换算法是保密的。
“中国政府为了国家安全在国内 GPS 定位时人为加入一定偏移”这种说法是不正确的。
应该是“我国所发行的地图类产品强制性加入偏移算法,使原本标准的坐标系统(WSG-84)变为国家保密的自定义坐标系统(GCJ-02)”。

坐标系说明

在进行地图开发过程中,我们一般能接触到以下三种类型的地图坐标系:

1.WGS-84原始坐标系,一般用国际GPS纪录仪记录下来的经纬度,通过GPS定位拿到的原始经纬度,Google和高德地图定位的的经纬度(国外)都是基于WGS-84坐标系的;但是在国内是不允许直接用WGS84坐标系标注的,必须经过加密后才能使用;

2.GCJ-02坐标系,又名“火星坐标系”,是我国国测局独创的坐标体系,由WGS-84加密而成,在国内,必须至少使用GCJ-02坐标系,或者使用在GCJ-02加密后再进行加密的坐标系,如百度坐标系。高德和Google在国内都是使用GCJ-02坐标系,可以说,GCJ-02是国内最广泛使用的坐标系;

3.百度坐标系:bd-09,百度坐标系是在GCJ-02坐标系的基础上再次加密偏移后形成的坐标系,只适用于百度地图。(目前百度API提供了从其它坐标系转换为百度坐标系的API,但却没有从百度坐标系转为其他坐标系的API)

three.js地图

http://blog.csdn.net/u0125393...
Three.js - 用100行javascript代码创建一座城市

G2地图

地图数据

通常情况下,地理数据的可视化会包含多份数据:一份是用于绘制地图的经纬度数据,一份是用户真正想要可视化的用户数据。

  • 实例 中国地图-省市下钻只有经纬度数据,但是特殊的是,这个实例中,我们从amap api获得数据,在左侧绘制地图(其中中国地图直接得到的geoJSON数据,行政区划得到的是TopoJSON数据),在右侧用g2绘制处理行政区划数据(geojson -> json数组 --> dataset) 绘制地图
  • 实例 带气泡的地图 需要在世界地图上标注各个国家的男女比例情况,这个时候就可以使用多视图的可视化方案:详情 戳 --->

地图数据一般保存为JSON格式,G2和D3常用的有两种:

  • GeoJSON 描述地理信息的一种基本格式 例——> world.geo.json
  • TopoJSOND3作者Mike Bostock制定的格式,符合JSON规范

我们以这个g2 中国地图-省市下钻为例
g2/demos/map-drill-down.html

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>中国地图-省市下钻</title>
    <link rel="stylesheet" href="http://cache.amap.com/lbs/static/main1119.css"/>
    <style>
        .button-group{
            position: fixed;
            bottom:50%;
            left: 0px;
            width: 70%;
        }
    </style>
    <script type="text/javascript" src="http://cache.amap.com/lbs/static/addToolbar.js"></script>
</head>
<body>
  <div id="mountNode"></div>
  <div class='button-group' style="background-color: #fff">
      <input type='radio' onclick='refresh(this.value)' checked name='mapStyle' value='normal'>标准
      <input type='radio' onclick='refresh(this.value)' name='mapStyle' value='dark'>幻影黑
      <input type='radio' onclick='refresh(this.value)' name='mapStyle' value='light'>月光银
      <input type='radio' onclick='refresh(this.value)' name='mapStyle' value='fresh'>草色青
      <input type='radio' onclick='refresh(this.value)' name='mapStyle' value='grey'>雅士灰<br>
      <input type='radio' onclick='refresh(this.value)' name='mapStyle' value='graffiti'>涂鸦
      <input type='radio' onclick='refresh(this.value)' name='mapStyle' value='whitesmoke'>远山黛
      <input type='radio' onclick='refresh(this.value)' name='mapStyle' value='macaron'>马卡龙
      <input type='radio' onclick='refresh(this.value)' name='mapStyle' value='blue'>靛青蓝
      <input type='radio' onclick='refresh(this.value)' name='mapStyle' value='darkblue'>极夜蓝<br>
      <input type='radio' onclick='refresh(this.value)' name='mapStyle' value='wine'>酱籽

  </div>
  <script>/*Fixing iframe window.innerHeight 0 issue in Safari*/document.body.clientHeight;</script>
  <script src="https://gw.alipayobjects.com/os/antv/assets/g2/3.0.4-beta.2/g2.min.js"></script>
  <script src="https://gw.alipayobjects.com/os/antv/assets/data-set/0.8.3/data-set.min.js"></script>
  <script src="https://gw.alipayobjects.com/os/antv/assets/lib/jquery-3.2.1.min.js"></script>
  <script src="https://gw.alipayobjects.com/os/antv/assets/lib/lodash-4.17.4.min.js"></script>
  <script src="https://webapi.amap.com/maps?v=1.4.1&key=8c8c021990b332b22254f2f8289a62ef"></script>
  <script src="https://webapi.amap.com/ui/1.0/main.js?v=1.0.11"></script>
  <script>
      $('#mountNode').html(
          '<div style="position:relative;">'+
              '<div id="china" style="width:50%;height:400px;position:absolute;left:0;top:0"></div>' +
              '<div id="province" style="width:50%;height:400px;position:absolute;right:0;top:0;"></div>'+
          '</div>'
      );

      //调用高德api绘制底图以及geo数据

      const map = new AMap.Map('china',{
        resizeEnable: true,
          zoom:4
      });

      function refresh(enName) {
        map.setMapStyle('amap://styles/'+enName);
      }

      const colors = [ "#3366cc", "#dc3912", "#ff9900", "#109618", "#990099", "#0099c6", "#dd4477", "#66aa00", "#b82e2e", "#316395", "#994499", "#22aa99", "#aaaa11", "#6633cc", "#e67300", "#8b0707", "#651067", "#329262", "#5574a6", "#3b3eac" ];
      // 当前聚焦的区域
      let currentAreaNode;


      AMapUI.load(['ui/geo/DistrictExplorer', 'lib/$'], function(DistrictExplorer) {
        //创建一个实例
        const districtExplorer = window.districtExplorer = new DistrictExplorer({
          eventSupport: true, //打开事件支持
          map
        });

//        //创建一个辅助Marker,提示鼠标内容
//        var tipMarker = new AMap.Marker({
//          //启用冒泡,否则click事件会被marker自己拦截
//          bubble:true
//        });
//
        // feature 被点击
        districtExplorer.on('featureClick', function(e, feature) {
          const props = feature.properties;
          //如果存在子节点
          console.log(props);
          if(props.childrenNum > 0) {
            //切换聚焦区域
            switch2AreaNode(props.adcode);
          }
        });

        //外部区域被点击
        districtExplorer.on('outsideClick', function(e) {
          districtExplorer.locatePosition(e.originalEvent.lnglat, function(error,routeFeatures) {
            if(routeFeatures && routeFeatures.length > 1) {
              //切换到省级区域
              switch2AreaNode(routeFeatures[1].properties.adcode);
            }else{
              //切换到全国
              switch2AreaNode(100000)
            }
          },{
            levelLimit:2
          });
        });

        //绘制某个区域的边界
        function renderAreaPolygons(areaNode) {
          const node = _.cloneDeep(areaNode);

          districtExplorer.clearFeaturePolygons();

          districtExplorer.renderSubFeatures(node, function(feature, i) {
            const fillColor = colors[i % colors.length];
            const strokeColor = colors[colors.length - 1 -i % colors.length];
            return {
              cursor: 'default',
              bubble:true,
              strokeColor,//线颜色
              strokeOpacity:1,//线透明度
              strokeWeight:1, //线宽
              fillOpacity: 0.35 //填充透明度
            };
          });

          //绘制父区域
          districtExplorer.renderParentFeature(node, {
            cursor: 'default',
            bubble: true,
            strokeColor: 'black',//线颜色
            strokeOpacity: 1, //线透明度
            strokeWeight: 1, //线宽
            fillColor: null, //填充色
            fillOpacity: 0.35 //填充透明度
          });
        }

        //切换区域后刷新显示内容
        function refreshAreaNode(areaNode) {
          districtExplorer.setHoverFeature(null);
          renderAreaPolygons(areaNode)

        }

        //切换区域
        function switch2AreaNode(adcode, callback) {
          if (currentAreaNode && ('' + currentAreaNode.getAdcode() === '' + adcode)) {
            return;
          }

          loadAreaNode(adcode, function(error, areaNode) {
            if (error) {
              if (callback) {
                callback(error);
              }
              return;
            }
            currentAreaNode = window.currentAreaNode = areaNode;
            refreshAreaNode(areaNode);
            if (callback) {
              callback(null, areaNode);
            }
          });
        }

        //加载区域
        function loadAreaNode(adcode, callback) {
          districtExplorer.loadAreaNode(adcode, function(error, areaNode) {
            if(error) {
              if(callback) {
                callback(error);
              }
              return;
            }
            renderG2Map(areaNode); //使用 G2 绘制地图

            if(callback) {
              callback(null, areaNode);
            }
          });
        }
        //浙江
        switch2AreaNode(330000);
      });

      //开始使用G2绘制地图
      let provinceChart;

      function renderG2Map(areaNode) {
        const adcode = areaNode.getAdcode();
        const geoJSON = areaNode.getSubFeatures(); // 获取 geoJSON 数据
        const name = areaNode.getName();

        provinceChart && provinceChart.destroy();
        provinceChart = null;
        if (!geoJSON || currentAreaNode && ('' + currentAreaNode.getAdcode() === '' + adcode)) {
          return;
        }

        const dv = processData(geoJSON);

        // start: 计算地图的最佳宽高
        const longitudeRange = dv.range('longitude');
        const lantitudeRange = dv.range('lantitude');
        const ratio = (longitudeRange[1] - longitudeRange[0]) / (lantitudeRange[1] - lantitudeRange[0]);
        let width;
        let height;
        if (ratio > 1) {
          width = $('#province').width();
          height = width / ratio;
        } else {
          width = 300 * ratio;
          height = $('#province').height();
        }
        // end: 计算地图的最佳宽高
        provinceChart = new G2.Chart({
          container: 'province',
          width,
          height,
          padding: 0
        });
        provinceChart.source(dv);
        provinceChart.axis(false);
        provinceChart.tooltip({
          showTitle: false
        });
        provinceChart
            .polygon()
            .position('longitude*lantitude')
            .label('name', {
              textStyle: {
                fill: '#fff',
                fontSize: 10,
                shadowBlur: 2,
                shadowColor: 'rgba(0, 0, 0, .45)'
              }
            })
            .style({
              stroke: '#fff',
              lineWidth: 1
            })
            .color('value', '#BAE7FF-#1890FF-#0050B3');
        provinceChart.guide().text({
          position: [ 'min', 'max' ],
          offsetY: 20,
          content: name,
          style: {
            fontSize: 14,
            fontWeight: 'bold'
          }
        });
        provinceChart.render();
      }

      function processData(geoJSON) {

        console.log("---------------------geoJSON---------------------------");
        console.log(geoJSON);
        const mapData = {
          type: 'FeatureCollection',
          features: geoJSON
        };
        // 构造虚拟数据
        const userData = [];
        for (let i = 0; i < geoJSON.length; i++) {
          const name = geoJSON[i].properties.name;
          userData.push({
            name,
            value: Math.round(Math.random() * 1000)
          });
        }

         console.log("----------------userData----------------");
        console.log(userData);


        const ds = new DataSet();
        const geoDataView = ds.createView().source(mapData, {
          type: 'GeoJSON'
        }); // geoJSON 经纬度数据

        // 用户数据
        const dvData = ds.createView().source(userData);
        dvData.transform({
          type: 'geo.region',
          field: 'name',
          geoDataView,
          as: [ 'longitude', 'lantitude' ]
        });

        console.log('---------------------dvData-------------');
        console.log(dvData);
        return dvData;
      }
  </script>
</body>
</html>

这里的代码

AMapUI.load(['ui/geo/DistrictExplorer', 'lib/$'], function(DistrictExplorer) {

}

是对高德地图ui的组件调用,DistrictExplorer是行政区划浏览

  • 自有组件还有:参考组件 UI组件库
  • 我们还可以自定义组件模块,AMapUI组件库的扩展 ,详情戳这里————> AMapUI组件库高级功能
  • ui/geo/DistrictExplorer是扩展的模块路径
  • lib/$, 即DomLibrary(jQuery或者Zepto)

图片描述
这里load的json数据是这样的,其中的topo内的就是TopoJSON数据
geo/DistrictExplorer.json

图片描述

  • type 是Topology,表示文件类型
  • transform用于描述缩放量和平移量,分别用一个只有两项的数组来表示
  • objects里存有几何体模块,此处只有浙江省

    • parent 是全省
    • sub 是各市县
    • arcs表示如何从最外层的数组arcs里提取地形.

注意
相比GeoJSON直接使用Polygon、Point之类的几何体来表示图形的方法,TopoJSON中的每一个几何体都是通过将共享边(被称为arcs)整合后组成
TopoJSON消除了冗余,文件大小缩小了80%,因为:

  • 边界线只记录一次
  • 地理坐标使用整数,不使用浮点数

地图投影

我们再看一看 g2的另一个实例 : 带气泡的地图


const dv = ds.createView('back')
                           .source(mapData,{
                               type: 'GeoJSON'
                           })
                           .transform({
                               type:'geo.projection',
                               projection: 'geoMercator',
                               as:['x','y','centroidX','centroidY']
                           });

这里的 projection: 'geoMecator',表示投影是墨卡托投影

墨卡托投影、高斯-克吕格投影、UTM投影

我们可以看看d3里面关于地图的投影api,看看有哪些地图投影:
d3.js Azimuthal Projections

绘制过程

图片描述
图片描述
相比2.0版本 3.0版本的container是支持string 也支持dom对象的

从上面两个例子我们可以看出来,在载入地图时候我们可以

  • 调用amap api地图
  • 本地GeoJSON或TopoJSON生成

这里我们说一说如何载入数据
如何装载数据
图片描述
图片描述

这里我们可以看到 g2中绘制地图时候需要 传入一个JSON数组
所以上面例子中国地图-省市下钻 const dv = processData(geoJSON); processData函数应该有这样一个转换过程 GeoJSON --> JSON数组 --> DataSet,我们来看一看是不是这样(即userData应该是JSON数组,dvData应该是DataSet)
图片描述
图片描述
图片描述

const geoDataView = ds.createView().source(mapData, {
      type: 'GeoJSON'
    }); // geoJSON 经纬度数据
为什么是转换为Dataset?

自 G2 3.0 版本开始,原先内置的数据处理模块 frame 从 G2 包中抽离出来,独立成为 DataSet 包。DataSet 的目标是为数据可视化场景提供状态驱动(state driven)的 -->DataSet

<script src="https://gw.alipayobjects.com/os/antv/assets/data-set/0.8.1/data-set.js"></script>

在DataSet包中

  • 我们把数据处理分为两个大的步骤:数据连接(Connector)和数据转换(Transform)。Connector 负责导入和归一化数据(譬如导入 CSV 数据,导入 GeoJSON 数据等),Transform 负责进行各种数据转换操作(譬如图布局、数据统计、数据补全等)。

想要了解G2中数据的处理流程直接点击

常用实例

基于baidu、google、arcgis、高德地图、canvas数据可视化
GeoHey gallery

文章

基于WebGL的大数据二三维可视化--uber的deck.gl介绍
deck.gl example
可视化篇:mapbox + echarts-gl 展示血脉交通
从Mapbox的开源工具看Web GIS的发展
ECharts 地图博客
echarts结合高德API进行地图下钻

参考

Map Projection Overview
[python处理地理数据-geopandas和pyshp]()
mapbox/node-fontnik工具使用介绍
Mapbox GL JS本地化实践
GIS文章集
Geomatics(GIS,GPS,RS,Surveying)
地图应用API(GIS+LBS)
antv g2的理解总结
Maps
inMap
https://codepen.io/stevepeppl...
https://codepen.io/AlexZ33/pe...
https://codepen.io/pbeshai/pr...
https://codepen.io/jakealbaug...
https://github.com/LylaYuKako...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据可视化:地图使用案例 的相关文章

  • C++ 中本地类中的静态成员变量?

    我知道我们不能宣布static本地类中的成员变量 但其原因尚不清楚 那么请问有人可以解释一下吗 另外 为什么我们不能访问非static函数内部定义的变量 内部已经定义了局部类 直接在局部类成员函数中 在下面给出的代码中 int main i
  • Unix网络编程澄清

    我正在翻阅这本经典书籍Unix网络编程 https rads stackoverflow com amzn click com 0139498761 当我偶然发现这个程序时 第 6 8 节 第 179 180 页 include unp h
  • 推导指南中的引用和值之间的差异

    考虑类型A template
  • 单元测试一起运行时失败,单独运行时通过

    所以我的单元测试遇到了一些问题 我不能只是将它们复制并粘贴到这里 但我会尽力而为 问题似乎是 如果我一项一项地运行测试 一切都会按预期进行 但如果我告诉它一起运行测试 则 1 5 将通过 TestMethod public void Obj
  • 读取文件特定行号的有效方法。 (奖励:Python 手册印刷错误)

    我有一个 100 GB 的文本文件 它是来自数据库的 BCP 转储 当我尝试导入它时BULK INSERT 我在第 219506324 行上收到一个神秘错误 在解决此问题之前 我想看看这一行 但可惜的是我最喜欢的方法 import line
  • 如何从 .resx 文件条目获取注释

    资源文件中的字符串有名称 值和注释 The ResXResourceReader类让我可以访问名称和值 有办法看评论吗 你应该能够得到Comment via ResXDataNode class http msdn microsoft co
  • 获取 WPF 控件的所有附加事件处理程序

    我正在开发一个应用程序 在其中动态分配按钮的事件 现在的问题是 我希望获取按钮单击事件的所有事件 因为我希望删除以前的处理程序 我尝试将事件处理程序设置为 null 如下所示 Button Click null 但是我收到了一个无法分配 n
  • 将 Excel 导入到 Datagridview

    我使用此代码打开 Excel 文件并将其保存在 DataGridView 中 string name Items string constr Provider Microsoft Jet OLEDB 4 0 Data Source Dial
  • 未定义的行为或误报

    我 基本上 在野外遇到过以下情况 x x 5 显然 它可以在早期版本的 gcc 下编译干净 在 gcc 4 5 1 下生成警告 据我所知 警告是由 Wsequence point 生成的 所以我的问题是 这是否违反了标准中关于在序列点之间操
  • 未经许可更改内存值

    我有一个二维数组 当我第一次打印数组的数据时 日期打印正确 但其他时候 array last i 的数据从 i 0 到 last 1 显然是一个逻辑错误 但我不明白原因 因为我复制并粘贴了 for 语句 那么 C 更改数据吗 I use g
  • PlaySound 可在 Visual Studio 中运行,但不能在独立 exe 中运行

    我正在尝试使用 Visual Studio 在 C 中播放 wav 文件 我将文件 my wav 放入项目目录中并使用代码 PlaySound TEXT my wav NULL SND FILENAME SND SYNC 我按下播放按钮 或
  • C++:.bmp 到文件中的字节数组

    是的 我已经解决了与此相关的其他问题 但我发现它们没有太大帮助 他们提供了一些帮助 但我仍然有点困惑 所以这是我需要做的 我们有一个 132x65 的屏幕 我有一个 132x65 的 bmp 我想遍历 bmp 并将其分成小的 1x8 列以获
  • 如何在 Blackberry Cascades 中显示具有特定号码的电话板

    我正在使用带有 C QT 和 QML 的 Blackberry Cascades 10 Beta 3 SDK 以及 Blackberry 10 Dev Alpha Simulator 和 QNX Momentics IDE 并且我正在尝试实
  • (de)从 CSV 序列化为对象(或者最好是类型对象的列表)

    我是一名 C 程序员 试图学习 C 似乎有一些内置的对象序列化 但我在这里有点不知所措 我被要求将测试数据从 CSV 文件加载到对象集合中 CSV 比 xml 更受青睐 因为它更简单且更易于人类阅读 我们正在创建测试数据来运行单元测试 该集
  • 只返回 $.ajax 传递的 JSON 数据的前 20 个结果?

    我有以下简单的 jquery 片段 document ready function ajax url myjson json dataType json success function json each json function al
  • 如何在 C# 中调整图像大小同时保持高质量?

    我从这里找到了一篇关于图像处理的文章 http www switchonthecode com tutorials csharp tutorial image editing saving cropping and resizing htt
  • 如何在按钮单击时模拟按键 - Unity

    我对 Unity 中的脚本编写非常陌生 我正在尝试创建一个按钮 一旦单击它就需要模拟按下 F 键 要拾取一个项目 这是我当前的代码 在编写此代码之前我浏览了所有统一论坛 但找不到任何有效的东西 Code using System Colle
  • Linq-to-entities,在一个查询中获取结果+行数

    我已经看到了有关此事的多个问题 但它们已经有 2 年 或更长 的历史了 所以我想知道这方面是否有任何变化 基本思想是填充网格视图并创建自定义分页 所以 我还需要结果和行数 在 SQL 中 这将类似于 SELECT COUNT id Id N
  • 检查Windows控制台中是否按下了键[重复]

    这个问题在这里已经有答案了 可能的重复 C 控制台键盘事件 https stackoverflow com questions 2067893 c console keyboard events 我希望 Windows 控制台程序在按下某个
  • Retrofit 2.0:预期为 BEGIN_OBJECT,但在第 1 行第 1 列路径 $ [重复] 处为 STRING

    这个问题在这里已经有答案了 我在邮递员上传递了更新用户请求并获得了成功的响应 参见图片 现在当我尝试使用 Retrofit 2 在我的应用程序中执行相同操作时 出现错误 com google gson JsonSyntaxException

随机推荐

  • Eth-Trunk链路聚合

    一 链路聚合原理 1 1 原理简述 链路聚合能够提高链路带宽 增强网络可用性 支持负载分担 链路聚合是把两台设备之间的多条物理链路聚合在一起 当做一条逻辑链路来使用 这两台设备可以是一对路由器 一对交换机 或者是一台路由器和一台交换机 一条
  • Stm32 简单实现软件调用bootloader

    最近做了个密封的设备 由于只有一个接口 该接口连接usb otg 没有串口芯片进行复位操作导致烧录相当麻烦 如果自己做IAP又会挤占那可怜的ram空间 受IAP原理触发 想到可以通过跳转的方式进入系统储存器 通过查阅手册可以发现BootLo
  • 数据库inset update返回值正常,但是数据却没有更新

    今天碰到了这件怪事 我找了好久没发现问题 从数据库用户权限到源码都看了 也没发现问题 愁了一天555 后来发现是加了事务没提交 心态崩了
  • @RabbitListener详解

    RabbitListener 是用于在 Spring AMQP 中消息监听的注解 它允许在 Spring 应用程序中声明消息监听器 在使用 RabbitListener 注解的方法上 可以接收来自 RabbitMQ 队列的消息 这些方法可以
  • 螺杆真空泵安装流程图_无油干式真空泵的选型

    无油干式真空泵有着空前的节能与环保优势 更代表未来泵业发展的一种趋势 而众多的干式无油真空泵有着不同真空参数和不同的功能区别 如何根据自身工艺特点选择那种干式无油真空泵的型号 就首先了解各种不同类型干式无油真空泵的选型知识 这样做出的选择才
  • 如何在群晖NAS中使用cpolar内网穿透

    如何在群晖nas中使用cpolar内网穿透 文章目录 如何在群晖nas中使用cpolar内网穿透 今天 我们来为大家介绍 如何在群晖系统中 使用图形化界面的cpolar cpolar经过图形化改造后 使用方法已经简便了很多 基本与其他应用软
  • vue3浏览器报错解决Uncaught runtime errors

    我们只需要在项目 vue config js 加上如下配置即可 module exports defineConfig devServer client overlay false
  • linux 内核启动参数

    Linux 内核引导选项简介 作者 金步国 版权声明 本文作者是一位开源理念的坚定支持者 所以本文虽然不是软件 但是遵照开源的精神发布 无担保 本文作者不保证作品内容准确无误 亦不承担任何由于使用此文档所导致的损失 自由使用 任何人都可以自
  • linux 读写锁应用实例

    使用读写锁实现四个线程读写一段程序的实例 共创建了四个新的线程 其中两个线程用来读取数据 另外两个线程用来写入数据 在任意时刻 如果有一个线程在写数据 将阻塞所有其他线程的任何操作 include
  • 服务器系统一键功能安装,一键安装服务器系统

    一键安装服务器系统 内容精选 换一换 公有云平台提供了一键式重置密码功能 弹性云服务器的密码丢失或过期时 如果您的弹性云服务器提前安装了一键式重置密码插件 则可以应用一键式重置密码功能 给弹性云服务器设置新密码 该方法方便 有效 建议您成功
  • OpenMV串口通讯详解

    官方教程 串口通讯上 串口通讯下 OpenMV的Uart类函数介绍 目录 材料准备 官方示例代码解析 UART 函数介绍 usart write 函数介绍 time sleep ms x 函数介绍 自己写的代码加深理解 usart any
  • java版本号比较

    public static int versionCompareTo String version1 String version2 version1 version1 null version1 replaceAll d version2
  • 单纯形法详解

    单纯形法是针对求解线性规划问题的一个算法 这个名称里的 单纯形 是代数拓扑里的一个概念 可以简单将 单纯形 理解为一个凸集 标准的线性规划问题可以表示为 min or max f x cx s t Ax b x gt 0 b gt 0 以上
  • linux篇(一)linux快速上手

    作者介绍 关于作者 东条希尔薇 一名喜欢编程的在校大学生 主攻方向 c 和linux 码云主页点我 本系列仓库直通车 作者CSDN主页地址 这是新坑的第一篇文章 也是我年前的最后一篇 作者先在这里和大家拜个早年啦 这个系列 我们将通过lin
  • mysql相除_mysql 常用函数

    流程控制函数 CASE 函数 写法 CASE value WHEN compare value THEN result WHEN compare value THEN result ELSE result END 当value等于compa
  • IntelliJ IDEA(2018)安装详解

    第一步 进入官网下载IntelliJ IDEA https www jetbrains com idea download section windows 选择适合版本下载 第二步 双击已下载文件 进行开始安装 点击 next 继续ing
  • C语言,使用非函数方法实现字符串比较

    使用非函数方法实现字符串比较 include
  • sprinboot单体项目升级成springcloud项目

    1 升级所需要的前置准备 1 把现有的服务拆分成多个模块 2 技术选型 采用Spring Cloud Alibaba 3 依照模块对应的进行升级 我将按照 引入依赖 加配置 改代码三部曲来完成模块的升级 拆分服务暂时拆分成 登录权限模块 文
  • java季度时间获取工具类

    1 获取当前季度 第一天或最后一天 获取季度 第一天或最后一天 param quarters 0本季度 1下季度 1上季度 以此类推 param isFirst true获取开始时间 false获取结束时间 return java lang
  • 数据可视化:地图使用案例

    推荐技术栈 amap g2 amap L7 mapbox deck gl echarts gl 地理相关库 amapmapboxLeafletCesiumdeck glg2 map类turfjs 工具 http geojson io map