使用Leaflet进行船舶航行警告区域绘制实战
目录
前言
一、坐标格式转换
1、数据初认识
2、将区域分割成多个点
3、数据转换
4、数据转换调用
二、WebGIS展示空间位置信息
1、定义底图
2、Polygon的可视化
3、实际效果
三、总结
前言
通常而言,海事部门如海事局,通常会在所述的管辖区域内进行航行管控。比如会在海面上进行采砂作业、或者是拖带作业、人员落水、沉船碍航等作业需求。这些消息通常会先由各海域属地的海事局进行消息的发布,可以在他们的官方网站上看到,如以下的信息:

闽航警34/24 台湾海峡
2024年7月15日至2024年10月15日,每日24小时,在以下四点连线范围内的安全作业区进行采砂作业,24-12.27N 118-24.04E ,24-10.25N 118-26.30E ,24-08.17N 118-24.05E ,
24-10.19N 118-21.78E 。无关船舶禁止驶入。
福建海事局。
在图上的信息中, 其实就包含一些很重要的时空信息,比如预警的时间是2024年7月15日到10月15日,中间差不多有三个月的时间,在这三个月的时间内,是不允许其它的船舶驶入上述的区域内的。作为GIS开发者,我们除了重点关注预警的时间范围,更关心的是空间范围。如果假定是一些商用船舶,我们就可以提取这些空间数据,在进行航线规划的时候,绕开这些作业区域,不仅能保证航行安全,也是加快作业效率。关注新闻的朋友一定知道,一些重要的行动需要对某一些区域进行管控的,也是会经过地方海事局进行公开位置,然后在规定的时间内进行。而这些区域不仅仅是一块区域,而是多个区域同时进行,从而锤炼不同的队伍的实战能力。如下图发布的航行警告中就包括6个区域(即面数据)。

本文即以Leaflet为例,重点讲解如何将上述的空间信息转换为可以在地图上浏览的位置信息。首先使用Java语言将上面的涉及的空间坐标(度分秒)调整为常见的经纬度坐标。然后根据不同的点连接成多个面,最后将这些Polygon面数据叠加到Leaflet中,从而实现航行警告中的相关区域和地图的融合。通过本文,您可以掌握怎么使用Java把度分秒坐标转为标准格式,还可以掌握在Leaflet当中如何把这些Polygon进行空间叠加。
一、坐标格式转换
其实度分秒这种格式的坐标在日常生活中也是非常常见的,读起来也比较顺畅。但是通常,我们在WebGIS上进行位置展示时,还是习惯于使用经纬度格式的坐标。因此这里主要讲解如何将度分秒的坐标转为标准经纬度信息。转换它的方法其实很简单,本人比较熟悉Java语言,因此后台的转换方法均使用Java编写,除了使用Java来开发这个功能,其他的编程语言同样可以实现。
1、数据初认识
要想实现格式的转换,首先我们要对原文中的格式进行解释。可以看到在原文中的,它的具体内容中包含位置面信息内容如下:
区域一为下列4点连线水域: 25°15′26"N/120°29′20"E,24°50′30"N/120°05′45"E, 25°04′32"N/119°51′22"E,25°28′12"N/120°14′30"E。
区域二为下列4点连线水域: 26°07′00"N/121°57′00"E,25°30′00"N/121°57′00"E, 25°30′00"N/121°28′00"E,26°07′00"N/121°28′00"E。
区域三为下列4点连线水域: 25°34′00"N/122°50′00"E,25°03′00"N/122°50′00"E, 25°03′00"N/122°11′00"E,25°34′00"N/122°11′00"E。
区域四为下列4点连线水域: 22°56′00"N/122°40′00"E,23°38′00"N/122°51′00"E, 23°38′00"N/123°23′00"E,22°56′00"N/123°09′00"E。
区域五为下列4点连线水域: 21°14′00"N/121°33′00"E,21°33′00"N/121°18′00"E, 21°07′00"N/120°43′00"E,20°48′00"N/120°59′00"E。
区域六为下列4点连线水域: 22°43′00"N/119°14′00"E,22°10′00"N/119°06′00"E, 21°33′00"N/120°29′00"E,22°09′00"N/120°32′00"E。
每个区域的都是这种形式的数据,这也为我们进行统一转换提供了有效的数据格式的基础。可以看到,每个区域都是一条数据,不同的点位(point)之间用逗号分隔,而坐标点内部使用/来分割。因此我们要想识别每一个区域的信息,其实也很简单。首先将字符串按逗号分隔,这样就可以形成多个点位的度分秒字符串。然后再分割/字符串,从而得到度分秒的位置。
2、将区域分割成多个点
按照前面介绍得分割方法,首先根据逗号,将目标区域字符串分割成多个点。关键的代码如下:
/*** 将四个点的字符串统一解析为经纬度数组* @param bboxString*/
private static void str2Point(String bboxString) {//将经纬度单位中的分改为英文状态下的分bboxString = bboxString.replaceAll("′", "\'");String [] points = bboxString.split(",");for (String str : points) {String [] latLon = str2LatLon(str);System.out.println(str + " = (" + latLon[0] + "," +latLon[1] + ")");}
}
将经纬度单位中的分改为英文状态下的分是为了在后续的解析中进行数据容错。
3、数据转换
将点从区域点字符串提取出来之后,我们需要将数据进行提取和转换两个步骤。提取是按照/将字符进行分割,而转换是将度分秒的数据转换为标准的经纬度数据。关键代码如下:
/**
* 将单个度分秒坐标转经纬度坐标数组
* @param latLonStr
* @return
*/
private static String [] str2LatLon(String latLonStr) {String lat = latLonStr.split("\\/")[0];String lon = latLonStr.split("\\/")[1];String latSuffix = lat.substring(lat.length() -1 );//取出纬度后缀N,S String lonSuffix = lon.substring(lon.length() -1 );//取出纬度后缀W,EString newLat =String.valueOf(LatLngUtil.dfm2LatLng(lat.substring(0,lat.length()-1)));String newLon =String.valueOf(LatLngUtil.dfm2LatLng(lon.substring(0,lon.length()-1)));newLat = latSuffix.equalsIgnoreCase("S") ? "-" + newLat : newLat;newLon = lonSuffix.equalsIgnoreCase("W") ? "-" + newLon : newLon;return new String[]{newLat,newLon};
}
这里还是将经纬度转换的方法提供出来,防止大家在第一次看的时候有所迷糊。
/*** 度分秒转经纬度** @param dms 116°25'7.85"* @return 116.418847*/
public static double dfm2LatLng(String dms) {if (dms == null) return 0;try {dms = dms.replace(" ", "");String[] str2 = dms.split("°");if (str2.length < 2) return 0;int d = Integer.parseInt(str2[0]);String[] str3 = str2[1].split("\'");if (str3.length < 2) return 0;int f = Integer.parseInt(str3[0]);String str4 = str3[1].substring(0, str3[1].length() - 1);double m = Double.parseDouble(str4);double fen = f + (m / 60);double du = (fen / 60) + Math.abs(d);if (d < 0) du = -du;return Double.parseDouble(String.format("%.7f", du));} catch (Exception e) {e.printStackTrace();}return 0;
}
4、数据转换调用
调用的函数比较简单,这里采用test的测试用例调用为例进行讲解,当然这里不限于使用何种方法。
@Test
public void testBoundaryConvert() {/*区域一为下列4点连线水域: 25°15′26"N/120°29′20"E,24°50′30"N/120°05′45"E,25°04′32"N/119°51′22"E,25°28′12"N/120°14′30"E区域二为下列4点连线水域: 26°07′00"N/121°57′00"E,25°30′00"N/121°57′00"E,25°30′00"N/121°28′00"E,26°07′00"N/121°28′00"E 区域三为下列4点连线水域: 25°34′00"N/122°50′00"E,25°03′00"N/122°50′00"E,25°03′00"N/122°11′00"E,25°34′00"N/122°11′00"E 区域四为下列4点连线水域: 22°56′00"N/122°40′00"E,23°38′00"N/122°51′00"E,23°38′00"N/123°23′00"E,22°56′00"N/123°09′00"E 区域五为下列4点连线水域: 21°14′00"N/121°33′00"E,21°33′00"N/121°18′00"E,21°07′00"N/120°43′00"E,20°48′00"N/120°59′00"E 区域六为下列4点连线水域: 22°43′00"N/119°14′00"E,22°10′00"N/119°06′00"E,21°33′00"N/120°29′00"E,22°09′00"N/120°32′00"E */List<String> bboxList = new ArrayList<String>();bboxList.add("25°15′26\"N/120°29′20\"E,24°50′30\"N/120°05′45\"E,25°04′32\"N/119°51′22\"E,25°28′12\"N/120°14′30\"E");//区域一bboxList.add("26°07′00\"N/121°57′00\"E,25°30′00\"N/121°57′00\"E,25°30′00\"N/121°28′00\"E,26°07′00\"N/121°28′00\"E");//区域二bboxList.add("25°34′00\"N/122°50′00\"E,25°03′00\"N/122°50′00\"E,25°03′00\"N/122°11′00\"E,25°34′00\"N/122°11′00\"E");//区域三bboxList.add("22°56′00\"N/122°40′00\"E,23°38′00\"N/122°51′00\"E,23°38′00\"N/123°23′00\"E,22°56′00\"N/123°09′00\"E");//区域四bboxList.add("21°14′00\"N/121°33′00\"E,21°33′00\"N/121°18′00\"E,21°07′00\"N/120°43′00\"E,20°48′00\"N/120°59′00\"E");//区域五bboxList.add("22°43′00\"N/119°14′00\"E,22°10′00\"N/119°06′00\"E,21°33′00\"N/120°29′00\"E,22°09′00\"N/120°32′00\"E");//区域六int index = 1;for(String bbox : bboxList) {System.out.println("区域"+index+"位置字符串:" + bbox);str2Point(bbox);System.out.println("--------------------------------------------------------------");index ++;}}
在控制台中执行上述代码之后,可以看到以下结果,说明执行成功,同时数据均已成功的转换。

解析的数据内容如下(取其中的一个点为例):
区域1位置字符串:25°15′26"N/120°29′20"E,24°50′30"N/120°05′45"E,25°04′32"N/119°51′22"E,25°28′12"N/120°14′30"E
25°15'26"N/120°29'20"E = (25.2572222,120.4888889)
24°50'30"N/120°05'45"E = (24.8416667,120.0958333)
25°04'32"N/119°51'22"E = (25.0755556,119.8561111)
25°28'12"N/120°14'30"E = (25.47,120.2416667)
在经过上述的方法将度分秒坐标转换为标准经纬度坐标后,我们就可以将坐标叠加到Leaflet当中进行空间展示,下一节来深入阐述。
二、WebGIS展示空间位置信息
当我们得到了经过转换过的空间标准经纬度坐标信息后,我们就可以将这些空间数据转换为面数据或者点数据,然后使用WebGIS框架,比如Leaflet等进行信息的几种展示。
1、定义底图
定义定图的方法非常简单,这里我们直接给出在应用程序中使用天地图的方法,请注意如果在拷贝这里的代码时,一定要注意替换这里的令牌。
var map = L.map('mapid').setView([23.785345, 120.948486], 7);var tdt_client_key = "473af7dc18cafb6b993616a0ce8e1ead";//天地图客户端的keyL.tileLayer('http://t0.tianditu.gov.cn/img_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=' +tdt_client_key, {maxZoom: 18,attribution: 'Map data © <a href="http://www.tianditu.gov.cn/">TianDiTu</a>, <a href="http://www.esri.com/">Esri</a> contributors, <a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>'
}).addTo(map);//标签
L.tileLayer('http://t1.tianditu.gov.cn/cva_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cva&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk='+ tdt_client_key, {maxZoom: 18
}).addTo(map);
2、Polygon的可视化
在定义的基础的底图之后,下面将第一节转换好的所有的坐标进行Polygon空间展示。关键代码如下:
var style = {"color":"red","fillColor":"red","weight":2};L.polygon([[25.2572222,120.4888889],[24.8416667,120.0958333],[25.0755556,119.8561111],[25.47,120.2416667]],style).addTo(map).bindPopup("区域一.");L.polygon([[26.1166667,121.95],[25.5,121.95],[25.5,121.4666667],[26.1166667,121.4666667]],style).addTo(map).bindPopup("区域二.");L.polygon([[25.5666667,122.8333333],[25.05,122.8333333],[25.05,122.1833333],[25.5666667,122.1833333]],style).addTo(map).bindPopup("区域三.");L.polygon([[22.9333333,122.6666667],[23.6333333,122.85],[23.6333333,123.3833333],[22.9333333,123.15]],style).addTo(map).bindPopup("区域四.");L.polygon([[21.2333333,121.55],[21.55,121.3],[21.1166667,120.7166667],[20.8,120.9833333]],style).addTo(map).bindPopup("区域五.");L.polygon([[22.7166667,119.2333333],[22.1666667,119.1],[21.55,120.4833333],[22.15,120.5333333]],style).addTo(map).bindPopup("区域六.");
请注意,在上述的例子中,我们使用一个统一的样式选型,style,它表示展示的Polygon面的颜色和填充颜色都是红色,如果您想设置自己喜欢的颜色也是可以的。
3、实际效果
经过上述的两个步骤,我们已经实现了地图对象的定义和绑定,同时我们将转换好的坐标信息进行赋值,让6个面在地图上进行可视化。

以上的红色区域就是我们转换的六个区域,不知道大家看了这六个区域,有没有勾起点啥记忆呢。 这里不多说,大家可以去相关网站搜索这个区域之前发生过什么就大致清楚了。
三、总结
以上就是本文的主要内容,本文即以Leaflet为例,重点讲解如何将上述的空间信息转换为可以在地图上浏览的位置信息。首先使用Java语言将上面的涉及的空间坐标(度分秒)调整为常见的经纬度坐标。然后根据不同的点连接成多个面,最后将这些Polygon面数据叠加到Leaflet中,从而实现航行警告中的相关区域和地图的融合。通过本文,您可以掌握怎么使用Java把度分秒坐标转为标准格式,还可以掌握在Leaflet当中如何把这些Polygon进行空间叠加。行文仓促,定有不足之处,真诚期待各位专家朋友在评论区批评指正,不甚感激。
相关文章:
使用Leaflet进行船舶航行警告区域绘制实战
目录 前言 一、坐标格式转换 1、数据初认识 2、将区域分割成多个点 3、数据转换 4、数据转换调用 二、WebGIS展示空间位置信息 1、定义底图 2、Polygon的可视化 3、实际效果 三、总结 前言 通常而言,海事部门如海事局,通常会在所述的管辖区域内…...
用Ollama 和 Open WebUI本地部署Llama 3.1 8B
说明: 本人运行环境windows11 N卡6G显存。部署Llama3.1 8B 简介 Ollama是一个开源的大型语言模型服务工具,它允许用户在自己的硬件环境中轻松部署和使用大规模预训练模型。Ollama 的主要功能是在Docker容器内部署和管理大型语言模型(LLM&…...
计算机毕业设计选题推荐-学生作业管理系统-Java/Python项目实战
✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…...
RIP实验
实验拓扑: 实验要求: R1-R2-R3-R4-R5:RIP 100 运行版本2 R6-R7:RIP 200 运行版本1 1.使用合理IP地址规划网络,各自创建环回接口 2.R1创建环回 172.16.1.1/24 172.16.2.1/24 172.16.3.1/24 3.要求R3使用R2访问R1环…...
手把手教你如何在宝塔上添加可道云登录页面的ICP备案信息,别跟权威开玩笑。
如何在宝塔上添加可道云登录页面的ICP备案信息 事情的原由来我们开始吧首先登录你的宝塔页面双击打开index.php文件保存退出即可 感谢大佬,希望对被查到的朋友有所帮助! 事情的原由 今天突然收到腾讯云发来的一封Email,说我需要整改我的网站…...
基于JSP技术的大学生校园兼职系统
你好呀,我是计算机学姐码农小野!如果有相关需求,可以私信联系我。 开发语言:JSP 数据库:MySQL 技术:JSPJavaBeans 工具:MyEclipse,Tomcat,Navicat 系统展示 首页 学…...
VSCode在windows系统下的配置简单版
参考链接 从零开始的vscode安装及环境配置教程(C/C)(Windows系统)_vscode搭建编译器环境-CSDN博客 vscode生成tasks.json、launch.json、c_cpp_properties.json文件_vscode生成launch.json-CSDN博客 自动生成配置文件简单方便!!! 运行c代…...
C++初学(9)
9.1、结构简介 虽然数组能够和存储多个元素,但所有元素必须相同,也就是说,同一个数组不能既存放int类型也存放float类型,而C的结构可以满足要求。结构是一种比数组更灵活的数据格式,因为同一个结构可以存储多种类型的…...
ardupilot开发 --- 网络技术综述 篇
不信人间有白头 一些概念参考文献 一些概念 以太网、局域网、互联网 以太网(Ethernet),是一种计算机局域网技术。以太网是一种有线网络技术,网络传输介质包括:以太网电缆,如常见的双绞线、光纤等。根据传输速度,可以氛…...
一文详解大模型蒸馏工具TextBrewer
原文:https://zhuanlan.zhihu.com/p/648674584 本文分享自华为云社区《TextBrewer:融合并改进了NLP和CV中的多种知识蒸馏技术、提供便捷快速的知识蒸馏框架、提升模型的推理速度,减少内存占用》,作者:汀丶。 TextBre…...
Go语言加Vue3零基础入门全栈班10 Go语言+gRPC用户微服务项目实战 2024年07月31日 课程笔记
概述 如果您没有Golang的基础,应该学习如下前置课程。 Golang零基础入门Golang面向对象编程Go Web 基础Go语言开发REST API接口_20240728Go语言操作MySQL开发用户管理系统API教程_20240729Redis零基础快速入门_20231227GoRedis开发用户管理系统API实战_20240730Mo…...
ChatGPT能代替网络作家吗?
最强AI视频生成:小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频百万播放量https://aitools.jurilu.com/ 当然可以!只要你玩写作AI玩得6,甚至可以达到某些大神的水平! 看看大神、小白、AI输出内容的区…...
Http自定义Header导致的跨域问题
最近写一个小项目,前后端分离,在调试过程中访问远程接口,出现了CORS问题,接口使用的laravel框架,于是添加了解决跨域的中间件,但是前端显示仍存在跨域问题,以为自己写的有问题,检查了…...
python 中 file.read(), file.readline()和file.readlines()区别和用法
python 中 file.read(), file.readline()和file.readlines()区别和用法 文章目录 python 中 file.read(), file.readline()和file.readlines()区别和用法1. file.read()2. file.readline()3. file.readlines()4. 总结5. 注意事项 file.read(), file.readline(), 和 file.readli…...
python 学习: np.pad
在NumPy中,np.pad函数用于对数组进行填充(padding),即在数组的边界处添加额外的值。这在图像处理、信号处理或任何需要扩展数据边界的场景中非常有用。 以下是np.pad函数的一些关键参数和使用示例: array:…...
等保2.0 | 人大金仓数据库测评
人大金仓数据库,全称为金仓数据库管理系统KingbaseES(简称:金仓数据库或KingbaseES),是北京人大金仓信息技术股份有限公司自主研制开发的具有自主知识产权的通用关系型数据库管理系统。以下是关于人大金仓数据库的详细…...
AIGC赋能智慧农业:用AI技术绘就作物生长新蓝图
( 于景鑫 国家农业信息化工程技术研究中心)随着人工智能技术的日新月异,AIGC(AI-Generated Content,AI生成内容)正在各行各业掀起一场革命性的浪潮。而在智慧农业领域,AIGC技术的应用也正迸发出耀眼的火花。特别是在作物生长管理方面,AIGC有望彻底改变传…...
yolov8蒸馏(附代码-免费)
首先蒸馏是什么? 模型蒸馏(Model Distillation)是一种用于在计算机视觉中提高模型性能和效率的技术。在模型蒸馏中,通常存在两个模型,即“教师模型”和“学生模型”。 为什么需要蒸馏? 在不增加模型计算…...
Flink-StarRocks详解:第五部分查询数据湖(第55天)
系列文章目录 4.查询数据湖 4.1 Catalog 4.1.1 概述 4.1.1.1 基本概念 4.1.1.2 Catalog 4.1.1.3 访问Catalog 4.1.2 Default catalog 4.1.3 External Catalog 4.2 文件外部表 4.2.1 使用限制 4.2.2 开源版本语法 4.2.3 阿里云版本 5. 查询及优化 文章目录 系列文章目录前言4.查…...
【MySQL】常用数据类型
目录 数据类型 数据类型分类 数值类型 tinyint类型 bit类型 小数类型 float decimal 字符串类型 char varchar 日期和时间类型 enum和set 数据类型 数据类型分类 数值类型 tinyint类型 tinyint类型只占用一个字节类似于编程语言中的字符char。有带符号和无符号两…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
