public GeoPoint destinationPoint(final double aDistanceInMeters, final double aBearingInDegrees) {

        // convert distance to angular distance
        final double dist = aDistanceInMeters / RADIUS_EARTH_METERS;

        // convert bearing to radians
        final double brng = DEG2RAD * aBearingInDegrees;

        // get current location in radians
        final double lat1 = DEG2RAD * getLatitude();
        final double lon1 = DEG2RAD * getLongitude();

        final double lat2 = Math.asin(Math.sin(lat1) * Math.cos(dist) + Math.cos(lat1)
                * Math.sin(dist) * Math.cos(brng));
        final double lon2 = lon1
                + Math.atan2(Math.sin(brng) * Math.sin(dist) * Math.cos(lat1), Math.cos(dist)
                - Math.sin(lat1) * Math.sin(lat2));

        final double lat2deg = lat2 / DEG2RAD;
        final double lon2deg = lon2 / DEG2RAD;

        return new GeoPoint(lat2deg, lon2deg);
    }
@Test
    public void test_destinationPoint_north_west_here() {
        // this test is based on the actual result, not calculated expectations,
        // but it is at least a basic sanity check for rounding errors and regression
        final GeoPoint start = new GeoPoint(52.387524, 4.891604);
        final GeoPoint end = new GeoPoint(52.3906999098817, 4.886399738626785);
        assertEquals("destinationPoint north west", end, start.destinationPoint(500, -45));
    }