经纬度坐标工具
LngLatUtil :用于计算里程数
import cn.hutool.core.util.ArrayUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.Getter;
import lombok.Setter;import java.io.FileInputStream;
import java.io.Serializable;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;public class LngLatUtil {/*** 地球半径,m*/public static final double EARTH_RADIUS = 6371393d;/*** 偏离参考弧度大小*/public static final double OFFSET_RADIANS = Math.PI * 0.25d;public static double getRand(double min, double max) {double v = Math.random() * (max - min) + min;DecimalFormat df = new DecimalFormat("#0.00");return Double.parseDouble(df.format(v));}public static double getOffset(Point p1, Point p2) {// 纬度之差double a = Math.toRadians(p1.lat) - Math.toRadians(p2.lat);// 经度之差double b = Math.toRadians(p1.lng) - Math.toRadians(p2.lng);// 计算两点距离的公式double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +Math.cos(p1.lat) * Math.cos(p2.lat) * Math.pow(Math.sin(b / 2), 2)));// 弧长乘地球半径, 返回单位: 米return s * EARTH_RADIUS;}public static Point offsetPoint(double lng, double lat, double offset, double radians) {Point point = new Point();if (offset > 0) {point.setLng(lng + offset * Math.sin(radians) * 180d / (Math.PI * EARTH_RADIUS * Math.cos(lat * Math.PI / 180d)));point.setLat(lat + offset * Math.cos(radians) / (Math.PI * EARTH_RADIUS / 180d));} else {point.setLng(lng);point.setLat(lng);}return point;}public static Point getNewPoint(Point samplePrev, Point sampleCur,int index) {double radians = 0d;if (Objects.nonNull(samplePrev)) {radians = getRadians(sampleCur, samplePrev);}radians = offsetRadians(radians);double offset;if(index > 0){offset = getRand(10, 50);}else{offset = getRand(150, 200);}return offsetPoint(sampleCur.lng, sampleCur.lat, offset, radians);}public static Point getNewPoint(Point prev, Point samplePrev, Point sampleCur) {double radians = 0d;if (Objects.nonNull(samplePrev)) {radians = getRadians(samplePrev, sampleCur);}radians = offsetRadians(radians);double offset = getRand(50, 100);if (Objects.isNull(prev)) {prev = sampleCur;}return offsetPoint(prev.lng, prev.lat, offset, radians);}public static double getRadians(Point p1, Point p2) {double y = Math.sin(p2.getLng() - p1.getLng()) * Math.cos(p2.getLat());double x = Math.cos(p1.getLat()) * Math.sin(p2.getLat()) - Math.sin(p1.getLat()) * Math.cos(p2.getLat()) * Math.cos(p2.getLng() - p1.getLng());return Math.atan2(y, x);}public static double offsetRadians(double radians) {double min = radians - OFFSET_RADIANS;double max = radians + OFFSET_RADIANS;return getRand(min, max);}@Getter@Setterpublic static class Point implements Serializable {private double lng;private double lat;}public static void main(String[] args) throws Exception {String path = "D:\\Desktop\\imei-data\\";FileInputStream fileInputStream = new FileInputStream(path + "4.json");byte[] bytes = new byte[1024];//每一次读取四个字节int readCount = 0;byte[] data = new byte[0];while ((readCount = fileInputStream.read(bytes)) != -1) {byte[] read = new byte[readCount];System.arraycopy(bytes, 0, read, 0, readCount);data = ArrayUtil.addAll(data, read);}String s = new String(data);List<Point> testData = JSONObject.parseArray(s, Point.class);Point samplePrev = null;List<Double[]> lines = new ArrayList<>();List<Double[]> origin = new ArrayList<>();for (int i = 0; i < testData.size(); i++) {Point sampleCur = testData.get(i);origin.add(new Double[]{sampleCur.lng, sampleCur.lat});Point p = getNewPoint(samplePrev, sampleCur, i);lines.add(new Double[]{p.lng, p.lat});samplePrev = sampleCur;}
// System.out.println(JSON.toJSONString(origin));System.out.println();System.out.println(JSON.toJSONString(lines));}
}
CoordinateTransformUtils : 坐标转换工具 BD09 、GCJ02、WGS84
/*** 百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换的工具** @see 参考https://github.com/wandergis/coordtransform实现的Java版本* @author geosmart*/
public class CoordinateTransformUtils {static double x_pi = 3.14159265358979324 * 3000.0 / 180.0;// πstatic double pi = 3.1415926535897932384626;// 长半轴static double a = 6378245.0;// 扁率static double ee = 0.00669342162296594323;/*** 百度坐标系(BD-09)转WGS坐标** @param lng 百度坐标纬度* @param lat 百度坐标经度* @return WGS84坐标数组*/public static double[] bd09towgs84(double lng, double lat) {double[] gcj = bd09togcj02(lng, lat);double[] wgs84 = gcj02towgs84(gcj[0], gcj[1]);return wgs84;}/*** WGS坐标转百度坐标系(BD-09)** @param lng WGS84坐标系的经度* @param lat WGS84坐标系的纬度* @return 百度坐标数组*/public static double[] wgs84tobd09(double lng, double lat) {double[] gcj = wgs84togcj02(lng, lat);double[] bd09 = gcj02tobd09(gcj[0], gcj[1]);return bd09;}/*** 火星坐标系(GCJ-02)转百度坐标系(BD-09)* 谷歌、高德——>百度** @param lng 火星坐标经度* @param lat 火星坐标纬度* @return 百度坐标数组*/public static double[] gcj02tobd09(double lng, double lat) {double z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * x_pi);double theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * x_pi);double bd_lng = z * Math.cos(theta) + 0.0065;double bd_lat = z * Math.sin(theta) + 0.006;return new double[]{bd_lng, bd_lat};}/*** 百度坐标系(BD-09)转火星坐标系(GCJ-02)* 百度——>谷歌、高德** @param bd_lon 百度坐标纬度* @param bd_lat 百度坐标经度* @return 火星坐标数组*/public static double[] bd09togcj02(double bd_lon, double bd_lat) {double x = bd_lon - 0.0065;double y = bd_lat - 0.006;double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi);double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi);double gg_lng = z * Math.cos(theta);double gg_lat = z * Math.sin(theta);return new double[]{gg_lng, gg_lat};}/*** WGS84转GCJ02(火星坐标系)** @param lng WGS84坐标系的经度* @param lat WGS84坐标系的纬度* @return 火星坐标数组*/public static double[] wgs84togcj02(double lng, double lat) {if (out_of_china(lng, lat)) {return new double[]{lng, lat};}double dlat = transformlat(lng - 105.0, lat - 35.0);double dlng = transformlng(lng - 105.0, lat - 35.0);double radlat = lat / 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 = lat + dlat;double mglng = lng + dlng;return new double[]{mglng, mglat};}/*** GCJ02(火星坐标系)转GPS84** @param lng 火星坐标系的经度* @param lat 火星坐标系纬度* @return WGS84坐标数组*/public static double[] gcj02towgs84(double lng, double lat) {if (out_of_china(lng, lat)) {return new double[]{lng, lat};}double dlat = transformlat(lng - 105.0, lat - 35.0);double dlng = transformlng(lng - 105.0, lat - 35.0);double radlat = lat / 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 = lat + dlat;double mglng = lng + dlng;return new double[]{lng * 2 - mglng, lat * 2 - mglat};}/*** 纬度转换** @param lng* @param lat* @return*/public static double transformlat(double lng, double lat) {double ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));ret += (20.0 * Math.sin(6.0 * lng * pi) + 20.0 * Math.sin(2.0 * lng * pi)) * 2.0 / 3.0;ret += (20.0 * Math.sin(lat * pi) + 40.0 * Math.sin(lat / 3.0 * pi)) * 2.0 / 3.0;ret += (160.0 * Math.sin(lat / 12.0 * pi) + 320 * Math.sin(lat * pi / 30.0)) * 2.0 / 3.0;return ret;}/*** 经度转换** @param lng* @param lat* @return*/public static double transformlng(double lng, double lat) {double ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));ret += (20.0 * Math.sin(6.0 * lng * pi) + 20.0 * Math.sin(2.0 * lng * pi)) * 2.0 / 3.0;ret += (20.0 * Math.sin(lng * pi) + 40.0 * Math.sin(lng / 3.0 * pi)) * 2.0 / 3.0;ret += (150.0 * Math.sin(lng / 12.0 * pi) + 300.0 * Math.sin(lng / 30.0 * pi)) * 2.0 / 3.0;return ret;}/*** 判断是否在国内,不在国内不做偏移** @param lng* @param lat* @return*/public static boolean out_of_china(double lng, double lat) {if (lng < 72.004 || lng > 137.8347) {return true;} else if (lat < 0.8293 || lat > 55.8271) {return true;}return false;}
}
相关文章:
经纬度坐标工具
LngLatUtil :用于计算里程数 import cn.hutool.core.util.ArrayUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import lombok.Getter; import lombok.Setter;import java.io.FileInputStream; import java.io.Serializable; import java.t…...
如何使用伪元素::before和::after?
伪元素(::before和::after)是CSS中非常有用的特性,它们允许你在元素的内容之前或之后插入额外的内容,并且不需要在HTML结构中添加额外的标记。这样可以方便地在页面上添加装饰性元素、图标、或者样式效果。以下是使用伪元素的基本方法: 1、创…...
Visual Studio Code中对打开的脚本格式统一
什么是Language Server Protocol (LSP)? Language Server Protocol(语言服务器协议,简称LSP)是微软在2016年提出的一套统一的通讯协议方案。LSP定义了一套编辑器或者IDE与语言服务器(Language Server)之间使用的协议&…...
补充JDK源码-IDEA集成工具
在阅读JDK8源码的时候发现,只有一小部分常用包是存在源码及其注释的,而很多内部包是没有源码,class文件在阅读的时候对阅读者十分不友好。在网上搜集了很多资料都没有解决问题。 解决问题办法:参考文档。本文主要是根据这篇文章记…...
Git Submodule 更新子库失败 fatal: Unable to fetch in submodule path
编辑本地目录 .git/config 文件 在 [submodule “Assets/CommonModule”] 项下 加入 fetch refs/heads/:refs/remotes/origin/...
Springboot切面打印日志
切面打印完整日志,以下代码用于扫描RestController 注解修饰的接口,并打印相关日志 import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; impor…...
ubuntu上回环设备/dev/loop0占用100%清理
查看磁盘占用情况时: df -h/dev/loopn这些设备在Linux下被称为回环设备。 终端输入: sudo apt autoremove --purge snapd再次查看:...
List list=new ArrayList()抛出的ArrayIndexOutOfBoundsException异常
1.应用场景,今天生产日志监控到一下ArrayList 进行add 异常,具体日志如下: eptionHandler.handler(178): TXXYBUSSINESS|执行异常 java.util.concurrent.CompletionException: java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bo…...
桶排序算法
桶排序算法 算法思想概述:桶排序的主要步骤如下: 算法goland实现:图解演示: 算法思想概述: 桶排序(Bucket Sort)是一种非比较性的排序算法,它将待排序的元素分到有限数量的桶&#…...
P8604 [蓝桥杯 2013 国 C] 危险系数
题目背景 抗日战争时期,冀中平原的地道战曾发挥重要作用。 题目描述 地道的多个站点间有通道连接,形成了庞大的网络。但也有隐患,当敌人发现了某个站点后,其它站点间可能因此会失去联系。 我们来定义一个危险系数 DF(x,y)&…...
Excel·VBA表格横向、纵向相互转换
如图:对图中区域 A1:M6 横向表格,转换成区域 A1:C20 纵向表格,即 B:M 列转换成每2列一组按行写入,并删除空行。同理,反向操作就是纵向表格转换成横向表格 目录 横向转纵向实现方法1转换结果 实现方法2转换结果 纵向转横…...
Leetcode-每日一题【剑指 Offer 06. 从尾到头打印链表】
题目 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 示例 1: 输入:head [1,3,2]输出:[2,3,1] 限制: 0 < 链表长度 < 10000 解题思路 1.题目要求我们从尾到头反过…...
LeetCode--HOT100题(22)
目录 题目描述:160. 相交链表(简单)题目接口解题思路代码 PS: 题目描述:160. 相交链表(简单) 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表…...
产品体系架构202308版
1.前言 当我们不断向前奔跑时,需要回头压实走过的路。不断扩张的同时把相应的内容沉淀下来,为后续的发展铺垫基石。 不知从何时起,产品的架构就面向了微服务/中台化/前后端分离/低代码化/分布式/智能化/运行可观测化的综合体,让…...
Linux systemctl 简单介绍与使用
在Linux下,systemctl是一个管理系统服务的命令。它提供了对systemd服务的控制和管理。 在系统中使用systemctl命令,您可以执行以下操作: 启动服务:systemctl start servicename停止服务:systemctl stop servicename重…...
恺英网络宣布:与华为鸿蒙系统展开合作,将开发多款手游
8月5日消息,恺英网络宣布旗下子公司盛和网络参加了华为开发者大会(HDC.Together)游戏服务论坛,并在华为鸿蒙生态游戏先锋合作启动仪式上进行了亮相。恺英网络表示,将逐步在HarmonyOS上开发多款游戏,利用Har…...
Vue CORS
使用Vue框架报错,客户端浏览器有CORS错误,怎么解决? 参考API Proxying During Development,可以新增或修改config/index.js下的proxyTable属性。 留意到 proxyTable的key值为/api,代表所有服务端域名都改成以/api开头…...
Godot 4 源码分析 - 文件读入编码处理
今天需要读入xml文件进行处理,结果读入一个带中文的文件时,出错了。当然程序还能运行,但编译器一直报错,而且XML解析也不正确 单步调试发现读入的内容出现乱码,具体逻辑: String FileAccess::get_as_text…...
Linux 中使用 verdaccio 搭建私有npm 服务器
安装 Node Linux中安装Node 安装verdaccio npm i -g verdaccio安装完成 输入verdaccio,出现下面信息代表安装成功,同时输入verdaccio后verdaccio已经处于运行状态,当然这种启动时暂时的,我们需要通过pm2让verdaccio服务常驻 ygiZ2zec61wsg…...
C++入门之stl六大组件--stack和queue源码深度剖析及模拟实现
目录 前言 一、stack的介绍和使用 1.stack的介绍 2.stack的使用 3.stack的模拟实现 二、queue的介绍和使用 1.queue的介绍 2.queue的使用 3.queue的模拟实现 三、priority_queue的介绍和使用 1.priority_queue的介绍 2.priority_queue的使用 3.priority_queue的模…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...
macOS 终端智能代理检测
🧠 终端智能代理检测:自动判断是否需要设置代理访问 GitHub 在开发中,使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新,例如: fatal: unable to access https://github.com/ohmyzsh/oh…...
