คำนวณระยะทางระหว่างจุดสองจุดใน Google แผนที่ V3


319

คุณจะคำนวณระยะห่างระหว่างสองเครื่องหมายใน Google แมป V3 ได้อย่างไร (คล้ายกับdistanceFromฟังก์ชั่น inV2)

ขอบคุณ ..


คำตอบ:


460

หากคุณต้องการคำนวณด้วยตัวเองคุณสามารถใช้สูตร Haversine:

var rad = function(x) {
  return x * Math.PI / 180;
};

var getDistance = function(p1, p2) {
  var R = 6378137; // Earth’s mean radius in meter
  var dLat = rad(p2.lat() - p1.lat());
  var dLong = rad(p2.lng() - p1.lng());
  var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
    Math.cos(rad(p1.lat())) * Math.cos(rad(p2.lat())) *
    Math.sin(dLong / 2) * Math.sin(dLong / 2);
  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
  var d = R * c;
  return d; // returns the distance in meter
};

4
ทำไมคุณแนะนำให้ใช้ Math.atan2 (Math.sqrt (a), Math.sqrt (1-a)) แทน Math.asin ที่ง่ายที่สุด (Math.sqrt (a))
Emanuele Paolini

3
@EmanuelePaolini - ทางคณิตศาสตร์, atan2 (sqrt (a), sqrt (1-a)) = asin (sqrt (a)) = acos (sqrt (1-a)) แต่รุ่น atan2 ยังคงมีตัวเลขที่ดีกว่าสำหรับทุกค่าของ
ChrisV

23
ผู้ชาย คำถาม. ทำไมคุณถึงชอบใช้ชื่อตัวแปร 1 ตัวอักษรในการแก้ปัญหาที่ต้องใช้จินตนาการซึ่งชื่อตัวแปรที่ดีจะมีประโยชน์? เพิ่งถาม :)
pie6k

2
ไม่ควรเป็น var R = 6371; สำหรับกม.
Alexander Fradiani

5
p1.lat()และp1.lng()ฟังก์ชั่นคิดว่าการป้อนข้อมูลของคุณเป็นgoogle.maps.LatLngวัตถุ หากคุณเพียงแค่มีข้อมูลดิบเช่น{lat: __, lon: __}นั้นคุณจะใช้แทนp1.latตัวอย่างเช่น
Don McCurdy

308

ดูเหมือนว่าจะมีวิธีการใน GMap3 มันเป็นวิธีการคงที่ของgoogle.maps.geometry.sphericalnamespace

มันใช้เป็นอาร์กิวเมนต์สองLatLngวัตถุและจะใช้รัศมีโลกเริ่มต้นที่ 6378137 เมตรแม้ว่ารัศมีเริ่มต้นสามารถถูกแทนที่ด้วยค่าที่กำหนดเองหากจำเป็น

ตรวจสอบให้แน่ใจว่าคุณรวม:

<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false&v=3&libraries=geometry"></script>

ในส่วนหัวของคุณ

การโทรจะเป็น:

google.maps.geometry.spherical.computeDistanceBetween (latLngA, latLngB);

10
เหตุใดจึงมีความแตกต่าง 1% ในคำตอบที่ได้รับจากการคำนวณทรงกลมของ Google ระยะห่างระหว่างและสูตรระยะทางฮาร์ไซน์
Matt S

7
@RamenRecon ฉันไม่แน่ใจ แต่ quess น่าจะเป็นที่พวกเขาใช้ค่าต่าง ๆ สำหรับรัศมีของโลก
Emil Badh

11
@RamenRecon ใช่ Emil นั้นถูกต้อง เอกสารอธิบายว่า: รัศมีเริ่มต้นคือรัศมีของโลกที่6378137 เมตร แต่ไมค์ใน Haversine ด้านบนใช้6371kmแทน
Laszlo

ลิงก์ด้านบนนี้ใช้งานไม่ได้ในขณะนี้ แต่คำอธิบายของวิธีการดังกล่าวทำให้เกิดปัญหาไม่มากนัก
GChorn

2
@ ABCD.ca ไม่ใช่หมายเลขของฉัน คำถามนี้เกี่ยวกับห้องสมุด Google Maps เวอร์ชัน 3 คุณถามว่าทำไมการคำนวณของคุณแตกต่างจากของพวกเขา เป็นเพราะพวกเขาใช้ค่าที่แตกต่างกันสำหรับรัศมีของโลกมากกว่าที่คุณทำ การอ้างอิงสำหรับหมายเลขหรือไม่ developers.google.com/maps/documentation/javascript/…ด้านล่างบรรทัดแรก
Emil Badh

30

ตัวอย่างการใช้ละติจูด / ลองจิจูดของ GPS 2 จุด

var latitude1 = 39.46;
var longitude1 = -0.36;
var latitude2 = 40.40;
var longitude2 = -3.68;

var distance = google.maps.geometry.spherical.computeDistanceBetween(new google.maps.LatLng(latitude1, longitude1), new google.maps.LatLng(latitude2, longitude2));       

3
ผลลัพธ์ระยะทางแสดงเป็นเมตร
joan16v

1
@ joan16v วิธีกำหนด google.maps.geometry ใน node.js ฉันต้องการใช้รหัสด้านบนใน node.js ฉันควรติดตั้งโมดูลใดและไฟล์ใดที่ฉันต้องการ
kisor

15

เพียงเพิ่มส่วนนี้ไว้ที่จุดเริ่มต้นของรหัส JavaScript ของคุณ:

google.maps.LatLng.prototype.distanceFrom = function(latlng) {
  var lat = [this.lat(), latlng.lat()]
  var lng = [this.lng(), latlng.lng()]
  var R = 6378137;
  var dLat = (lat[1]-lat[0]) * Math.PI / 180;
  var dLng = (lng[1]-lng[0]) * Math.PI / 180;
  var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
  Math.cos(lat[0] * Math.PI / 180 ) * Math.cos(lat[1] * Math.PI / 180 ) *
  Math.sin(dLng/2) * Math.sin(dLng/2);
  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
  var d = R * c;
  return Math.round(d);
}

จากนั้นใช้ฟังก์ชันดังนี้:

var loc1 = new GLatLng(52.5773139, 1.3712427);
var loc2 = new GLatLng(52.4788314, 1.7577444);
var dist = loc2.distanceFrom(loc1);
alert(dist/1000);

โซลูชัน Excellect แต่ฉันอยากรู้ว่าหน่วยส่งคืนผลลัพธ์ใด ฉันได้ 3.013 .. เป็นไมล์ ๆ กม.
Gowthami Gattineni

ค่าที่ส่งคืนเป็นหน่วยเมตร ดังนั้น dist / 1000 จะให้ค่าเป็นกิโลเมตร
Praveen Janakarajan

13
//p1 and p2 are google.maps.LatLng(x,y) objects

function calcDistance(p1, p2) {
          var d = (google.maps.geometry.spherical.computeDistanceBetween(p1, p2) / 1000).toFixed(2);
          console.log(d);              
}

3
นี่คือคำตอบที่ดีที่สุด ทำไมต้องเพิ่มฟังก์ชั่นเมื่อ Google API มีฟังก์ชั่นอยู่แล้ว
felixfbecker

มีตัวแปร Java สำหรับ API นี้หรือไม่ ฉันหามันไม่เจอหลังจากการค้นหามากมาย
Sanketh

@felixfbecker เนื่องจากคุณอาจทำงานในสภาพแวดล้อมที่คุณไม่สามารถแทรก google maps API ลงในscriptแท็กและเรียกวิธีการเหล่านั้นได้ ชอบปฏิกิริยาตอบสนอง
Nnanyielugo

11

นี่คือการใช้ c # ของฟอรัมนี้

 public class DistanceAlgorithm
{
    const double PIx = 3.141592653589793;
    const double RADIO = 6378.16;

    /// <summary>
    /// This class cannot be instantiated.
    /// </summary>
    private DistanceAlgorithm() { }

    /// <summary>
    /// Convert degrees to Radians
    /// </summary>
    /// <param name="x">Degrees</param>
    /// <returns>The equivalent in radians</returns>
    public static double Radians(double x)
    {
        return x * PIx / 180;
    }

    /// <summary>
    /// Calculate the distance between two places.
    /// </summary>
    /// <param name="lon1"></param>
    /// <param name="lat1"></param>
    /// <param name="lon2"></param>
    /// <param name="lat2"></param>
    /// <returns></returns>
    public static double DistanceBetweenPlaces(
        double lon1,
        double lat1,
        double lon2,
        double lat2)
    {
        double dlon =  Radians(lon2 - lon1);
        double dlat =  Radians(lat2 - lat1);

        double a = (Math.Sin(dlat / 2) * Math.Sin(dlat / 2)) + Math.Cos(Radians(lat1)) * Math.Cos(Radians(lat2)) * (Math.Sin(dlon / 2) * Math.Sin(dlon / 2));
        double angle = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));
        return (angle * RADIO) * 0.62137;//distance in miles
    }

}    

5
สิ่งนี้ใช้ไม่ได้กับคำถามดั้งเดิมของวิธีการทำใน Google Maps
Niklas Wulff

ไม่มีฟังก์ชั่น inbuilt ในการคำนวณระยะทางโดยตรงคุณต้องใช้บริการไดเรกทอรีสองจุดและแยกระยะทางออกจาก XML / JSON ที่ส่งคืน
อาเหม็ด Naveed

1
ความคิดเห็นของฉันเกี่ยวกับความจริงที่ว่ามันจะดีกว่าที่จะให้วิธีแก้ปัญหาในจาวาสคริปต์เป็นเริ่มต้นด้ายไม่ได้บอกว่าถ้าเขา / เธอใช้ php, .net หรือคง html
Niklas Wulff

11

ด้วย Google คุณสามารถทำมันโดยใช้API ทรงกลมgoogle.maps.geometry.spherical.computeDistanceBetween (latLngA, latLngB); ,

อย่างไรก็ตามหากความแม่นยำของการฉายทรงกลมหรือสารละลายแฮเวอร์ซีนไม่แม่นยำเพียงพอสำหรับคุณ (เช่นหากคุณอยู่ใกล้กับเสาหรือคำนวณระยะทางไกลกว่า) คุณควรใช้ห้องสมุดอื่น

ข้อมูลส่วนใหญ่เกี่ยวกับเรื่องที่ฉันพบในวิกิพีเดียที่นี่

เคล็ดลับในการดูว่าความแม่นยำของอัลกอริทึมที่กำหนดนั้นเพียงพอหรือไม่คือการเติมรัศมีสูงสุดและต่ำสุดของโลกและดูว่าความแตกต่างอาจทำให้เกิดปัญหาสำหรับกรณีการใช้งานของคุณหรือไม่ รายละเอียดเพิ่มเติมสามารถพบได้ในบทความนี้

ในท้ายที่สุด google api หรือ haversine จะตอบสนองวัตถุประสงค์ส่วนใหญ่โดยไม่มีปัญหา


9

ใช้ PHP คุณสามารถคำนวณระยะทางโดยใช้ฟังก์ชั่นง่าย ๆ นี้:

// เพื่อคำนวณระยะห่างระหว่างละติจูดและลองจิจูดสองอัน

ฟังก์ชัน calcul_distance ($ lat1, $ lon1, $ lat2, $ lon2, $ unit = 'N') 
{ 
  $ theta = $ lon1 - $ lon2; 
  $ dist = sin (deg2rad ($ lat1)) * sin (deg2rad ($ lat2)) + cos (deg2rad ($ lat1)) * cos (deg2rad ($ lat2)) * cos (deg2rad ($ theta)); 
  $ dist = acos ($ dist); 
  $ dist = rad2deg ($ dist); 
  $ ไมล์ = $ dist * 60 * 1.1515;
  $ unit = strtoupper ($ unit);

  ถ้า ($ หน่วย == "K") {
    ผลตอบแทน ($ ไมล์ * 1.609344); 
  } อื่นถ้า ($ หน่วย == "N") {
      ผลตอบแทน ($ ไมล์ * 0.8684);
    } อื่น {
        ส่งคืนไมล์
      }
}

// ฟังก์ชันสิ้นสุดที่นี่

2
มีเงื่อนไขในฟังก์ชั่นว่าถ้าคุณผ่านยูนิตKแล้วมันจะให้ระยะทางเป็นกิโลเมตร ตรวจสอบ.
คนตาย

ฟังก์ชั่นนี้ใช้งานได้ดีมากและให้ระยะห่างจากตำแหน่งดาวไปยังตำแหน่งทั้งหมด สามารถสำรวจเส้นทาง b ก่อนเป็นอันดับแรกและเป็นแหล่งที่มาหรือเริ่มแล้วพบว่ามันอยู่ใกล้ที่สุด แต่ไม่ใช่แหล่งแรกและอื่น ๆ ทั้งหมดหรือไม่
Waheed ur Rehman

8

ออฟไลน์โซลูชั่น - อัลกอริทึม Haversine

ใน Javascript

var _eQuatorialEarthRadius = 6378.1370;
var _d2r = (Math.PI / 180.0);

function HaversineInM(lat1, long1, lat2, long2)
{
    return (1000.0 * HaversineInKM(lat1, long1, lat2, long2));
}

function HaversineInKM(lat1, long1, lat2, long2)
{
    var dlong = (long2 - long1) * _d2r;
    var dlat = (lat2 - lat1) * _d2r;
    var a = Math.pow(Math.sin(dlat / 2.0), 2.0) + Math.cos(lat1 * _d2r) * Math.cos(lat2 * _d2r) * Math.pow(Math.sin(dlong / 2.0), 2.0);
    var c = 2.0 * Math.atan2(Math.sqrt(a), Math.sqrt(1.0 - a));
    var d = _eQuatorialEarthRadius * c;

    return d;
}

var meLat = -33.922982;
var meLong = 151.083853;


var result1 = HaversineInKM(meLat, meLong, -32.236457779983745, 148.69094705162837);
var result2 = HaversineInKM(meLat, meLong, -33.609020205923713, 150.77061469270831);

ค#

using System;

public class Program
{
    public static void Main()
    {
        Console.WriteLine("Hello World");

        var meLat = -33.922982;
        double meLong = 151.083853;


        var result1 = HaversineInM(meLat, meLong, -32.236457779983745, 148.69094705162837);
        var result2 = HaversineInM(meLat, meLong, -33.609020205923713, 150.77061469270831);

        Console.WriteLine(result1);
        Console.WriteLine(result2);
    }

    static double _eQuatorialEarthRadius = 6378.1370D;
    static double _d2r = (Math.PI / 180D);

    private static int HaversineInM(double lat1, double long1, double lat2, double long2)
    {
        return (int)(1000D * HaversineInKM(lat1, long1, lat2, long2));
    }

    private static  double HaversineInKM(double lat1, double long1, double lat2, double long2)
    {
        double dlong = (long2 - long1) * _d2r;
        double dlat = (lat2 - lat1) * _d2r;
        double a = Math.Pow(Math.Sin(dlat / 2D), 2D) + Math.Cos(lat1 * _d2r) * Math.Cos(lat2 * _d2r) * Math.Pow(Math.Sin(dlong / 2D), 2D);
        double c = 2D * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1D - a));
        double d = _eQuatorialEarthRadius * c;

        return d;
    }
}

การอ้างอิง: https://en.wikipedia.org/wiki/Great-circle_distance


3

ต้องทำ ... วิธีการกระทำของสคริปต์

//just make sure you pass a number to the function because it would accept you mother in law...
public var rad = function(x:*) {return x*Math.PI/180;}

protected  function distHaversine(p1:Object, p2:Object):Number {
    var R:int = 6371; // earth's mean radius in km
    var dLat:Number = rad(p2.lat() - p1.lat());
    var dLong:Number = rad(p2.lng() - p1.lng());

    var a:Number = Math.sin(dLat/2) * Math.sin(dLat/2) +
                Math.cos(rad(p1.lat())) * Math.cos(rad(p2.lat())) * Math.sin(dLong/2) * Math.sin(dLong/2);
    var c:Number = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
    var d:Number = R * c;

    return d;
}

3

ในกรณีของฉันเป็นการดีที่สุดที่จะคำนวณสิ่งนี้ใน SQL Server เนื่องจากฉันต้องการใช้ตำแหน่งปัจจุบันแล้วค้นหารหัสไปรษณีย์ทั้งหมดภายในระยะทางที่แน่นอนจากตำแหน่งปัจจุบัน ฉันยังมี DB ซึ่งมีรายการรหัสไปรษณีย์และความยาว lat ของพวกเขา ไชโย

--will return the radius for a given number
create function getRad(@variable float)--function to return rad
returns float
as
begin
declare @retval float 
select @retval=(@variable * PI()/180)
--print @retval
return @retval
end
go

--calc distance
--drop function dbo.getDistance
create function getDistance(@cLat float,@cLong float, @tLat float, @tLong float)
returns float
as
begin
declare @emr float
declare @dLat float
declare @dLong float
declare @a float
declare @distance float
declare @c float

set @emr = 6371--earth mean 
set @dLat = dbo.getRad(@tLat - @cLat);
set @dLong = dbo.getRad(@tLong - @cLong);
set @a = sin(@dLat/2)*sin(@dLat/2)+cos(dbo.getRad(@cLat))*cos(dbo.getRad(@tLat))*sin(@dLong/2)*sin(@dLong/2);
set @c = 2*atn2(sqrt(@a),sqrt(1-@a))
set @distance = @emr*@c;
set @distance = @distance * 0.621371 -- i needed it in miles
--print @distance
return @distance;
end 
go


--get all zipcodes within 2 miles, the hardcoded #'s would be passed in by C#
select *
from cityzips a where dbo.getDistance(29.76,-95.38,a.lat,a.long) <3
order by zipcode

ไม่แน่ใจว่ามีประสิทธิภาพสำหรับการใช้งานฝั่งไคลเอ็นต์
Nizar B.

อาจไม่ใช่วิธีการแก้ปัญหาส่วนหน้า แต่แน่นอนว่าฉันกำลังมองหา ขอบคุณ
st_stefanov

3
//JAVA
    public Double getDistanceBetweenTwoPoints(Double latitude1, Double longitude1, Double latitude2, Double longitude2) {
    final int RADIUS_EARTH = 6371;

    double dLat = getRad(latitude2 - latitude1);
    double dLong = getRad(longitude2 - longitude1);

    double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(getRad(latitude1)) * Math.cos(getRad(latitude2)) * Math.sin(dLong / 2) * Math.sin(dLong / 2);
    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
    return (RADIUS_EARTH * c) * 1000;
    }

    private Double getRad(Double x) {
    return x * Math.PI / 180;
    }

1

มันค่อนข้างง่ายโดยใช้บริการ Google Distance Matrix

ขั้นตอนแรกคือเปิดใช้งานบริการ Distance Matrix จากคอนโซลของ Google API มันส่งคืนระยะทางระหว่างชุดของตำแหน่ง และใช้ฟังก์ชั่นที่เรียบง่ายนี้

function initMap() {
        var bounds = new google.maps.LatLngBounds;
        var markersArray = [];

        var origin1 = {lat:23.0203, lng: 72.5562};
        //var origin2 = 'Ahmedabad, India';
        var destinationA = {lat:23.0436503, lng: 72.55008939999993};
        //var destinationB = {lat: 23.2156, lng: 72.6369};

        var destinationIcon = 'https://chart.googleapis.com/chart?' +
            'chst=d_map_pin_letter&chld=D|FF0000|000000';
        var originIcon = 'https://chart.googleapis.com/chart?' +
            'chst=d_map_pin_letter&chld=O|FFFF00|000000';
        var map = new google.maps.Map(document.getElementById('map'), {
          center: {lat: 55.53, lng: 9.4},
          zoom: 10
        });
        var geocoder = new google.maps.Geocoder;

        var service = new google.maps.DistanceMatrixService;
        service.getDistanceMatrix({
          origins: [origin1],
          destinations: [destinationA],
          travelMode: 'DRIVING',
          unitSystem: google.maps.UnitSystem.METRIC,
          avoidHighways: false,
          avoidTolls: false
        }, function(response, status) {
          if (status !== 'OK') {
            alert('Error was: ' + status);
          } else {
            var originList = response.originAddresses;
            var destinationList = response.destinationAddresses;
            var outputDiv = document.getElementById('output');
            outputDiv.innerHTML = '';
            deleteMarkers(markersArray);

            var showGeocodedAddressOnMap = function(asDestination) {
              var icon = asDestination ? destinationIcon : originIcon;
              return function(results, status) {
                if (status === 'OK') {
                  map.fitBounds(bounds.extend(results[0].geometry.location));
                  markersArray.push(new google.maps.Marker({
                    map: map,
                    position: results[0].geometry.location,
                    icon: icon
                  }));
                } else {
                  alert('Geocode was not successful due to: ' + status);
                }
              };
            };

            for (var i = 0; i < originList.length; i++) {
              var results = response.rows[i].elements;
              geocoder.geocode({'address': originList[i]},
                  showGeocodedAddressOnMap(false));
              for (var j = 0; j < results.length; j++) {
                geocoder.geocode({'address': destinationList[j]},
                    showGeocodedAddressOnMap(true));
                //outputDiv.innerHTML += originList[i] + ' to ' + destinationList[j] + ': ' + results[j].distance.text + ' in ' +                    results[j].duration.text + '<br>';
                outputDiv.innerHTML += results[j].distance.text + '<br>';
              }
            }

          }
        });
      }

โดยที่ Origin1 คือที่ตั้งของคุณและปลายทาง A คือที่ตั้งปลายทางคุณสามารถเพิ่มข้อมูลสองรายการขึ้นไปได้

Rad Full Documentationพร้อมตัวอย่าง


1
  /**
   * Calculates the haversine distance between point A, and B.
   * @param {number[]} latlngA [lat, lng] point A
   * @param {number[]} latlngB [lat, lng] point B
   * @param {boolean} isMiles If we are using miles, else km.
   */
  function haversineDistance(latlngA, latlngB, isMiles) {
    const squared = x => x * x;
    const toRad = x => (x * Math.PI) / 180;
    const R = 6371; // Earth’s mean radius in km

    const dLat = toRad(latlngB[0] - latlngA[0]);
    const dLon = toRad(latlngB[1] - latlngA[1]);

    const dLatSin = squared(Math.sin(dLat / 2));
    const dLonSin = squared(Math.sin(dLon / 2));

    const a = dLatSin +
              (Math.cos(toRad(latlngA[0])) * Math.cos(toRad(latlngB[0])) * dLonSin);
    const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
    let distance = R * c;

    if (isMiles) distance /= 1.609344;

    return distance;
  }

ฉันพบรุ่นออนไลน์ที่ถูกต้อง 80% แต่เสียบในพารามิเตอร์ที่ไม่ถูกต้องและไม่สอดคล้องกับการใช้อินพุตรุ่นนี้แก้ไขได้อย่างสมบูรณ์


0

ในการคำนวณระยะทางบน Google Maps คุณสามารถใช้ Directions API นั่นจะเป็นหนึ่งในวิธีที่ง่ายที่สุดที่จะทำ ในการรับข้อมูลจาก Google Server คุณสามารถใช้ Retrofit หรือ Volley ทั้งสองมีข้อได้เปรียบของตัวเอง ลองดูรหัสต่อไปนี้ที่ฉันใช้ retrofit เพื่อนำไปใช้งาน:

private void build_retrofit_and_get_response(String type) {

    String url = "https://maps.googleapis.com/maps/";

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(url)
            .addConverterFactory(GsonConverterFactory.create())
            .build();

    RetrofitMaps service = retrofit.create(RetrofitMaps.class);

    Call<Example> call = service.getDistanceDuration("metric", origin.latitude + "," + origin.longitude,dest.latitude + "," + dest.longitude, type);

    call.enqueue(new Callback<Example>() {
        @Override
        public void onResponse(Response<Example> response, Retrofit retrofit) {

            try {
                //Remove previous line from map
                if (line != null) {
                    line.remove();
                }
                // This loop will go through all the results and add marker on each location.
                for (int i = 0; i < response.body().getRoutes().size(); i++) {
                    String distance = response.body().getRoutes().get(i).getLegs().get(i).getDistance().getText();
                    String time = response.body().getRoutes().get(i).getLegs().get(i).getDuration().getText();
                    ShowDistanceDuration.setText("Distance:" + distance + ", Duration:" + time);
                    String encodedString = response.body().getRoutes().get(0).getOverviewPolyline().getPoints();
                    List<LatLng> list = decodePoly(encodedString);
                    line = mMap.addPolyline(new PolylineOptions()
                                    .addAll(list)
                                    .width(20)
                                    .color(Color.RED)
                                    .geodesic(true)
                    );
                }
            } catch (Exception e) {
                Log.d("onResponse", "There is an error");
                e.printStackTrace();
            }
        }

        @Override
        public void onFailure(Throwable t) {
            Log.d("onFailure", t.toString());
        }
    });

}

ด้านบนเป็นรหัสของฟังก์ชัน build_retrofit_and_get_response สำหรับการคำนวณระยะทาง ด้านล่างเป็นชุดติดตั้งเพิ่มเติมที่เกี่ยวข้อง:

package com.androidtutorialpoint.googlemapsdistancecalculator;


import com.androidtutorialpoint.googlemapsdistancecalculator.POJO.Example;

import retrofit.Call;
import retrofit.http.GET;
import retrofit.http.Query;

public interface RetrofitMaps {


/*
 * Retrofit get annotation with our URL
 * And our method that will return us details of student.
 */
@GET("api/directions/json?key=AIzaSyC22GfkHu9FdgT9SwdCWMwKX1a4aohGifM")
Call<Example> getDistanceDuration(@Query("units") String units, @Query("origin") String origin, @Query("destination") String destination, @Query("mode") String mode);

}

ฉันหวังว่านี่จะอธิบายข้อความค้นหาของคุณ ดีที่สุด :)

ที่มา: Google คำนวณระยะทาง


ไม่ - คำนวณระยะการเดินทาง (บนถนนและอื่น ๆ ) ไม่ใช่ระยะทางมาตราส่วนแบบจุดต่อจุด
Yarin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.