Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • Home
  • SEARCH
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 753881
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 14, 20262026-05-14T14:56:53+00:00 2026-05-14T14:56:53+00:00

I am trying to create a Google Map where the user can plot the

  • 0

I am trying to create a Google Map where the user can plot the route he walked/ran/bicycled and see how long he ran. The GPolyline class with it’s getLength() method is very helpful in this regard (at least for Google Maps API V2), but I wanted to add markers based on distance, for example a marker for 1 km, 5 km, 10 km, etc., but it seems that there is no obvious way to find a point on a polyline based on how far along the line it is. Any suggestions?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-14T14:56:53+00:00Added an answer on May 14, 2026 at 2:56 pm

    Having answered a similar problem a couple of months ago on how to tackle this on the server-side in SQL Server 2008, I am porting the same algorithm to JavaScript using the Google Maps API v2.

    For the sake of this example, let’s use a simple 4-point polyline, with a total length of circa 8,800 meters. The snippet below will define this polyline and will render it on the map:

    var map = new GMap2(document.getElementById('map_canvas'));
    
    var points = [
       new GLatLng(47.656, -122.360),
       new GLatLng(47.656, -122.343),
       new GLatLng(47.690, -122.310),
       new GLatLng(47.690, -122.270)
    ];
    
    var polyline = new GPolyline(points, '#f00', 6);
    
    map.setCenter(new GLatLng(47.676, -122.343), 12);
    map.addOverlay(polyline);
    

    Now before we approach the actual algorithm, we will need a function that returns the destination point when given a start point, an end point, and the distance to travel along that line, Luckily, there are a few handy JavaScript implementations by Chris Veness at Calculate distance, bearing and more between Latitude/Longitude points.

    In particular I have adapted the following two methods from the above source to work with Google’s GLatLng class:

    • Destination point given distance and bearing from start point
    • Bearing

    These were used to extend Google’s GLatLng class with a method moveTowards(), which when given another point and a distance in meters, it will return another GLatLng along that line when the distance is travelled from the original point towards the point passed as a parameter.

    GLatLng.prototype.moveTowards = function(point, distance) {   
       var lat1 = this.lat().toRad();
       var lon1 = this.lng().toRad();
       var lat2 = point.lat().toRad();
       var lon2 = point.lng().toRad();         
       var dLon = (point.lng() - this.lng()).toRad();
    
       // Find the bearing from this point to the next.
       var brng = Math.atan2(Math.sin(dLon) * Math.cos(lat2),
                             Math.cos(lat1) * Math.sin(lat2) -
                             Math.sin(lat1) * Math.cos(lat2) * 
                             Math.cos(dLon));
    
       var angDist = distance / 6371000;  // Earth's radius.
    
       // Calculate the destination point, given the source and bearing.
       lat2 = Math.asin(Math.sin(lat1) * Math.cos(angDist) + 
                        Math.cos(lat1) * Math.sin(angDist) * 
                        Math.cos(brng));
    
       lon2 = lon1 + Math.atan2(Math.sin(brng) * Math.sin(angDist) *
                                Math.cos(lat1), 
                                Math.cos(angDist) - Math.sin(lat1) *
                                Math.sin(lat2));
    
       if (isNaN(lat2) || isNaN(lon2)) return null;
    
       return new GLatLng(lat2.toDeg(), lon2.toDeg());
    }
    

    Having this method, we can now tackle the problem as follows:

    1. Iterate through each point of the path.
    2. Find the distance between the current point in the iteration to the next point.
    3. If the distance in point 2 is greater the distance we need to travel on the path:

      …then the destination point is between this point and the next. Simply apply the moveTowards() method to the current point, passing the next point and the distance to travel. Return the result and break the iteration.

      Else:

      …the destination point is further in the path from the next point in the iteration. We need to subtract the distance between this point and the next point from the total distance to travel along the path. Continue through the iteration with the modified distance.

    You may have noticed that we can easily implement the above recursively, instead of iteratively. So let’s do it:

    function moveAlongPath(points, distance, index) {
       index = index || 0;  // Set index to 0 by default.
    
       if (index < points.length) {
          // There is still at least one point further from this point.
    
          // Construct a GPolyline to use its getLength() method.
          var polyline = new GPolyline([points[index], points[index + 1]]);
    
          // Get the distance from this point to the next point in the polyline.
          var distanceToNextPoint = polyline.getLength();
    
          if (distance <= distanceToNextPoint) {
             // distanceToNextPoint is within this point and the next. 
             // Return the destination point with moveTowards().
             return points[index].moveTowards(points[index + 1], distance);
          }
          else {
             // The destination is further from the next point. Subtract
             // distanceToNextPoint from distance and continue recursively.
             return moveAlongPath(points,
                                  distance - distanceToNextPoint,
                                  index + 1);
          }
       }
       else {
          // There are no further points. The distance exceeds the length  
          // of the full path. Return null.
          return null;
       }  
    }
    

    With the above method, if we define an array of GLatLng points, and we invoke our moveAlongPath() function with this array of points and with a distance of 2,500 meters, it will return a GLatLng on that path at 2.5km from the first point.

    var points = [
       new GLatLng(47.656, -122.360),
       new GLatLng(47.656, -122.343),
       new GLatLng(47.690, -122.310),
       new GLatLng(47.690, -122.270)
    ];
    
    var destinationPointOnPath = moveAlongPath(points, 2500);
    
    // destinationPointOnPath will be a GLatLng on the path 
    // at 2.5km from the start.
    

    Therefore all we need to do is to call moveAlongPath() for each check point we need on the path. If you need three markers at 1km, 5km and 10km, you can simply do:

    map.addOverlay(new GMarker(moveAlongPath(points, 1000)));
    map.addOverlay(new GMarker(moveAlongPath(points, 5000)));
    map.addOverlay(new GMarker(moveAlongPath(points, 10000)));
    

    Note however that moveAlongPath() may return null if we request a check point further from the total length of the path, so it will be wiser to check for the return value before passing it to new GMarker().

    We can put this together for the full implementation. In this example we are dropping a marker every 1,000 meters along the 8.8km path defined earlier:

    <!DOCTYPE html>
    <html> 
    <head> 
       <meta http-equiv="content-type" content="text/html; charset=UTF-8"/> 
       <title>Google Maps - Moving point along a path</title> 
       <script src="http://maps.google.com/maps?file=api&v=2&sensor=false"
               type="text/javascript"></script> 
    </head> 
    <body onunload="GUnload()"> 
       <div id="map_canvas" style="width: 500px; height: 300px;"></div>
    
       <script type="text/javascript"> 
    
       Number.prototype.toRad = function() {
          return this * Math.PI / 180;
       }
    
       Number.prototype.toDeg = function() {
          return this * 180 / Math.PI;
       }
    
       GLatLng.prototype.moveTowards = function(point, distance) {   
          var lat1 = this.lat().toRad();
          var lon1 = this.lng().toRad();
          var lat2 = point.lat().toRad();
          var lon2 = point.lng().toRad();         
          var dLon = (point.lng() - this.lng()).toRad();
    
          // Find the bearing from this point to the next.
          var brng = Math.atan2(Math.sin(dLon) * Math.cos(lat2),
                                Math.cos(lat1) * Math.sin(lat2) -
                                Math.sin(lat1) * Math.cos(lat2) * 
                                Math.cos(dLon));
    
          var angDist = distance / 6371000;  // Earth's radius.
    
          // Calculate the destination point, given the source and bearing.
          lat2 = Math.asin(Math.sin(lat1) * Math.cos(angDist) + 
                           Math.cos(lat1) * Math.sin(angDist) * 
                           Math.cos(brng));
    
          lon2 = lon1 + Math.atan2(Math.sin(brng) * Math.sin(angDist) *
                                   Math.cos(lat1), 
                                   Math.cos(angDist) - Math.sin(lat1) *
                                   Math.sin(lat2));
    
          if (isNaN(lat2) || isNaN(lon2)) return null;
    
          return new GLatLng(lat2.toDeg(), lon2.toDeg());
       }
    
       function moveAlongPath(points, distance, index) {        
          index = index || 0;  // Set index to 0 by default.
    
          if (index < points.length) {
             // There is still at least one point further from this point.
    
             // Construct a GPolyline to use the getLength() method.
             var polyline = new GPolyline([points[index], points[index + 1]]);
    
             // Get the distance from this point to the next point in the polyline.
             var distanceToNextPoint = polyline.getLength();
    
             if (distance <= distanceToNextPoint) {
                // distanceToNextPoint is within this point and the next. 
                // Return the destination point with moveTowards().
                return points[index].moveTowards(points[index + 1], distance);
             }
             else {
                // The destination is further from the next point. Subtract
                // distanceToNextPoint from distance and continue recursively.
                return moveAlongPath(points,
                                     distance - distanceToNextPoint,
                                     index + 1);
             }
          }
          else {
             // There are no further points. The distance exceeds the length  
             // of the full path. Return null.
             return null;
          }  
       }
    
       var map = new GMap2(document.getElementById('map_canvas'));
    
       var points = [
          new GLatLng(47.656, -122.360),
          new GLatLng(47.656, -122.343),
          new GLatLng(47.690, -122.310),
          new GLatLng(47.690, -122.270)
       ];
    
       var polyline = new GPolyline(points, '#f00', 6);
    
       var nextMarkerAt = 0;     // Counter for the marker checkpoints.
       var nextPoint = null;     // The point where to place the next marker.
    
       map.setCenter(new GLatLng(47.676, -122.343), 12);
    
       // Draw the path on the map.
       map.addOverlay(polyline);
    
       // Draw the checkpoint markers every 1000 meters.
       while (true) {
          // Call moveAlongPath which will return the GLatLng with the next
          // marker on the path.
          nextPoint = moveAlongPath(points, nextMarkerAt);
    
          if (nextPoint) {
             // Draw the marker on the map.
             map.addOverlay(new GMarker(nextPoint));
    
             // Add +1000 meters for the next checkpoint.
             nextMarkerAt += 1000;    
          }
          else {
             // moveAlongPath returned null, so there are no more check points.
             break;
          }            
       }
       </script>
    </body> 
    </html>
    

    Screenshot of the above example, showing a marker every 1,000 meters:

    Google Maps - Move Point Along a Path

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I'm trying to create a custom javascript class that inherits from google.maps.Map (V3 API).
I'm trying to make a Google map that updates a marker as a user's
I am trying to create a Google Maps application that has the map of
I'm trying to create map (using the Google Maps JavaScript API V3 ) which
I am trying to create a google map with custom icon markers. I need
I am trying to create a custom google map using Longitudes and Latitudes that
I'm trying to create a Google Map with multiple markers on it, that loads
I am trying to create a Google Map with a single coordinate as marker.
I'm trying to create a Google Map that will display multiple geodesic lines originating
I am trying to create a Google Map canvas with markers of indicating two

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.