【高德地图API】JS高德地图API实现多边形绘画,高德获取多边形提交数据

目录

  • 前言
  • 效果
  • 实现
    • 引入js
  • 在项目中使用
    • 效果图
    • 引入
    • html
    • CSS
    • 具体实现JS
    • 调用说明
      • 添加的时候
      • 修改的时候
      • 判断是否在范围内
    • java绘画和判断是否在范围内
      • pom.xml依赖引入
      • import引入
      • 实现

前言

高德地图官方API:https://lbs.amap.com/demo/javascript-api/example/overlayers/polygon-draw-and-edit
高德地图API版本:1.4.15
使用JS实现高德地图多边形围栏设置(除了简单的例子,还附带本人在项目中的实现)

效果

在这里插入图片描述

实现

引入js

需要添加安全密钥和key,之所以要使用安全密钥是官方在2021-12-02的时候改的,原本只需要key即可的
参考网址:https://lbs.amap.com/api/javascript-api/guide/abc/prepare
这里plugin=AMap.*****是自己需要到的对象

<script type="text/javascript">window._AMapSecurityConfig = {securityJsCode:'bf5ed*********************886', // 安全密钥(正式项目官方推荐使用nginx代理方式引入密钥)}
</script>
<script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.15&key=22d1******************b8&plugin=AMap.Autocomplete,AMap.PlaceSearch,AMap.PolyEditor,AMap.Marker"></script>

html实现

<!doctype html>
<html><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width"><style>html,body,#container {width: 100%;height: 100%;}</style><title>多边形的绘制和编辑</title><link rel="stylesheet" href="https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css" /><script type="text/javascript">window._AMapSecurityConfig = {securityJsCode:'bf5******************886',}</script><script src="https://webapi.amap.com/maps?v=1.4.15&key=22d******************a20b8&plugin=AMap.PolyEditor"></script></head><body><div id="container"></div><div class="input-card" style="width: 120px"><button class="btn" onclick="startEdit()" style="margin-bottom: 5px">开始编辑</button><button class="btn" onclick="submitMap()">结束编辑</button></div><script type="text/javascript">var temp_lnglat = []; // 临时存储位置var tempMap = {}; // 临时存储地图对象// 要绘画位置的经纬度var lngLat = [116.400274, 39.905812];initMap(lngLat);/*** ---------------------------------------------------------------------------------------------------------------* 初始化地图*/function initMap(lngLat){tempMap.map = new AMap.Map("container", {center: lngLat,zoom: 14});createPolygon(lngLat);}/*** ---------------------------------------------------------------------------------------------------------------* 创建多边形* @param {Object} paths*/function createPolygon(lngLat, paths){// 绘画多边形的各个角的经纬度(如果没有就使用这个,在当前位置上创建默认的多边形)if(!paths || paths.length < 1){paths = [[lngLat[0] + 0.003048, lngLat[1] + 0.014442],[lngLat[0] + 0.010429, lngLat[1] - 0.008257],[lngLat[0] + 0.002018, lngLat[1] -  0.013458],[lngLat[0] - 0.010427, lngLat[1] - 0.014446]]}// 赋值给临时数组(提交的时候要这些多边形角的经纬度)temp_lnglat = paths;// 创建绘画var polygon = new AMap.Polygon({path: paths,strokeColor: "#0f79d7",strokeWeight: 3,strokeOpacity: 0.6,fillOpacity: 0.4,fillColor: '#1791fc',zIndex: 50,})tempMap.map.add(polygon)// 缩放地图到合适的视野级别tempMap.map.setFitView([polygon])// 编辑绘画对象tempMap.polyEditor = new AMap.PolyEditor(tempMap.map, polygon)// 事件tempMap.polyEditor.on('addnode', function(event) {console.log('触发事件:addnode ------------------------------------------')console.log("添加:", event)console.log("添加-经度:", event.lnglat.lng, "纬度:", event.lnglat.lat)})tempMap.polyEditor.on('adjust', function(event) {console.log('触发事件:adjust ------------------------------------------')console.log("修改:", event)console.log("修改-经度:", event.lnglat.lng, "纬度:", event.lnglat.lat)})tempMap.polyEditor.on('removenode', function(event) {console.log('触发事件:removenode ------------------------------------------')console.log("removenode:", event)})tempMap.polyEditor.on('end', function(event) {console.log('触发事件: end ------------------------------------------')console.log("end:", event)// event.target 即为编辑后的多边形对象})}/*** ---------------------------------------------------------------------------------------------------------* 清除绘画*/function clearMap() {tempMap.map.clearMap(tempMap.polyEditor)tempMap.map.remove(tempMap.polyEditor)}/*** ---------------------------------------------------------------------------------------------------------------* 开始编辑*/function startEdit(){// 打开编辑tempMap.polyEditor.open(); }/*** ---------------------------------------------------------------------------------------------------------------* 提交经纬度*/function submitMap() {// 关闭绘画//tempMap.polyEditor.close();// 获取所有的经纬度if(tempMap.polyEditor.bu){temp_lnglat = tempMap.polyEditor.bu[0];}// 去除Q和R属性值,保留lng和lat的值temp_lnglat = temp_lnglat.map(function(item, index){return [item.lng, item.lat];})console.log("获取所有坐标:", JSON.stringify(temp_lnglat));}</script></body></html>

html搜索提示

<!doctype html>
<html>
<head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width"><title>输入提示</title><link rel="stylesheet" href="https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css" /><style>html,body,#container {width: 100%;height: 100%;}</style>
</head>
<body>
<div id="container"></div>
<div class="info"><div class="input-item"><div class="input-item-prepend"><span class="input-item-text" style="width:8rem;">请输入关键字</span></div><input id='tipinput' type="text"></div>
</div><script type="text/javascript">window._AMapSecurityConfig = {securityJsCode:'bf5********************886',}
</script>
<script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.15&key=22d********************0b8&plugin=AMap.Autocomplete,AMap.PlaceSearch"></script>
<script type="text/javascript">/*** ---------------------------------------------------------------------------------------------------------* 渲染地图*/function initMap(){var map = new AMap.Map('container', {resizeEnable: true, //是否监控地图容器尺寸变化});// 输入提示var autoOptions = {input: "tipinput"};var auto = new AMap.Autocomplete(autoOptions);// 构造地点查询类var placeSearch = new AMap.PlaceSearch({map: map});// 注册监听,当选中某条记录时会触发AMap.event.addListener(auto, "select", selectSearch);function selectSearch(e) {console.log(e)placeSearch.setCity(e.poi.adcode);placeSearch.search(e.poi.name);  // 关键字查询查询}}initMap();
</script>
</body>
</html>

在项目中使用

效果图

在这里插入图片描述

这是本人在项目中的使用(复制粘贴可用)

引入

记得把安全密钥和key改了

<script type="text/javascript">window._AMapSecurityConfig = {securityJsCode:'bf5e**********************886',}
</script>
<script src="https://webapi.amap.com/maps?v=1.4.15&key=22d**********************20b8&plugin=AMap.Autocomplete,AMap.PlaceSearch,AMap.PolyEditor,AMap.Marker"></script>

html

这里使用layui框架的,所有直接复制过来了,只取关键即可

<div class="layui-form-item"><label class="layui-form-label">项目地址</label><div class="layui-input-block" style="width: 500px;"><input type="text" name="addr" id="addr" placeholder="输入地址后选择详细,再操作地图"autocomplete="off" class="layui-input"><div class="lay-search-content"><ul></ul></div></div>
</div>
<div class="layui-form-item"><!-- map地图 --><div class="container" id="container" style="height: 500px;width: 750px;"></div>
</div>

CSS

自己写的效果

.lay-search-content{padding: 10px;background: white;border-radius: 4px;color: #333333;line-height: 15px;box-shadow: #00000024 0px 2px 5px 0;max-height: 300px;overflow: auto;display: none;position: absolute;z-index: 99999;width: 99%;
}
.lay-search-content li{list-style: none;margin: 5px 0px;padding: 8px 0px;border-bottom: 1px solid whitesmoke;cursor: pointer;
}
.lay-search-content li:hover{background: #f1f1f1;
}
.lay-search-mark{width: 16px;display: inline-block;height: 16px;background: #c1c1c1;text-align: center;line-height: 16px;border-radius: 50%;margin-right: 4px;color: white;font-size: 12px;position: relative;top: -1px;
}

具体实现JS


var temp_lnglat = [116.400274, 39.905812]; // 临时存储当前位置
var temp_fence_lnglat = []; // 临时存储所有位置
var tempMap = {}; // 临时存储地图对象/*** ---------------------------------------------------------------------------------------------------------* 重置地图值*/
function clearMap(state) {if(!state){ // 修改的话不赋值temp_lnglat = [116.400274, 39.905812];temp_fence_lnglat = [];}if(tempMap.polyEditor){tempMap.map.clearMap(tempMap.polyEditor)tempMap.map.remove(tempMap.polyEditor)}
}/*** ---------------------------------------------------------------------------------------------------------* 渲染地图*/
function initMap(state){tempMap.map = new AMap.Map('container', {resizeEnable: true, //是否监控地图容器尺寸变化center: temp_lnglat,zoom: 14,});// 构造地点查询类tempMap.placeSearch = new AMap.PlaceSearch({city: "全国", // 兴趣点城市});$("#addr").bind('input propertychange', function() {var text = $("#addr").val();searchAddr(text)})clickPosition(temp_lnglat[0], temp_lnglat[1], state);
}/*** --------------------------------------------------------------------------------------------------------------------* 地图搜索* @return*/
function searchAddr(text) {// 关键字查询,设置成输入框input就好了,下面返回的集合中有name,可以自己重新查询结果选择tempMap.placeSearch.search(text, function (status, result) {// 查询成功时,result即对应匹配的POI信息console.log("搜索结果坐标:", result)if (!result.poiList){return;}var pois = result.poiList.pois;$(".lay-search-content").css("display", "block");$(".lay-search-content>ul").empty();for (var i = 0; i < pois.length; i++) {var poi = pois[i];var s = '<li οnclick="clickPosition(' + poi.location.lng + ', ' + poi.location.lat + ')">';var index = i + 1;if (index == 1) {s += '   <span class="lay-search-mark" style="background: #ff8e63;">' + index + '</span>' + poi.name;} else if (index == 2) {s += '   <span class="lay-search-mark" style="background: #edd07d;">' + index + '</span>' + poi.name;} else if (index == 3) {s += '   <span class="lay-search-mark" style="background: #cddb82;">' + index + '</span>' + poi.name;} else {s += '   <span class="lay-search-mark">' + index + '</span>' + poi.name;}s += '   <span style="color: #999;font-size: 12px">(' + poi.address + ')</span>';s += '</li>';$(".lay-search-content>ul").append(s);var marker = [];marker[i] = new AMap.Marker({position: poi.location,   // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9]offset: new AMap.Pixel(0, -20),// 相对于基点的偏移位置title: poi.name});// [点标上面显示内容信息]var infoWindow = new AMap.InfoWindow({offset: new AMap.Pixel(0, -30)});// 地图位置对象// 点击弹出内容marker[i].content = poi.name;marker[i].on('click', markerClick);function markerClick(e) {var position = e.target.getPosition();var content = "<div>" + e.target.content + "</div>"; // 要显示的内容content += "<div style='text-align: center'><a class='layui-btn layui-btn-sm' οnclick='clickPosition(" + position.lng + ", " + position.lat + ")'>选择设置围栏</a></div>"infoWindow.setContent(content);infoWindow.open(tempMap.map, position);}// 将创建的点标记添加到已有的地图实例:tempMap.map.add(marker[i]);}tempMap.map.setFitView();})
}/*** --------------------------------------------------------------------------------------------------------------------* 搜索结果选择设置围栏* @param lng* @param lat*/
function clickPosition(lng, lat, state) {$(".lay-search-content").css("display", "none");clearMap(state);temp_lnglat = [lng, lat];// 添加点标var markers = new AMap.Marker({position: temp_lnglat,   // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9]offset: new AMap.Pixel(0, -20),// 相对于基点的偏移位置});tempMap.map.add(markers);tempMap.map.setCenter(temp_lnglat)createPolygon(temp_lnglat, temp_fence_lnglat);
}
/*** ---------------------------------------------------------------------------------------------------------------* 创建多边形* @param {Object} paths*/
function createPolygon(lngLat, paths){// 绘画多边形的各个角的经纬度(如果没有就使用这个,在当前位置上创建默认的多边形)if(!paths || paths.length < 1){paths = [[lngLat[0] + 0.003048, lngLat[1] + 0.014442],[lngLat[0] + 0.010429, lngLat[1] - 0.008257],[lngLat[0] + 0.002018, lngLat[1] -  0.013458],[lngLat[0] - 0.010427, lngLat[1] - 0.014446]]}// 赋值给临时数组(提交的时候要这些多边形角的经纬度)temp_fence_lnglat = paths;// 创建绘画var polygon = new AMap.Polygon({path: paths,strokeColor: "#0f79d7",strokeWeight: 3,strokeOpacity: 0.6,fillOpacity: 0.4,fillColor: '#1791fc',zIndex: 50,})tempMap.map.add(polygon)// 缩放地图到合适的视野级别tempMap.map.setFitView([polygon])// 编辑绘画对象tempMap.polyEditor = new AMap.PolyEditor(tempMap.map, polygon)// 事件tempMap.polyEditor.on('addnode', function(event) {console.log('触发事件:addnode ------------------------------------------')console.log("添加:", event)console.log("添加-经度:", event.lnglat.lng, "纬度:", event.lnglat.lat)})tempMap.polyEditor.on('adjust', function(event) {console.log('触发事件:adjust ------------------------------------------')console.log("修改:", event)console.log("修改-经度:", event.lnglat.lng, "纬度:", event.lnglat.lat)})tempMap.polyEditor.on('removenode', function(event) {console.log('触发事件:removenode ------------------------------------------')console.log("removenode:", event)})tempMap.polyEditor.on('end', function(event) {console.log('触发事件: end ------------------------------------------')console.log("end:", event)// event.target 即为编辑后的多边形对象})// 打开编辑tempMap.polyEditor.open();
}/*** ---------------------------------------------------------------------------------------------------------------* 开始编辑*/
function startEdit(){// 打开编辑tempMap.polyEditor.open();
}/*** ---------------------------------------------------------------------------------------------------------------* 提交经纬度*/
function submitMap() {// 关闭绘画//tempMap.polyEditor.close();// 获取所有的经纬度if(tempMap.polyEditor.bu){temp_fence_lnglat = tempMap.polyEditor.bu[0];}// 去除Q和R属性值,保留lng和lat的值temp_fence_lnglat = temp_fence_lnglat.map(function(item, index){return [item.lng, item.lat];})console.log("获取所有坐标:", JSON.stringify(temp_fence_lnglat));
}

调用说明

基于上面写好的js,直接复制去调用即可

添加的时候

initMap();

修改的时候

data.lngLat和data.fenceLngLat就是我们存储起来已经设置的经纬度

temp_lnglat = JSON.parse(data.lngLat);
temp_fence_lnglat = JSON.parse(data.fenceLngLat);
initMap(true);

判断是否在范围内

参考API:https://lbs.amap.com/demo/javascript-api/example/relationship-judgment/point-surface-relation

// 创建点(显示当前用户的点位)
var marker = new AMap.Marker({map: map,position: [116.566298, 40.014179]
});
// 判断是否在范围内
var point = marker.getPosition();
var isPointInRing = AMap.GeometryUtil.isPointInRing(point, paths); // paths 就是多边形的那些坐标数组
console.log("是否在范围内:", isPointInRing?'是':'否')

java绘画和判断是否在范围内

参考网址1:https://www.php.cn/faq/584994.html
参考网址2:https://blog.51cto.com/u_16175486/6825616
参考网址3:https://www.jianshu.com/p/5a2398a84889
参考网址4:https://zhuanlan.zhihu.com/p/534997829

pom.xml依赖引入

<dependency><groupId>com.amap.api</groupId><artifactId>amap-java-sdk</artifactId><version>1.4.0</version>
</dependency>

import引入

import com.amap.api.maps.AMap;
import com.amap.api.maps.AMapOptions;
import com.amap.api.maps.CameraUpdateFactory;
import com.amap.api.maps.MapView;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.LatLngBounds;
import com.amap.api.maps.model.Polygon;
import com.amap.api.maps.model.PolygonOptions;

实现

创建一个地图视图对象,并将其添加到布局中

MapView mapView = new MapView(context, new AMapOptions());
//layout.addView(mapView);

初始化地图

AMap aMap = mapView.getMap();
aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(39.90923, 116.397428), 10));

这里我们就可以将设置的多边形各个点添加到集合里

List<LatLng> points = new ArrayList<>();
points.add(new LatLng(39.910698, 116.399406));
points.add(new LatLng(39.909819, 116.405778));
points.add(new LatLng(39.919719, 116.405814));
points.add(new LatLng(39.919657, 116.399362));

设置多边形的绘画

PolygonOptions polygonOptions = new PolygonOptions();
polygonOptions.addAll(points);
polygonOptions.strokeColor(Color.RED);
polygonOptions.fillColor(Color.argb(50, 255, 0, 0));
polygonOptions.strokeWidth(10);

将多边形添加到地图中

Polygon polygon = aMap.addPolygon(polygonOptions);

这里就是判断用户的点是否在我们设置的多边形范围内

LatLng location = new LatLng(39.913678, 116.403873);
boolean contains = polygon.contains(location);
System.out.println("该位置是否在多边形内:" + contains);

所应用的功能大概就是这样啦!

圆形围栏可参考:https://blog.csdn.net/weixin_43992507/article/details/130731955

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTTPS的加密方式超详细解读

在了解https的加密方式之前&#xff0c;我们需要先行了解两个特别经典的传统加密方式&#xff1a; 1、对称加密 1.1、定义 需要对加密和解密使用相同密钥的加密算法。所谓对称&#xff0c;就是采用这种加密方法的双方使用方式用同样的密钥进行加密和解密。密钥是控制加密及解…

SPSS多元方差分析

前言&#xff1a; 本专栏参考教材为《SPSS22.0从入门到精通》&#xff0c;由于软件版本原因&#xff0c;部分内容有所改变&#xff0c;为适应软件版本的变化&#xff0c;特此创作此专栏便于大家学习。本专栏使用软件为&#xff1a;SPSS25.0 本专栏所有的数据文件请点击此链接下…

独立键盘接口设计(Keil+Proteus)

前言 软件的操作参考这篇博客。 LED数码管的静态显示与动态显示&#xff08;KeilProteus&#xff09;-CSDN博客https://blog.csdn.net/weixin_64066303/article/details/134101256?spm1001.2014.3001.5501实验&#xff1a;用4个独立按键控制8个LED指示灯。 按下k1键&#x…

Microsoft Edge不能工作了,可能原因不少,那么如何修复呢

Microsoft Edge打不开或不能加载网页是用户在Windows 10、Android、Mac和iOS设备上的网络浏览器上遇到的许多错误之一。其他Microsoft Edge问题可能包括浏览器窗口和选项卡冻结、网站崩溃、互联网连接错误消息以及丢失Microsoft Edge书签、收藏夹、密码和收藏。 Microsoft Edg…

从零开始制作一个割草机器人

项目背景 为啥要做一个割草机器人呢&#xff1f;&#xff08;个人因素&#xff1a;我梦想就是做一款人形机器人保护人类&#xff0c;解放人类&#xff09; 基础准备&#xff1a;我们公司本身做过高精度&#xff0c;基于高精度的技术扩展到农机自动化驾驶。目前可以实现AB线拖…

【深蓝学院】手写VIO第8章--相机与IMU时间戳同步--作业

0. 题目 1. T1 逆深度参数化时的特征匀速模型的重投影误差 参考常鑫助教的答案&#xff1a;思路是将i时刻的观测投到world系&#xff0c;再用j时刻pose和外参投到j时刻camera坐标系下&#xff0c;归一化得到预测的二维坐标&#xff08;这里忽略了camera的内参&#xff0c;逆深…

51单片机的篮球计分器液晶LCD1602显示( proteus仿真+程序+原理图+PCB+设计报告+讲解视频)

51单片机的篮球计分器液晶LCD1602显示 &#x1f4d1;1.主要功能&#xff1a;&#x1f4d1;讲解视频&#xff1a;&#x1f4d1;2.仿真&#x1f4d1;3. 程序代码&#x1f4d1;4. 原理图&#x1f4d1;5. PCB图&#x1f4d1;6. 设计报告&#x1f4d1;7. 设计资料内容清单&&…

【数据结构】——顺序表(增删查改)

目录 前言&#xff1a; 顺序表&#xff1a; 1、概念及分类 1.1顺序表分类 静态顺序表 动态顺序表 2、接口实现 2.1功能要求 2.2功能实现 &#x1f4a1;初始化顺序表 &#x1f4a1;销毁顺序表 &#x1f4a1;顺序表尾插入 &#x1f4a1;检查是否扩容 &#x1f4a1;…

【二进制转换和与其有关的操作符详解】

文章目录 1.二进制与进制转换2. 2进制转8、10、16进制2.1 2进制转10进制2.2 2进制转8进制2.3 2进制转16进制 3. 8、10、16进制转2进制3.1 10进制转2进制3.2 8进制转2进制3.3 16进制转2进制 4.原码、反码、补码5.移位操作符&#xff08;<< >>&#xff09;5.1左移操作…

【IDEA】在工具栏设置快速创建包和类的图表

页面效果&#xff1a; 操作步骤&#xff1a; 设置 --> 外观与行为 --> 菜单与工具栏 --> 点击 主工具栏 --> 点击 ---- --> 点击 号 --> 添加操作 主菜单 --> 文件 --> 文件打开操作 --> 打开项目操作 --> 新建 --> 往下找 找到 clas…

超声波俱乐部分享:百度世界大会点燃AI创业者新希望

10月22日&#xff0c;2023年第十三期超声波俱乐部内部分享会在北京望京举行。本期的主题是&#xff1a;百度世界大会点燃AI创业者新希望。 到场的嘉宾有&#xff1a;超声波创始人杨子超&#xff0c;超声波联合创始人、和牛商业创始人刘思雨&#xff0c;中国国际经济交流中心研…

开启AWS的ubuntu服务器的root用户登录权限

设置root用户密码 输入以下命令修改root用户密码 sudo passwd root输入以下命令切换到root用户 su root仅允许root用户用密码登录 输入以下命令编辑ssh配置文件 vi /etc/ssh/sshd_config新增以下配置允许root用户登录 PermitRootLogin yes把PasswordAuthentication修改为…

成员变量为动态数据时不可轻易使用

问题描述 业务验收阶段&#xff0c;遇到了一个由于成员变量导致的线程问题 有一个kafka切面&#xff0c;用来处理某些功能在调用前后的发送消息&#xff0c;资产类型type是成员变量定义&#xff1b; 资产1类型推送消息是以zichan1为节点&#xff1b;资产2类型推送消息是以zi…

2023-11-06今日最大收获:坑爹的 JpaRepository!

1.坑爹的 JpaRepository&#xff01; org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet 2023-11-06 18:38:53.12…

报错Could not resolve placeholder ‘driver‘ in value “${driver}“

这是我的报错&#xff1a; 原因是我的applicationContext.xml文件加载properties文件径错误&#xff1a; 应该把路径改成这样就可以了&#xff1a;

ansible安装和常见模块

文章目录 ansible的安装1.1 yum install epel-release.noarch1.2配置epel源的baseurl1.3安装ansible1.4安装ansible报错问题1.5 yum卸载 ansible的安装 ansible是由epel源提供的&#xff0c;所以需要配置epel源。要么通过配置好的baseos源直接执行“yum install epel-release.…

数据分析案例-基于服饰行业中消费者行为和购物习惯的可视化分析(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

JavaScript设计模式之发布-订阅模式

发布者和订阅者完全解耦&#xff08;通过消息队列进行通信&#xff09; 适用场景&#xff1a;功能模块间进行通信&#xff0c;如Vue的事件总线。 ES6实现方式&#xff1a; class eventManager {constructor() {this.eventList {};}on(eventName, callback) {if (this.eventL…

微型导轨在医疗设备中起什么作用?

微型导轨因其高精度、小型化和轻量化的特点&#xff0c;被广泛应用于各种需要高精度和小型化的机器中&#xff0c;如数控机床、工业机器人、光学仪器、医疗设备和自动化设备等&#xff0c;尤其是医疗领域&#xff0c;其应用最为广泛。 1、手术机器人&#xff1a;手术机器人是医…

虚拟列表方案实现

虚拟列表 长列表优化的2种思路&#xff1a; 分片渲染只渲染可视区域 基本概念 进程&#xff1a;这个概念比较大。每开一个应用程序都会分配一个独立的进程&#xff0c;等于每个应用都是一个进程(当然也有一个应用有很多进程)&#xff0c;进程是一个更大的概念&#xff0c;一个进…