Adding distance to a GPS coordinate

后端 未结 5 1089
南旧
南旧 2020-11-28 05:32

I\'m trying to generate some points at random distances away from a fixed point using GPS.

How can I add distance in meters to a GPS coordinate? I\'ve looked at UTM

相关标签:
5条回答
  • 2020-11-28 05:38

    This code splits the line between two coordinates in n segments. Replace the delta calculation by your fixed distance

     @Override
    public void split(Coordinates p1, Coordinates p2, int segments) {
        double φ1 = Math.toRadians(p1.getLat());
        double λ1 = Math.toRadians(p1.getLon());
        double φ2 = Math.toRadians(p2.getLat());
        double λ2 = Math.toRadians(p2.getLon());
    
    
        double xDelta = (φ2 - φ1) / segments;
        double yDelta = (λ2 - λ1) / segments;
        for (int i = 0; i < segments; i++){
            double x = φ1 + i * xDelta;
            double y = λ1 + i * yDelta;
            double xc = Math.toDegrees(x);
            double yc = Math.toDegrees(y);
            System.out.println(xc+","+yc);
        }
    }
    
    0 讨论(0)
  • 2020-11-28 05:39

    If you want to go east or north or west or south you can use this:

    @SuppressLint("DefaultLocale")
    public static double go_mock_loc(double xx_lat,double xx_long,double xx_dinstance,String Direction)
    {
    //  double xx_lat= 45.815005; 
    //  double xx_long= 15.978501;
    
    //  int xx_dinstance=500;
    
        int equator_circumference=6371000;
        int polar_circumference=6356800;
    
        double m_per_deg_long =  360 / polar_circumference;
        double rad_lat=(xx_lat* (Math.PI) / 180);
        double m_per_deg_lat = 360 / ( Math.cos(rad_lat) * equator_circumference);
    
        double deg_diff_long = xx_dinstance * m_per_deg_long;
        double deg_diff_lat  = xx_dinstance * m_per_deg_lat; 
    
    
        double xx_north_lat = xx_lat + deg_diff_long;
        //double xx_north_long= xx_long;
        double xx_south_lat = xx_lat - deg_diff_long;
        //double xx_south_long= xx_long;
    
        //double xx_east_lat = xx_lat;
        double xx_east_long= xx_long + deg_diff_lat;  
        //double xx_west_lat = xx_lat;
        double xx_west_long= xx_long - deg_diff_lat;
    
        if (Direction.toUpperCase().contains("NORTH")) {
            return xx_north_lat;
        } else if (Direction.toUpperCase().contains("SOUTH"))
        {
            return xx_south_lat;
        } else if (Direction.toUpperCase().contains("EAST"))
        {
            return xx_east_long;
        } else if (Direction.toUpperCase().contains("WEST"))
        {
            return xx_west_long;
        }
        else 
            return 0; 
    
    }
    
    0 讨论(0)
  • 2020-11-28 05:59

    To take a square I'm using this:

     private double[] getBoundingBox(final double pLatitude, final double pLongitude, final int pDistanceInMeters) {
    
        final double[] boundingBox = new double[4];
    
        final double latRadian = Math.toRadians(pLatitude);
    
        final double degLatKm = 110.574235;
        final double degLongKm = 110.572833 * Math.cos(latRadian);
        final double deltaLat = pDistanceInMeters / 1000.0 / degLatKm;
        final double deltaLong = pDistanceInMeters / 1000.0 / degLongKm;
    
        final double minLat = pLatitude - deltaLat;
        final double minLong = pLongitude - deltaLong;
        final double maxLat = pLatitude + deltaLat;
        final double maxLong = pLongitude + deltaLong;
    
        boundingBox[0] = minLat;
        boundingBox[1] = minLong;
        boundingBox[2] = maxLat;
        boundingBox[3] = maxLong;
    
        return boundingBox;
    }
    

    This returns an array with 4 coordinates, with them you can make a square with your original point in center.

    0 讨论(0)
  • 2020-11-28 06:02
    • P0(lat0,lon0) : initial position (unit : degrees)
    • dx,dy : random offsets from your initial position in meters

    You can use an approximation to compute the position of the randomized position:

     lat = lat0 + (180/pi)*(dy/6378137)
     lon = lon0 + (180/pi)*(dx/6378137)/cos(lat0)
    

    This is quite precise as long as the random distance offset is below 10-100 km

    Edit: of course in Java Math.cos() expects radians so do use Math.cos(Math.PI/180.0*lat0) if lat0 is in degrees as assumed above.

    0 讨论(0)
  • 2020-11-28 06:04

    A detailed outline is given at http://www.movable-type.co.uk/scripts/latlong.html.

    If you, somewhere, need to interconvert longitude/latitude to UTM coordinates (the ones used in GPS) you may want to have a look at http://www.uwgb.edu/dutchs/UsefulData/UTMFormulas.htm

    0 讨论(0)
提交回复
热议问题