You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Maps Directions API:如何实现Android isLocationOnPath路径点位判断功能?

Absolutely! You can replicate Android's isLocationOnPath functionality using data from the Google Maps Directions API. Here's a step-by-step guide to implement this in your Node.js code:

Step 1: Extract and Decode the Route Polyline

First, you need to pull the encoded polyline from the Directions API response. This polyline represents the full route path (you can use the overview_polyline for the entire route, or individual step polylines for more granularity).

Step 2: Implement Core Logic

Android's isLocationOnPath works by checking if the shortest distance from a target point to any segment of the route is within a specified tolerance (in meters). We'll replicate this with three key parts:

  • Decoding the polyline into geographic coordinates
  • Calculating the shortest distance from the target point to the route segments
  • Comparing that distance to your tolerance threshold
Full Code Implementation

Here's how to integrate this into your existing code:

const googleMapsClient = require('@google/maps').createClient({ key: 'KEY' });

googleMapsClient.directions({ 
  origin: 'Bangalore, Karnataka', 
  destination: 'Mumbai, Maharathra', 
  mode: "driving", 
}, function(err, response) { 
  if (!err) {
    // Extract the encoded polyline for the route
    const encodedPolyline = response.json.routes[0].overview_polyline.points;
    // Decode into an array of [lat, lng] pairs
    const routePath = decodePolyline(encodedPolyline);
    
    // Example target location to check (replace with your coordinates)
    const targetLocation = [17.4123, 78.5432];
    // Tolerance in meters (matches Android's tolerance parameter)
    const tolerance = 50; // 50 meters
    
    // Check if the location is on the path
    const isOnPath = isLocationOnPath(targetLocation, routePath, tolerance);
    console.log("Is location on route?", isOnPath);
  } else {
    console.error("ERR", err);
  }
});

// Decodes Google's encoded polyline string into [lat, lng] pairs
function decodePolyline(encoded) {
  const points = [];
  let index = 0, len = encoded.length;
  let lat = 0, lng = 0;

  while (index < len) {
    let b, shift = 0, result = 0;
    do {
      b = encoded.charCodeAt(index++) - 63;
      result |= (b & 0x1f) << shift;
      shift += 5;
    } while (b >= 0x20);
    const dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
    lat += dlat;

    shift = 0;
    result = 0;
    do {
      b = encoded.charCodeAt(index++) - 63;
      result |= (b & 0x1f) << shift;
      shift += 5;
    } while (b >= 0x20);
    const dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
    lng += dlng;

    points.push([lat / 1e5, lng / 1e5]);
  }
  return points;
}

// Checks if target point is within tolerance of the route path
function isLocationOnPath(target, path, tolerance) {
  if (path.length < 2) return false; // Need at least two points for a valid path

  let minDistance = Infinity;

  // Check distance to each segment in the path
  for (let i = 0; i < path.length - 1; i++) {
    const segmentStart = path[i];
    const segmentEnd = path[i + 1];
    const distance = distanceToSegment(target, segmentStart, segmentEnd);
    
    minDistance = Math.min(minDistance, distance);
    // Early exit if we find a segment within tolerance
    if (minDistance <= tolerance) return true;
  }

  return minDistance <= tolerance;
}

// Calculates shortest distance from point to a line segment (spherical coordinates)
function distanceToSegment(p, a, b) {
  const distPA = haversineDistance(p, a);
  const distPB = haversineDistance(p, b);
  const distAB = haversineDistance(a, b);

  if (distAB === 0) return distPA; // Segment is a single point

  // Calculate projection of point onto the segment
  const t = Math.max(0, Math.min(1, ((distPA * distPA - distPB * distPB + distAB * distAB) / (2 * distAB))));
  const projLat = a[0] + t * (b[0] - a[0]);
  const projLng = a[1] + t * (b[1] - a[1]);

  return haversineDistance(p, [projLat, projLng]);
}

// Haversine formula to calculate distance between two geographic points (meters)
function haversineDistance(p1, p2) {
  const earthRadius = 6371000; // Meters
  const dLat = toRadians(p2[0] - p1[0]);
  const dLng = toRadians(p2[1] - p1[1]);
  const lat1 = toRadians(p1[0]);
  const lat2 = toRadians(p2[0]);

  const a = Math.sin(dLat/2) * Math.sin(dLat/2) +
            Math.sin(dLng/2) * Math.sin(dLng/2) * Math.cos(lat1) * Math.cos(lat2);
  const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
  return earthRadius * c;
}

// Helper to convert degrees to radians
function toRadians(degrees) {
  return degrees * (Math.PI / 180);
}
Key Notes
  • The decodePolyline function converts the API's encoded string into usable latitude/longitude pairs.
  • We use the Haversine formula to calculate distances between geographic points, since we're working on a spherical Earth (not a flat plane).
  • The tolerance parameter works exactly like Android's: it defines how close the target point needs to be to the route (in meters) to be considered "on the path".

内容的提问来源于stack exchange,提问作者Sunil Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:32:41