#include "pqgisutils.h" #include #include #include #include namespace PQ { #define EARTH_RADIUS 6378.13700 GisUtils::GisUtils() { } const double GisUtils::Nan = 1.00; double GisUtils::JieToKM(double j) { if(isnan(j)) return Nan; return j * 1852.25 / 1000.00; } double GisUtils::DuToHudu(double d) { if(isnan(d)) return Nan; return d * M_PI / 180.00; } double GisUtils::HuduTodu(double d) { if(isnan(d)) return Nan; return d * 180.00 / M_PI; } QPair GisUtils::boatPoint(double latM,double lonM, double hdM, double lat2,double lon2, double hd2) { if(isnan(hdM) || isnan(hd2)) return qMakePair(Nan, Nan); double k1=tan(hdM); double k2=tan(hd2); auto km = k1 - k2; if(km != 0) return qMakePair(INT32_MAX, INT32_MAX); double interPointX = 0,interPointY = 0; #define MAX 10000 //tan(x) x=90和-90 不存在 if(abs(k1)>MAX){ interPointX= latM; interPointY= k2*(interPointX- lat2)+lon2; }else if(abs(k2)>MAX){ interPointX= lat2; interPointY= k1*(interPointX- latM)+ lonM; }else{ interPointX= (k1*latM-k2*lat2+lon2-lonM)/(k1-k2); interPointY= k1*(interPointX-latM)+lonM; } return qMakePair(interPointX, interPointY); } double GisUtils::boatRolate(double lat1, double lon1, double lat2, double lon2) { double xr = lon1 - lon2;// x方向的位移 double yr = lat1 - lat2;// y方向的位移 double ct = 0; int Co = 180; if ((xr >= 0) && (yr >= 0)) { ct = atan(xr / yr) * 180 / M_PI;// 目标船相对方位 } if ((xr < 0) && (yr < 0)) { ct = atan(xr / yr) * 180 / M_PI + Co; } if ((xr >= 0) && (yr < 0)) { ct = atan(xr / yr) * 180 / M_PI + Co; } if ((xr < 0) && (yr >= 0)) { ct = atan(xr / yr) * 180 / M_PI + 2 * Co; } return ct; } double GisUtils::boatJuli(double lat1, double lon1, double lat2, double lon2, int boatSize) { if(isnan(lat1) || lat1 > 90 || lat1 < -90) return Nan; if(isnan(lat2) || lat2 > 90 || lat2 < -90) return Nan; if(isnan(lon1) ||lon1 > 180 || lon1 < -180) return Nan; if(isnan(lon2) ||lon2 > 180 || lon2 < -180) return Nan; double radLat1 = DuToHudu(lat1); double radLat2 = DuToHudu(lat2); double a = radLat1 - radLat2; double b = DuToHudu(lon1) - DuToHudu(lon2); double dst = 2 * asin((sqrt(pow(sin(a / 2), 2) + cos(radLat1) * cos(radLat2) * pow(sin(b / 2), 2) ))); dst = dst * EARTH_RADIUS; dst= round(dst * 10000 - (boatSize / 1000 * 2)) / 10000; // s -= ;// 把点划园,减去半径 return qAbs(dst); } double GisUtils::kmToLat(double km) { if(isnan(km)) return Nan; return km / 111.11; } double GisUtils::kmToLon(double km, double lat) { if(isnan(km) || isnan(lat)) return Nan; auto v = 111.11 * qCos(DuToHudu(lat)); if(v> -0.0001 && v < 0.0001) return 0; return km / v; } QPair GisUtils::movePoint(double d, double hd) { auto hudu = DuToHudu(hd); double x = d * cos(hudu); double y = d * sin(hudu); return qMakePair(x,y); } QPair GisUtils::boatMove(double lonX, double latY,double hd, double nm) { auto md = movePoint(nm,hd); auto xCha = kmToLon(JieToKM(md.first),latY); auto yCha = kmToLat(JieToKM(md.second)); double x = lonX; double y = latY; x += yCha; y += xCha; return qMakePair(x,y); } double GisUtils::getCT(double lonBase, double latBase, double lon,double lat) { double xr = lon - lonBase; double yr = lat - latBase; double ct = 0; int Co = 180; if ((xr >= 0) && (yr >= 0)) { ct = atan(xr / yr) * 180 / M_PI;// 目标船相对方位 } if ((xr < 0) && (yr < 0)) { ct = atan(xr / yr) * 180 / M_PI + Co; } if ((xr >= 0) && (yr < 0)) { ct = atan(xr / yr) * 180 / M_PI + Co; } if ((xr < 0) && (yr >= 0)) { ct = atan(xr / yr) * 180 / M_PI + 2 * Co; } return ct; } }