How to generate coordinates in between two known points

前端 未结 3 1919
攒了一身酷
攒了一身酷 2021-01-05 08:15

Background:

I\'m working with transport routes and Google provides Route points far apart enough to create \'shapes\'. These are the bus/train route

相关标签:
3条回答
  • 2021-01-05 08:20

    The following solution isn't exactly what you've requested, but may suffice for your purposes...

    Check the official docs (https://developers.google.com/maps/documentation/javascript/reference) for the interpolate method. From the docs: 'Returns the LatLng which lies the given fraction of the way between the origin LatLng and the destination LatLng.'

    So if you know that your original points are, say, 100m apart, and you specify 0.05 as the fraction, the method will return the lat/lng along that line for every 5m.

    0 讨论(0)
  • 2021-01-05 08:39

    Step 1 - Get the overall distance

    Comprehensive answer can be found here: http://www.movable-type.co.uk/scripts/latlong.html

    TL;DR:

    This uses the ‘haversine’ formula to calculate the great-circle distance between two points – that is, the shortest distance over the earth’s surface – giving an ‘as-the-crow-flies’ distance between the points (ignoring any hills, of course!).

    var R = 6371; // km
    var dLat = (lat2-lat1).toRad();
    var dLon = (lon2-lon1).toRad();
    var lat1 = lat1.toRad();
    var lat2 = lat2.toRad();
    
    var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
            Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2); 
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
    var distance = R * c;
    

    Step 2 - Get the percentage travelled.

    Now you have the distance for this straight line, you can then work out a percentage of the overall distance for each 5 meters.

    Step 3 - Apply the percentage travelled to the difference between the Latitude and Longitude

    Find out the difference between the starting latitude and the final latitude. With this number, multiply it by the percentage traveled (as a decimal). This can then be added back to the starting latitude to find the current latitude of this point. Repeat for longitude.

    0 讨论(0)
  • 2021-01-05 08:41

    Destination point given distance and bearing from start point applied to your problem:

    class Numeric
      def to_rad
        self * Math::PI / 180
      end
      def to_deg
        self * 180 / Math::PI
      end
    end
    
    include Math
    
    R = 6371.0
    
    def waypoint(φ1, λ1, θ, d)
      φ2 = asin( sin(φ1) * cos(d/R) + cos(φ1) * sin(d/R) * cos(θ) )
      λ2 = λ1 + atan2( sin(θ) * sin(d/R) * cos(φ1), cos(d/R) - sin(φ1) * sin(φ2) )
      λ2 = (λ2 + 3 * Math::PI) % (2 * Math::PI) - Math::PI # normalise to -180..+180°
      [φ2, λ2]
    end
    
    φ1, λ1 = -33.to_rad, -71.6.to_rad   # Valparaíso
    φ2, λ2 = 31.4.to_rad, 121.8.to_rad  # Shanghai
    
    d = R * acos( sin(φ1) * sin(φ2) + cos(φ1) * cos(φ2) * cos(λ2 - λ1) )
    θ = atan2( sin(λ2 - λ1) * cos(φ2), cos(φ1) * sin(φ2) - sin(φ1) * cos(φ2) * cos(λ2 - λ1) )
    
    waypoints = (0..d).step(2000).map { |d| waypoint(φ1, λ1, θ, d) }
    
    markers = waypoints.map { |φ, λ| "#{φ.to_deg},#{λ.to_deg}" }.join("|")
    
    puts "http://maps.googleapis.com/maps/api/staticmap?size=640x320&sensor=false&markers=#{markers}"
    

    Generates a Google Static Maps link with the waypoints from Valparaíso to Shanghai every 2,000 km:

    http://maps.googleapis.com/maps/api/staticmap?size=640x320&sensor=false&markers=-33.0,-71.60000000000002|-32.54414813683714,-93.02142653011552|-28.59922979115139,-113.43958859125276|-21.877555679819015,-131.91586675556778|-13.305784544363858,-148.5297601858932|-3.7370081151180683,-163.94988578467394|6.094273692291354,-179.03345538133888|15.493534924596633,165.33401731030006|23.70233917422386,148.3186618914762|29.83806632244171,129.34766276764626
    

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