/* * Copyright (c) 2019 Clementine Computing LLC. * * This file is part of PopuFare. * * PopuFare is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PopuFare is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with PopuFare. If not, see . * */ #include #include #include "gpsmath.h" #define EARTH_RAD (6372795.0) #define DEG2RAD(deg) (deg * 0.0174532925) #define DECDEG(gps) (trunc(gps / 100.0) + ((gps - (trunc(gps / 100.0) * 100.0)) / 60.0)) double trunc(double x); // calculated GPS distance in meters between two points // float GPS_Dist(float lat1, float lon1, float lat2, float lon2) { float dr_lat1,dr_lat2,delta_lon; float sinlat1,coslat1,sinlat2,coslat2,sindl,cosdl; float y,x; dr_lat1 = DEG2RAD(DECDEG(lat1)); dr_lat2 = DEG2RAD(DECDEG(lat2)); delta_lon = DEG2RAD(DECDEG(lon1)) - DEG2RAD(DECDEG(lon2)); sinlat1=sin(dr_lat1); sinlat2=sin(dr_lat2); coslat1=cos(dr_lat1); coslat2=cos(dr_lat2); sindl=sin(delta_lon); cosdl=cos(delta_lon); y=sqrt( pow(coslat2 * sindl , 2) + pow((coslat1 * sinlat2) - (sinlat1 * coslat2 * cosdl), 2)); x=(sinlat1 * sinlat2) + (coslat2 * coslat2 * cosdl); return EARTH_RAD * atan2(y,x); } /* int main() */ /* { */ /* printf("Distance in meters = %f\n",GPS_Dist(-3607.2,-8640.2, -3356.4,-11824.0)/1000); */ /* return 0; */ /* } */