package com.ruoyi.device.hiksdk.service.impl; import java.util.HashMap; import java.util.Map; /** * @ClassName: MapCoordinateToPTZ * @Description: * @Author: Administrator * @Date: 2023年02月08日 8:19 * @Version: 1.0 **/ public class MapCoordinateToPTZ { public static void main(String[] args) { double height = 90; double zoom=5; String cameraGps = "125.160097,46.566593"; String targetGps = "125.156863,46.566648"; double cameraLongitude = Double.parseDouble(cameraGps.split(",")[0]); double cameraLatitude = Double.parseDouble(cameraGps.split(",")[1]); double targetLongitude = Double.parseDouble(targetGps.split(",")[0]); double targetLatitude = Double.parseDouble(targetGps.split(",")[1]); Map map = GpsToPTZ(height,zoom, cameraLongitude, cameraLatitude, targetLongitude, targetLatitude); System.out.println(map); double angley = Math.atan2((targetLongitude-cameraLongitude),(targetLatitude-cameraLatitude)); //与Y轴的夹角 System.out.println(angley*(180/Math.PI)); } /** * @描述 gps坐标映射ptz * @参数 [height球机高度, anglePInit球机初始水平角度, x1球机经度, y1球机纬度, x2目标经度, y2目标纬度] * @返回值 java.util.Map * @创建人 刘苏义 * @创建时间 2023/2/8 15:47 * @修改人和其它信息 */ public static Map GpsToPTZ(double height,double Zoom, double x1, double y1, double x2, double y2) { //定义球机云台转动角度变量 double angle = 0;//定义正右 // 计算球机云台转动的角度 // 通过正切公式计算出来的角度分正负,正数为逆时针旋转角度,负数为顺时针宣传角度 angle = Math.atan2(x2 - x1,y2 - y1) * 180 / Math.PI; // 输出球机云台需要旋转的夹角 System.out.println("球机需要水平旋转的夹角为:" + (angle) + "°"); if (angle < 0) { angle = (360 + angle); } int pAngle = new Double(Math.round(angle)).intValue(); System.out.println("当前P值为:" + pAngle + "°"); // 计算球机云台俯仰的角度 double distance = distance(x1, y1, x2, y2); System.out.println("两点距离:" + distance + "m"); angle = (Math.atan(distance / height) * 180) / Math.PI; System.out.println("球机需要垂直旋转的夹角为:" + (angle) + "°"); //云台水平时T值为0,向上为正值,向下为负值,且有上下限正负45度。 //T值正常计算公式:向上为角度正值,向下为360+(角度负值)。 //按实际使用情况,基本上排除向上正值的情况(可视范围内的坐标不会与相机水平) //通过正切公式计算出来角度,在相机里这个角度实际为负值,因此直接360-夹角就得到相机的T值 //由于相机的T值向下的下限最大360-45=315度,也就是说计算出来的夹角必须大于315,小于415的也就必须时315 double tValue = 360 - angle; if (tValue <= 315) { tValue = 315; } int tAngle = new Double(Math.round(tValue)).intValue(); System.out.println("当前T值为:" + tAngle + "°"); Map ptzMap = new HashMap<>(); ptzMap.put("p", pAngle); ptzMap.put("t", tAngle); ptzMap.put("z", Zoom); return ptzMap; } /** * @描述 通过2个经纬度计算距离 * @参数 [lat1, lng1, lat2, lng2] * @返回值 double * @创建人 刘苏义 * @创建时间 2023/2/8 15:40 * @修改人和其它信息 */ private static final double EARTH_RADIUS_WGS84 = 6378137.0; private static double distance(double lat1, double lng1, double lat2, double lng2) { double radLat1 = Math.toRadians(lat1); double radLat2 = Math.toRadians(lat2); double a = radLat1 - radLat2; double b = Math.toRadians(lng1) - Math.toRadians(lng2); double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2))); return Math.round(s * EARTH_RADIUS_WGS84); } }