Calculate angle between two Latitude/Longitude points

后端 未结 17 1416
故里飘歌
故里飘歌 2020-12-07 17:51

Is there a way to calculate angle between two Latitude/Longitude points?

What I am trying to achieve is to know where the user is heading. For example, user is head

17条回答
  •  难免孤独
    2020-12-07 18:37

    function calculateAngle(lat, lng) {
        var checkLengthInterval = 2;
    
        // Calculate Angle
        //If ObjFeed == [] add first object.
        if (ObjFeed.length == 0) {
            ObjFeed.push({ 'lat': lat, 'lng': lng });
        } else {
            // Get last object from list to calculate angle betwn last and latest.
            var tempNode = ObjFeed[ObjFeed.length - 1];
            // If last lat and lng is same as current it will always return 0 angle.so only push lat lng in obj which is diff than last one.
            if (!(tempNode.lat == lat && tempNode.lng == lng)) {
                ObjFeed.push({ 'lat': lat, 'lng': lng });
            } else {
                console.log('exact match for lat lng');
            }
        }
         // this is for to keep only few objects in the list and remove other
        if (ObjFeed.length >= checkLengthInterval) {
            // calculating angle only if previous data point is available
            ObjFeed = ObjFeed.slice(-1 * checkLengthInterval); // remove all items in array except last two
            var point1 = ObjFeed[ObjFeed.length - checkLengthInterval];
            var point2 = ObjFeed[ObjFeed.length - 1];
    
            console.log('previous point1', point1);
            console.log('next point2', point2);
    
            var dLng = (point2.lng - point1.lng);
            var dLat = (point2.lat - point1.lat);
    
            dLng = dLng * 10000;
            dLat = dLat * 10000;
    
            var dlat_by_dlan = 0;
    
            try {
                dlat_by_dlan = dLng / dLat;
            } catch (err) {
                dlat_by_dlan = NaN;
                console.log('Exception: dLat == 0');
            }
    
            var angleDegreeBearing = 0, angleBearingRad = 0;
            angleBearingRad = Math.atan(dlat_by_dlan);
            angleDegreeBearing = angleBearingRad * 180 / Math.PI;
    
            if (dLat < 0 && dLng < 0) {
                angleDegreeBearing = angleDegreeBearing + 180;
            } else if (dLat < 0 && dLng > 0) {
                angleDegreeBearing = angleDegreeBearing + 180;
            } else if (dLat == 0 && dLng == 0) {
                angleDegreeBearing = prevVechicleAngle;
            } else if (dlat_by_dlan == NaN) {
                angleDegreeBearing = prevVechicleAngle;
            }
    
            console.log('angleDegreeBearing', angleDegreeBearing);
    
        } else {
            // setting up default angle to 0 if previous data point is not available to calculate actual anglle
            console.log('feedArray default angle 0');
            angleDegreeBearing = 0;
        }
        prevVechicleAngle = angleDegreeBearing;
        return angleDegreeBearing;
    
    }
    

提交回复
热议问题