C# 经纬度坐标的精度及WGS84(谷歌)、GCJ02(高德)、BD09(百度)坐标相互转换(含高精度转换)
1. 概述
WGS-84坐标系(World Geodetic System一1984 Coordinate System)是一种国际上采用的地心坐标系,GCJ-02是由中国国家测绘局(G表示Guojia国家,C表示Cehui测绘,J表示Ju局)制订的地理信息系统的坐标系统,BD09坐标系(Baidu Coordinate System)是百度地图使用的一种坐标系,它基于GCJ-02坐标系进行了加密偏移,适用于百度地图定位和导航服务。谷歌采用的是WGS-84坐标系,高德采用的是GCJ-02坐标系,也称火星坐标系。它们都是用经纬度表示其坐标。
2. 精度
我们通常在手机上见到的经纬度是用度、分、秒表示的,但是在以上三种坐标体系中常用的是以为度为单位的整数加6位小数的数值表示的。有时我们看到经纬度小数点后面很多位,似乎精度很高,这有意义吗?实际在我们生活中,GPS、北斗导航或定位时精确到几米就够用了,因为在几米范围内,你应该是能看到你要找的地方的。而“米”这个精度,正是经纬度小数点后的第5位,第6位则是分米,那么以上三种坐标用6位小数的精度,是能满足我们日常生活需要了。如果是要更高精度定位、室内定位等,单用GPS是满足不了的,需要使用UWB、差分等定位技术。
纬度小数点后面的每位精度是多少?一度的精度是多少?其实很好计算,我们知道,纬度是平行于赤道的圆,所以每度的长度是一样的。虽然地球是个不规则的椭圆球体,但我们可以假设地图是个标准球体,已知地球半径R是6371公里,因此垂直于赤道穿越地心圆周长是2πR=40009.88公里,除以360º,则1º=111.14公里,即纬度差1º,则差出约111公里,那么0.1º自然是11.1公里,0.01是1.11公里,0.001是111米,0.0001是11.1米,0.00001也就是1.11米了,从这儿可以看出小数点第5位其精度是米了,依次类推,小数点后第6位是分米,第7位是厘米,第8位是毫米,再往后去要求精度,实际意义已经不大了。
经度呢?道理一样,但不同的是经度构成的圆都是穿越地心的,赤道的一度的长度最长,南北极最短,不同的纬度上,经度一度的长度是不一样的,我们可以通过几何学去求解。假设纬度是θ,在此纬度的纬线构成的平行于赤道的圆半径则是地球半径乘以Cosθ,周长自然是2πRCosθ,再除以360º,即可得出此纬度上每度经度的长度,这个大家可以自己去根据自己所处的纬度实际去算一下。我们以赤道最大的长度来看,经度也是1º=111.14公里,跟纬度一样,其后面的小数点位代表的精度也跟纬度是一样的,就不再赘述了。
综上所述,经纬度的精度我们可以粗略地认为是一样的,即:
小数点后1位:约11114米(11公里)
小数点后2位:约1111米(1公里)
小数点后3位:约111米
小数点后4位:约11米
小数点后5位:约1米
小数点后6位:约0.1米(10厘米)
小数点后7位:约0.01米(1厘米)
小数点后8位:约0.001米(1毫米)
3. 经纬度坐标WGS84、GCJ-02、BD-09坐标相互转换代码
public class WGS84
{private const double pi = Math.PI;private const double xPi = Math.PI * 3000.0d / 180.0d;/*** 判断经纬度是否超出中国境内*/public bool OutOfChina(double latitude, double longitude){if (longitude < 72.004 || longitude > 137.8347 || latitude < 0.8293 || latitude > 55.8271)return true;return false;}private double Offset_gcj02_latitude(double x, double y){double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.Sqrt(Math.Abs(x));ret += (20.0 * Math.Sin(6.0 * x * pi) + 20.0 * Math.Sin(2.0 * x * pi)) * 2.0 / 3.0;ret += (20.0 * Math.Sin(y * pi) + 40.0 * Math.Sin(y / 3.0 * pi)) * 2.0 / 3.0;ret += (160.0 * Math.Sin(y / 12.0 * pi) + 320 * Math.Sin(y * pi / 30.0)) * 2.0 / 3.0;return ret;}private double Offset_gcj02_longitude(double x, double y){double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.Sqrt(Math.Abs(x));ret += (20.0 * Math.Sin(6.0 * x * pi) + 20.0 * Math.Sin(2.0 * x * pi)) * 2.0 / 3.0;ret += (20.0 * Math.Sin(x * pi) + 40.0 * Math.Sin(x / 3.0 * pi)) * 2.0 / 3.0;ret += (150.0 * Math.Sin(x / 12.0 * pi) + 300.0 * Math.Sin(x / 30.0 * pi)) * 2.0 / 3.0;return ret;}private void Gcj02_delta(double lat, double lon, ref double dLat, ref double dLon){const double a = 6378245.0; // 长半轴const double ee = 0.00669342162296594323; // 扁率double radLat = lat / 180.0 * pi;double magic = Math.Sin(radLat);magic = 1 - ee * magic * magic;double sqrtMagic = Math.Sqrt(magic);dLat = (Offset_gcj02_latitude(lon - 105.0, lat - 35.0) * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);dLon = (Offset_gcj02_longitude(lon - 105.0, lat - 35.0) * 180.0) / (a / sqrtMagic * Math.Cos(radLat) * pi);}/// <summary>/// WGS84坐标转换为GCJ02坐标/// </summary>/// <param name="wgsLat">WGS84纬度坐标(度)</param>/// <param name="wgsLon">WGS84经度坐标(度)</param>/// <param name="gcjLat">返回GCJ02纬度坐标(度)</param>/// <param name="gcjLon">返回GCJ02经度坐标(度)</param>public void Wgs84_to_gcj02(double wgsLat, double wgsLon, ref double gcjLat, ref double gcjLon){if (OutOfChina(wgsLat, wgsLon)){gcjLat = wgsLat;gcjLon = wgsLon;return;}double lat_offset = 0, lon_offset = 0;Gcj02_delta(wgsLat, wgsLon, ref lat_offset, ref lon_offset);gcjLat = wgsLat + lat_offset;gcjLon = wgsLon + lon_offset;}/// <summary>/// WGS84坐标转换为BD09坐标/// </summary>/// <param name="wgsLat">WGS84纬度坐标(度)</param>/// <param name="wgsLon">WGS84经度坐标(度)</param>/// <param name="bdLat">返回BD09纬度坐标</param>/// <param name="bdLon">返回BD09经度坐标</param>public void Wgs84_to_bd09(double wgsLat, double wgsLon, ref double bdLat, ref double bdLon){double gcjLat = 0.0d, gcjLon = 0.0d;Wgs84_to_gcj02(wgsLat, wgsLon, ref gcjLat, ref gcjLon);Gcj02_to_bd09(gcjLat, gcjLon, ref bdLat, ref bdLon);}/// <summary>/// GCJ02坐标转换为WGS84坐标(方法1:精度约为米,理论误差10米之内)/// </summary>/// <param name="gcjLat">GCJ02纬度坐标</param>/// <param name="gcjLon">GCJ02经度坐标</param>/// <param name="wgsLat">返回WGS84纬度坐标</param>/// <param name="wgsLon">返回WGS84经度坐标</param>public void Gcj02_to_wgs84(double gcjLat, double gcjLon, ref double wgsLat, ref double wgsLon){if (OutOfChina(gcjLat, gcjLon)){wgsLat = gcjLat;wgsLon = gcjLon;return;}const double a = 6378245.0; // 长半轴const double ee = 0.00669342162296594323; // 扁率double dLat = Offset_gcj02_latitude(gcjLon - 105.0, gcjLat - 35.0);double dLng = Offset_gcj02_longitude(gcjLon - 105.0, gcjLat - 35.0);double radlat = gcjLat / 180.0 * pi;double magic = Math.Sin(radlat);magic = 1 - ee * magic * magic;double sqrtmagic = Math.Sqrt(magic);dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi);dLng = (dLng * 180.0) / (a / sqrtmagic * Math.Cos(radlat) * pi);double mgLat = gcjLat + dLat;double mgLng = gcjLon + dLng;wgsLon = gcjLon * 2 - mgLng;wgsLat = gcjLat * 2 - mgLat;}/// <summary>/// GCJ02坐标转换为WGS84坐标(方法2:高精度,几乎相等)/// </summary>/// <param name="gcjLat">GCJ02纬度坐标</param>/// <param name="gcjLon">GCJ02经度坐标</param>/// <param name="wgsLat">返回WGS84纬度坐标</param>/// <param name="wgsLon">返回WGS84经度坐标</param>/// <param name="threshold">精度阀值,默认为1e-17,转换后几乎相等</param>public void Gcj02_to_wgs84_2(double gcjLat, double gcjLon, ref double wgsLat, ref double wgsLon, double threshold = 1e-17){if (OutOfChina(gcjLat, gcjLon)){wgsLat = gcjLat;wgsLon = gcjLon;return;}const int maxIterations = 1000;double[] latBounds = { gcjLat - 0.5, gcjLat + 0.5 };double[] lonBounds = { gcjLon - 0.5, gcjLon + 0.5 };// 使用二分法逼近纬度double currentLat = (latBounds[0] + latBounds[1]) / 2;double currentLon = (lonBounds[0] + lonBounds[1]) / 2;int iteration = 0;double dLat, dLon;double tmpLat = 0.0d;double tmpLon = 0.0d;do{currentLat = (latBounds[0] + latBounds[1]) / 2;currentLon = (lonBounds[0] + lonBounds[1]) / 2;Wgs84_to_gcj02(currentLat, currentLon, ref tmpLat, ref tmpLon);dLat = tmpLat - gcjLat;dLon = tmpLon - gcjLon;if (dLat > 0){latBounds[1] = currentLat;}else{latBounds[0] = currentLat;}if (dLon > 0){lonBounds[1] = currentLon;}else{lonBounds[0] = currentLon;}iteration++;} while ((Math.Abs(dLat) > threshold || Math.Abs(dLon) > threshold) && iteration < maxIterations);wgsLat = currentLat;wgsLon = currentLon;}/// <summary>/// GCJ02坐标转换为BD09坐标/// </summary>/// <param name="gcjLat">GCJ02纬度坐标</param>/// <param name="gcjLon">GCJ02经度坐标</param>/// <param name="bdLat">返回BD09纬度坐标</param>/// <param name="bdLon">返回BD09经度坐标</param>public void Gcj02_to_bd09(double gcjLat, double gcjLon, ref double bdLat, ref double bdLon){double z = Math.Sqrt(gcjLon * gcjLon + gcjLat * gcjLat) + 0.00002 * Math.Sin(gcjLat * xPi);double theta = Math.Atan2(gcjLat, gcjLon) + 0.000003 * Math.Cos(gcjLon * xPi);bdLon = z * Math.Cos(theta) + 0.0065;bdLat = z * Math.Sin(theta) + 0.006;}/// <summary>/// BD09坐标转换为GCJ02坐标(方法1,精度约为分米,理论误差小于1米)/// </summary>/// <param name="bdLat">BD09纬度坐标</param>/// <param name="bdLon">BD09经度坐标</param>/// <param name="gcjLat">返回GCJ02纬度坐标</param>/// <param name="gcjLon">返回GCJ02经度坐标</param>public void Bd09_to_gcj02(double bdLat, double bdLon, ref double gcjLat, ref double gcjLon){double x = bdLon - 0.0065;double y = bdLat - 0.006;double z = Math.Sqrt(x * x + y * y) - 0.00002 * Math.Sin(y * xPi);double theta = Math.Atan2(y, x) - 0.000003 * Math.Cos(x * xPi);gcjLon = z * Math.Cos(theta);gcjLat = z * Math.Sin(theta);}/// <summary>/// BD09坐标转换为GCJ02坐标(方法2,高精度,转换后几乎相等)/// </summary>/// <param name="bdLat">BD09纬度坐标</param>/// <param name="bdLon">BD09经度坐标</param>/// <param name="gcjLat">返回GCJ02纬度坐标</param>/// <param name="gcjLon">返回GCJ02经度坐标</param>/// <param name="threshold">精度阀值,默认为1e-17,转换后几乎相等</param>public void Bd09_to_gcj02_2(double bdLat, double bdLon, ref double gcjLat, ref double gcjLon, double threshold = 1e-17){double lon = bdLon;double lat = bdLat;double x = lon - 0.0065;double y = lat - 0.006;gcjLon = x;gcjLat = y;double tempLat = 0.0d;double tempLon = 0.0d;Gcj02_to_bd09(gcjLat, gcjLon, ref tempLat, ref tempLon);double dx = tempLon - lon;double dy = tempLat - lat;while (Math.Abs(dx) > threshold || Math.Abs(dy) > threshold)//回归{gcjLon -= dx;gcjLat -= dy;Gcj02_to_bd09(gcjLat, gcjLon, ref tempLat, ref tempLon);dx = tempLon - lon;dy = tempLat - lat;}}/// <summary>/// BD09坐标转换为WGS84坐标(方法1,精度约为米或十几米左右)/// </summary>/// <param name="bdLat">BD09纬度坐标</param>/// <param name="bdLon">BD09经度坐标</param>/// <param name="wgsLat">返回WGS84纬度坐标</param>/// <param name="wgsLon">返回WGS84经度坐标</param>public void Bd09_to_wgs84(double bdLat, double bdLon, ref double wgsLat, ref double wgsLon){double gcjLat = 0.0d, gcjLon = 0.0d;Bd09_to_gcj02(bdLat, bdLon, ref gcjLat, ref gcjLon);Gcj02_to_wgs84(gcjLat, gcjLon, ref wgsLat, ref wgsLon);}/// <summary>/// BD09坐标转换为WGS84坐标(方法2,高精度,转换后几乎相等)/// </summary>/// <param name="bdLat">BD09纬度坐标</param>/// <param name="bdLon">BD09经度坐标</param>/// <param name="wgsLat">返回WGS84纬度坐标</param>/// <param name="wgsLon">返回WGS84经度坐标</param>/// <param name="gcj_threshold">转换GCJ02精度阀值,默认为1e-17,转换后几乎相等</param>/// <param name="wgs_threshold">转换WGS84精度阀值,默认为1e-17,转换后几乎相等</param>public void Bd09_to_wgs84_2(double bdLat, double bdLon, ref double wgsLat, ref double wgsLon, double gcj_threshold = 1e-17, double wgs_threshold = 1e-17){double gcjLat = 0.0d, gcjLon = 0.0d;Bd09_to_gcj02_2(bdLat, bdLon, ref gcjLat, ref gcjLon, gcj_threshold);Gcj02_to_wgs84_2(gcjLat, gcjLon, ref wgsLat, ref wgsLon, wgs_threshold);}/// <summary>/// WGS84大地坐标转换为ECEF空间直角坐标/// </summary>/// <param name="lat">WGS84纬度坐标</param>/// <param name="lon">WGS84经度坐标</param>/// <param name="alt">WGS84高度坐标</param>/// <param name="x">返回ECEF空间X坐标</param>/// <param name="y">返回ECEF空间Y坐标</param>/// <param name="z">返回ECEF空间Z坐标</param>public void Wgs84_to_ecef(double lat, double lon, double alt, ref double x, ref double y, ref double z){const double a = 6378137.0; // WGS-84 椭球体的长半轴(赤道半径)const double f = 1 / 298.257223563; // 地球扁率const double e2 = 2 * f - f * f; // 0.00669437999014; WGS-84 椭球体的第一偏心率的平方double radLat = lat * pi / 180.0; // 将纬度转换为弧度double radLon = lon * pi / 180.0; // 将经度转换为弧度double N = a / Math.Sqrt(1 - e2 * Math.Sin(radLat) * Math.Sin(radLat)); // 椭球曲率半径x = (N + alt) * Math.Cos(radLat) * Math.Cos(radLon);y = (N + alt) * Math.Cos(radLat) * Math.Sin(radLon);z = (N * (1 - e2) + alt) * Math.Sin(radLat);}/// <summary>/// ECEF空间直角坐标转换为WGS84大地坐标/// </summary>/// <param name="x">ECEF空间X坐标</param>/// <param name="y">ECEF空间Y坐标</param>/// <param name="z">ECEF空间Z坐标</param>/// <param name="lat">返回WGS84纬度坐标</param>/// <param name="lon">返回WGS84经度坐标</param>/// <param name="alt">返回WGS84高度坐标</param>public void Ecef_to_wgs84(double x, double y, double z, ref double lat, ref double lon, ref double alt){const double a = 6378137.0; // WGS-84 椭球体的长半轴(赤道半径)const double f = 1.0 / 298.257223563; // 扁率const double e2 = 2 * f - f * f; // 0.00669437999014; WGS-84 椭球体的第一偏心率的平方const double b = a * (1 - f); // 6356752.314245; WGS-84 椭球体的短半轴(极半径)double p = Math.Sqrt(x * x + y * y);lon = Math.Atan2(y, x); // 计算经度// 迭代计算纬度double theta = Math.Atan2(z * a, p * b);double sinTheta = Math.Sin(theta);double cosTheta = Math.Cos(theta);lat = Math.Atan2(z + e2 * b * sinTheta * sinTheta * sinTheta,p - e2 * a * cosTheta * cosTheta * cosTheta);double N = a / Math.Sqrt(1 - e2 * Math.Sin(lat) * Math.Sin(lat));alt = p / Math.Cos(lat) - N;lat = lat * 180.0 / pi; // 转换为度数lon = lon * 180.0 / pi; // 转换为度数}}
4. 调用
因为返回经纬度坐标的变量使用的是ref关键字,所以必须先声明纬度、经度变量,例如WGS84坐标转GCJ-02坐标:
private WGS84 WGS = new WGS84();double WGSLat = 37.786787025540519d;
double WGSLng = 112.54513755035273d;double GCJLat = 0.0d;
double GCJLng = 0.0d;WGS.Wgs84_to_gcj02(WGSLat, WGSLng, ref GCJLat, ref GCJLng);string GCJLatString = GCJLat.ToString("R");
string GCJLng = GCJLng.ToString("R");
注意:代码中ToString()方法中用的是“R”参数,这样能把小数点后的位数全部显示出来,如果不加参数,只能显示小数点后13位。
其他坐标转换方法大致相同,参考上面的例子即可。
5. 说明
(1)转换代码中,转换方向是WGS84转GCJ-02,GCJ-02再转BD-09,回归转换时是BD-09转GCJ-02,GCJ-02再转WGS84。
(2)回归转换增加了高精度转换方法:Gcj02_to_wgs84_2()以及Bd09_to_gcj02_2(),由这两个方法组合成了第三个高精度转换方法Bd09_to_wgs84_2()。
(3) 回归的非高精度的转换方法足能满足我们正常应用,我测试过几次,BD-09转GCJ-02误差在小数点五六位,转WGS84一般在小数点第五位,也有在第四位上,但也就误差在1左右,即十几米。
(4)回归高精度转换方法,误差在小数点后15位左右,转换精度几乎一样。代码中的方法采用普通回归方法还是高精度回归方法,大家根据自己需求决定。
(5) GCJ-02转BD-09以及BD-09转GCJ-02(非高精度)使用的是xPi,而不是Pi(π),xPi = Pi * 3000.0 / 180.0,这跟其他方法中Pi是有区别的。
相关文章:
C# 经纬度坐标的精度及WGS84(谷歌)、GCJ02(高德)、BD09(百度)坐标相互转换(含高精度转换)
1. 概述 WGS-84坐标系(World Geodetic System一1984 Coordinate System)是一种国际上采用的地心坐标系,GCJ-02是由中国国家测绘局(G表示Guojia国家,C表示Cehui测绘,J表示Ju局)制订的地理信息系…...
案例:陌陌聊天数据分析
背景分析: 陌陌作为聊天平台每天都会有大量的用户在线,会出现大量的聊天数据,通过对 聊天数据的统计分析 ,可以更好的 对用户构建精准的 用户画像 ,为用户提供更好的服务以及实现 高 ROI 的平台运营推广ÿ…...
关闭谷歌浏览器(Google Chrome)的自动更新可以通过以下方法实现。具体操作步骤取决于你的操作系统。
关闭谷歌浏览器(Google Chrome)的自动更新可以通过以下方法实现。具体操作步骤取决于你的操作系统。 1. 在 Windows 上关闭 Chrome 自动更新2. 在 macOS 上关闭 Chrome 自动更新3. 在 Linux 上关闭 Chrome 自动更新4. 注意事项1. 在 Windows 上关闭 Chro…...
进程(完)
今天我们就补充一个小的知识点,查看进程树命令,来结束我们对linux进程的学习,那么话不多说,来看. 查看进程树 pstree 基本语法: pstree [选项] 优点:可以更加直观的来查看进程信息 常用选项: -p:显示进程的pid -uÿ…...
(劳特巴赫调试器学习笔记)四、Practice脚本.cmm文件编写
Lauterbach调试器 文章目录 Lauterbach调试器一、什么是Practice脚本文件二、cmm脚本使用示例总结 一、什么是Practice脚本文件 官方文档解释: 因为Practice脚本以cmm为后缀,所以大多数人叫它cmm脚本。 以tricore为例,在安装目录下ÿ…...
并行流parallelStream.map().collect()
一、使用场景 先贴代码 public static void main(String[] args) {List<String> stringList new ArrayList<>();List<Integer> integerList new ArrayList<>();int num 10000;for (int i 0;i<num;i){stringList.add(String.valueOf(i));}stri…...
2025最新版flink2.0.0安装教程(保姆级)
Flink支持多种安装模式。 local(本地)——本地模式 standalone——独立模式,Flink自带集群,开发测试环境使用 standaloneHA—独立集群高可用模式,Flink自带集群,开发测试环境使用 yarn——计算资源统一…...
软件测试小讲
大家好,我是程序员小羊! 前言: 在 Web 项目开发中,全面的测试是保证系统稳定性、功能完整性和良好用户体验的关键。下面是一个详细的 Web 项目测试点列表,涵盖了不同方面的测试: 1. 功能测试 确保应用…...
DP35 【模板】二维前缀和 ---- 前缀和
目录 一:题目 二:算法原理 三:代码实现 一:题目 题目链接:【模板】二维前缀和_牛客题霸_牛客网 二:算法原理 三:代码实现 #include <iostream> #include <vector> using name…...
C语言——分支语句
在现实生活中,我们经常会遇到作出选择和判断的时候,在C语言中也同样要面临作出选择和判断的时候,所以今天,就让我们一起来了解一下,C语言是如何作出选择判断的。 目录 1.何为语句? 2.if语句 2.1 if语句的…...
使用Docker安装Jenkins
1、准备 2、安装 详见: https://www.jenkins.io/doc/book/installing/ https://www.jenkins.io/zh/doc/book/installing/ https://www.jenkins-zh.cn/tutorial/get-started/install/ # 方式1: # 详见:https://www.jenkins.io/doc/book/inst…...
东方博宜OJ ——2395 - 部分背包问题
贪心入门 ————2395 - 部分背包问题 2395 - 部分背包问题题目描述输入输出样例问题分析贪心算法思路代码实现总结 2395 - 部分背包问题 题目描述 阿里巴巴走进了装满宝藏的藏宝洞。藏宝洞里面有 N (N < 100)堆金币,第i堆金币的总重量和总价值分别是mi,vi (l …...
【期中准备特辑】计组,电路,信号
计组 以点带面地复习书中内容! 指令体系结构(ISA)是计算机硬件和软件的分界面 世界上第一台电子计算机是 ENIAC(埃尼阿克) 第一代计算机采用电子管作为主要器件;第二代计算机采用晶体管;第三代…...
经典算法 判断一个图是不是树
判断一个图是不是树 问题描述 给一个以0 0结尾的整数对列表,除0 0外的每两个整数表示一条连接了这两个节点的边。假设节点编号不超过100000大于0。你只要判断由这些节点和边构成的图是不是树。是输出YES,不是输出NO。 输入样例1 6 8 5 3 5 2 6 4 5…...
力扣 283 移动零的两种高效解法详解
目录 方法一:两次遍历法 方法二:单次遍历交换法 两种方法对比 在解决数组中的零移动到末尾的问题时,我们需要保持非零元素的顺序,并原地修改数组。以下是两种高效的解法及其详细分析。 方法一:两次遍历法 思路分析…...
代码随想录第18天:二叉树
一、修剪二叉树(Leetcode 669) 递归法 class Solution:def trimBST(self, root: TreeNode, low: int, high: int) -> TreeNode:# 如果当前节点为空,直接返回空节点(递归终止条件)if root is None:return None# 如果…...
KMP算法核心笔记:前后缀本质与nextval实现
KMP算法核心笔记:前后缀本质与nextval实现 核心疑问:为什么用「前后缀」而非「最大子串」? 1. 结构唯一性 前后缀限定在字符串首尾区域,最大子串可位于任意位置只有前后缀能保证滑动后的有效对齐 2. 移动确定性 文本…...
Breeze 40A FOC 电调:Vfast 观测器技术赋能无人机精准动力控制
核心技术特性 1. 全新Vfast 观测器技术 基于先进矢量控制算法(FOC 驱动),实现电机状态实时精准观测,适配性优于传统 FOC 方案,兼容主流无人机动力配置。高效算法设计,输出功率与力效超越多数方波电调&…...
如何处理ONLYOFFICE文档服务器与Java Web应用间的安全认证和授权
如何处理ONLYOFFICE文档服务器与Java Web应用间的安全认证和授权? 处理 ONLYOFFICE 文档服务器与 Java Web 应用之间的安全认证和授权,通常涉及以下几个关键步骤和技术: 1. JWT (JSON Web Token) 认证 启用 JWT: ONLYOFFICE 文档…...
手机上的PDF精简版:随时随地享受阅读
在移动互联网时代,随时随地阅读电子书和文档已经成为许多人的习惯。无论是学习、工作还是娱乐,一款好用的PDF阅读器都是必不可少的工具。今天,我们要介绍的 思读PDF精简版,就是这样一款简洁而强大的PDF阅读工具,能够让…...
XCTF-web(一)
view_source F12ctrluctrlshiftiURL前添加:view-source:curl http://192.168.1.1robots 根据题目提示,查看一下robots.txt /flag_ls_h3re.php backup /index.php.bak ┌──(kali㉿kali)-[~] └─$ cat index.php.bak <html> <…...
字节跳动开源 Godel-Rescheduler:适用于云原生系统的全局最优重调度框架
背景 在云原生调度中,一次调度往往无法解决所有问题,需要配合重调度来优化资源分配和任务摆放。传统的重调度框架主要集中在识别异常节点或任务,并通过迁移或删除来解决。然而,这些框架往往只能解决局部问题,无法提供…...
贪心算法day9(合并区间)
1.合并区间 56. 合并区间 - 力扣(LeetCode) 对于这种区间问题,我们应该先排序根据排序的结果总结一些规律,进而的得出解决该问题的策略。 class Solution {public static int[][] merge(int[][] intervals) {//第一步进行左端点…...
插件化设计,打造个性化音乐体验!
打工人们你们好!这里是摸鱼 特供版~ 今天给大家带来一款超酷的音乐播放器——MusicFree,它不仅功能强大,还支持插件化设计,让你的音乐体验更加个性化! 推荐指数:★★★★★ 1. 插件化设计 功能强大&#…...
深入解析分类模型评估指标:ROC曲线、AUC值、F1分数与分类报告
标题:深入解析分类模型评估指标:ROC曲线、AUC值、F1分数与分类报告 摘要: 在机器学习中,评估分类模型的性能是至关重要的一步。本文详细介绍了四个核心评估指标:ROC曲线、AUC值、F1分数和分类报告。通过对比这些指标…...
2025第16届蓝桥杯省赛之研究生组F题01串求解
2025第16届蓝桥杯省赛之研究生组F题01串求解 一、题目概述二、解题思路2.1题目分析2.2解题思路 三、求解代码3.1求解步骤3.1.1求解x所在的二进制位数区间3.1.2求解总位数为cnt的含1数3.1.3求解cnt1~x之间的含1数 3.2完整代码3.3代码验证 四、小结 一、题目概述 给定一个由0,1,…...
【2-10】E1与T1
前言 之前我们简单介绍了人类从电话线思维到如今的数据报分组交换思维过渡时期的各种技术产物,今天我们重点介绍 E1/T1技术。 文章目录 前言1. 产生背景2. T13. E14. SONET4.1 OC-14.2 OC-3 及其它 5. SDH5.1. STM-1 6. SONET VS SDH后记修改记录 1. 产生背景 E1/…...
2025 年蓝桥杯 Java B 组真题解析分享
今年是我第二次参加蓝桥杯软件类Java B组的比赛,虽然赛前做了不少准备,但真正坐在考场上时,还是有种熟悉又紧张的感觉。蓝桥杯的题目一向以“基础创新”著称,今年也不例外,每道题都考验着我们对算法的理解、代码实现能…...
IMX6ULL2025年最新部署方案2在Ubuntu24.04上编译通过Qt5.12.9且部署到IMX6ULL正点原子开发板上
IMX6ULL2025年最新部署方案2:在Ubuntu24.04上编译通过Qt5.12.9且部署到IMX6ULL正点原子开发板上 前言 本篇方案部署是笔者这几天除了打蓝桥杯以外,笔者在研究的东西,现在写道这里的时候,笔者已经成功的在Ubuntu24.04上,使用默…...
通过微信APPID获取小程序名称
进入微信公众平台,登录自己的小程序后台管理端,在“账号设置”中找到“第三方设置” 在“第三方设置”页面中,将页面拉到最下面,即可通过appid获取到这个小程序的名称信息...
混合开发部署实战:PyInstaller + .NET 8 + Docker全链路配置
文章目录 一、PyInstaller打包Python环境1. 基础打包(Linux环境)2. 高级配置3. 验证打包结果 二、.NET 8与Python的集成模式1. 进程调用(推荐方案)2. REST API通信 三、Docker多阶段构建配置1. 完整Dockerfile示例2. 关键配置解析…...
使用 Sass 打造动态星空背景效果
在前端开发中,视觉效果越来越受到重视。本文将通过一个生动的示例,讲解如何利用 Sass 构建一个具有动态星空滚动效果的背景页面,同时也系统介绍 Sass 的核心功能与实践技巧。 一、Sass 的作用 Sass(Syntactically Awesome Style …...
低空经济有哪些GIS相关岗位?
在低空经济中,GIS(地理信息系统)技术发挥着重要作用。GIS开发工程师负责开发、维护和优化与低空经济相关的GIS系统,如无人机起降场布局、空域管理、气象监测等。一般会参与二、三维GIS项目数据处理与前端开发,以及相关…...
Python 垃圾回收机制全解析:内存释放与优化
在编写高效、稳定的 Python 程序时,内存管理往往是一个被忽视但至关重要的领域。对于 Python 开发者来说,最初的学习曲线通常集中在语法、库使用和应用框架上,而对于内存管理和垃圾回收(GC,Garbage Collection…...
性能优化实践
4.1 大规模量子态处理的性能优化 背景与问题分析 量子计算中的大规模量子态处理(如量子模拟、量子态可视化)需要高效计算和实时渲染能力。传统图形API(如WebGL)在处理高维度量子态时可能面临性能瓶颈,甚至崩溃(如表格中14量子比特时WebGL的崩溃)。而现代API(如WebGPU…...
opentelemetry笔记
span https://github.com/open-telemetry/opentelemetry-cpp/blob/f987c9c094f276336569eeea85f17e361de5e518/sdk/src/trace/span.h 在 OpenTelemetry C 的 sdk/src/trace 目录中,不同的 span 定义和实现是为了支持追踪(Tracing)功能的多样…...
【JavaScript】二十一、日期对象
文章目录 1、实例化日期对象2、相关方法3、时间戳4、案例:毕业🎓倒计时效果 1、实例化日期对象 获得当前时间 const date new Date()获得指定时间 const date new Date(2025-4-14 20:46:00) console.log(date)2、相关方法 方法作用说明getFullYear…...
GIT工具学习【1】:新安装git预操作
目录 1.写在前面2.为常用指令配置别名3.初始化4.解决中文乱码问题 1.写在前面 新安装git命令后,需要一些设置会用的比较的顺畅。 这篇文章只要跟着做即可,至于原理,后面会写清楚的。 2.为常用指令配置别名 #新建一个.bashrc touch ~/.bash…...
docker安装ES
ES安装步骤 1. 创建docker网络,使其docker内部通信 2. 下载 | 导入镜像文件(ES Kibana) 3. 创建容器,并访问 4. 安装Ik分词器(es对中文并不友好,所以需要安装IK分词使其适配中文) 1. 创建docke…...
【控制学】控制学分类
【控制学】控制学分类 文章目录 [TOC](文章目录) 前言一、工程控制论1. 经典控制理论2. 现代控制理论 二、生物控制论三、经济控制论总结 前言 控制学是物理、数学与工程的桥梁 提示:以下是本篇文章正文内容,下面案例可供参考 一、工程控制论 1. 经典…...
人工智能应用开发中常见的 工具、框架、平台 的分类、详细介绍及对比
以下是人工智能应用开发中常见的 工具、框架、平台 的分类、详细介绍及对比: 一、工具(Tools) 定义:用于完成特定任务的软件或库,通常专注于开发流程中的某个环节(如数据处理、模型调试、部署等ÿ…...
Linux磁盘格式化(mkfs、mkfs.xfs、mkfs.ext4)、Linux文件系统的校验(xfs_repair、fsck_ext4)
在Linux系统中,磁盘格式化和文件系统校验是系统管理的重要任务。以下是关键步骤和命令的总结: 磁盘格式化 1. 选择文件系统类型 XFS:适用于大文件和高并发场景,支持高性能和扩展性。ext4:成熟稳定的通用文件系统,适合大多数场景。2. 格式化命令 通用格式: sudo mkfs -…...
Android学习总结之git篇
Git 的原理时,你可以从数据结构、对象存储、引用管理、分支与合并等方面结合源码进行分析。以下是详细介绍: 1. 基本数据结构和对象存储 Git 底层主要基于四种对象来存储数据:blob(数据块)、tree(树&…...
Python基础语法——类型
目录 类型的意义动态类型静态类型 类型的意义 不同的类型,占用的内存空间是不同的. 占几个字节 int 默认是 4 个字节.动态扩容 float 固定 8 个字节 bool 一个字节就足够了 str 变长的 不同的类型,对应能够进行的操作也是不同的 int/float, “” “-” “ * ” “/”——不能使…...
vue2中基于el-select封装一个懒加载下拉框
需求 当下拉选项的数据量过大时,后端接口是分页格式返回数据。 解决方案 自定义封装一个懒加载下拉组件,每次滚动到底部时自动获取下一页数据,这样可有效防止数据量过大时造成组件卡顿。 具体实现步骤 1、创建懒加载下拉选择组件 <t…...
uniapp的h5,打开的时候,标题会一闪而过应用名称,再显示当前页面的标题
问题: 微信小程序,通过webview打开了uniapp创建的h5,但是打开h5时,会先显示h5的应用名称,然后才切换为该页面的标题。 过程: 查过很多资料,有说修改应用名称,有说设置navigationS…...
HarmonyOS 5 开发环境全解析:从搭建到实战
鸿蒙来了,从 1.0 到 5.0,它不再只是“华为的操作系统”,而是万物互联生态的核心驱动。作为开发者,你准备好拥抱这个全新时代了吗? 你是否还在犹豫:HarmonyOS 5 开发门槛高不高?该用 DevEco Stu…...
2.2 函数返回值
1.回顾def def sum(x,y): return xy res sum(10,20) #调用函数 print(res) 2.函数的三个重要属性 -函数的类型:function -函数的ID:16进制的整数数值 -函数的值:封装在函数中的数据和代码 # - 函数是一块内存空间,通过…...
OpenAI发布GPT-4.1:开发者专属模型的深度解析 [特殊字符]
最近OpenAI发布了GPT-4.1模型,却让不少人感到困惑。今天我们就来深入剖析这个新模型的关键信息! 重要前提:API专属模型 💻 首先需要明确的是,GPT-4.1仅通过API提供,不会出现在聊天界面中。这是因为该模型主…...
Cython中操作C++字符串
使用Cython开发Python扩展模块-CSDN博客中文末对python代码做了部分C优化,并提及未对字符串类型做优化,并且提到如果不是真正搞懂了C字符串的操作和Python的C API中与字符串相关的知识,最好不要动Python中的字符串类型。为了搞明白在Cython中…...