গুগল ম্যাপস ভি 3 এ দুটি পয়েন্টের মধ্যে দূরত্ব গণনা করুন


319

গুগল ম্যাপস ভি 3 এ দুটি চিহ্নিতকারীদের মধ্যে দূরত্বটি আপনি কীভাবে গণনা করবেন? ( distanceFromইনভি 2 ফাংশনের অনুরূপ।)

ধন্যবাদ ..


উত্তর:


460

আপনি যদি এটি নিজেই গণনা করতে চান তবে আপনি হ্যাভারসাইন সূত্রটি ব্যবহার করতে পারেন:

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
আপনি কেন সবচেয়ে সহজ ম্যাথ.অ্যাসিনের (ম্যাথ.এসকিআরটি (ক)) এর পরিবর্তে ম্যাথ.টান 2 (ম্যাথ.এসকিআর্ট (ক), ম্যাথ.সকিআর্ট (1-এ)) ব্যবহার করার পরামর্শ দিচ্ছেন?
ইমানুওল পাওলিনী

3
@ এমানুয়েলপোলিনি - গাণিতিকভাবে, atan2 (sqrt (a), sqrt (1-a)) = asin (sqrt (a)) = acos (sqrt (1-a)), তবে atan2 সংস্করণটি সমস্ত মানের জন্য সংখ্যাগতভাবে আরও ভাল শর্তযুক্ত রয়েছে ক।
ChrisV

23
ছেলেরা। প্রশ্ন। 1 অক্ষরের ভেরিয়েবল নামগুলি এমন সমস্যাগুলি সমাধান করার জন্য কেন আপনি এত পছন্দ করেন যেখানে কিছু কল্পনা প্রয়োজন যেখানে ভাল ভেরিয়েবল নাম সহায়ক হতে পারে? শুধু জিজ্ঞাসা করছেন :)
পাই 6 কে

2
এটি ভের আর = = 6371 হওয়া উচিত নয়; কিমি?
আলেকজান্ডার ফ্রেডিয়ানী 25'16

5
p1.lat()এবং p1.lng()ফাংশন অনুমান আপনার ইনপুট ডেটা google.maps.LatLngবস্তু। যদি আপনার কাছে কেবল কাঁচা ডেটা থাকে {lat: __, lon: __}তবে আপনি পরিবর্তে ব্যবহার করতে পারেন p1.lat, উদাহরণস্বরূপ।
ডন ম্যাককুরডি 24'17

308

GMap3 এ আসলে একটি পদ্ধতি আছে বলে মনে হচ্ছে। এটি একটি স্ট্যাটিক পদ্ধতিgoogle.maps.geometry.spherical নেমস্পেসের ।

এটি দুটি যুক্তি হিসাবে গ্রহণ করে LatLng করে এবং 637813১1378 মিটারের একটি ডিফল্ট আর্থ ব্যাসার্ধ ব্যবহার করবে, যদিও প্রয়োজনে ডিফল্ট ব্যাসার্ধ একটি কাস্টম মান দিয়ে ওভাররাইড করা যেতে পারে।

আপনি অন্তর্ভুক্ত নিশ্চিত করুন:

<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% পার্থক্য রয়েছে?
ম্যাট এস

7
@ রামেনরেকন আমি নিশ্চিত নই তবে একটি ধারণা হ'ল তারা পৃথিবীর ব্যাসার্ধের জন্য বিভিন্ন মান ব্যবহার করে।
এমিল বাধ

11
@ রমেনরেকন হ্যাঁ, এমিল এ সম্পর্কে সঠিক। ডকুমেন্টেশনটি বলে: ডিফল্ট ব্যাসার্ধটি পৃথিবীর ব্যাসার্ধ 63৩7878১1377 মিটার। তবে উপরের হাওয়ারসিনে মাইক পরিবর্তে 63৩71১ কিমি ব্যবহার করে।
লাসজলো

উপরের লিঙ্কটি এখন ভেঙে গেছে, তবে পদ্ধতির ব্যাখ্যা এটি খুব বেশি সমস্যার সমাধান করে না।
জিচর্ন

2
@ এবিসিডি.সিএ এটি আমার নম্বর নয়। এই প্রশ্নটি গুগল ম্যাপস লাইব্রেরির 3 সংস্করণ সম্পর্কে। আপনি জিজ্ঞাসা করলেন কেন আপনার গণনাটি তার চেয়ে আলাদা। কারণ তারা পৃথিবীর ব্যাসার্ধের চেয়ে পৃথক মান ব্যবহার করে। সংখ্যার জন্য রেফারেন্স? developers.google.com/maps/docamentation/javascript/… শিরোনামের ঠিক নীচে।
এমিল বাধ

30

জিপিএস অক্ষাংশ / দ্রাঘিমাংশ 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 প্রয়োজন আমি নোড.জেজে উপরের কোডটি ব্যবহার করতে চাই। আমার কোন মডিউল ইনস্টল করা উচিত এবং আমার কোন ফাইলগুলির প্রয়োজন।
কিসর

15

আপনার জাভাস্ক্রিপ্ট কোডটির শুরুতে এটি কেবল যুক্ত করুন:

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);

সমাধানটি উত্তোলন করুন তবে আমি জানতে চাই যে এটি কোন ইউনিটগুলিতে ফলাফলটি ফিরিয়ে দিচ্ছে। আমি 3.013 পেয়েছি .. এটি কি মাইল, কিমি ??
গৌঠামি গ্যাটিনেণী

প্রত্যাবর্তিত মানটি মিটারে। সুতরাং ডিস্ট / 1000 আপনাকে কিমিতে মান দেয়।
প্রবীণ জনকারাজন

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
এটি সেরা উত্তর। গুগল এপিআই-এর ইতিমধ্যে ফাংশনগুলি থাকাকালীন কেন কোনও ফাংশন যুক্ত করুন
ফেলিক্সফেকার

এই API এর জন্য কোনও জাভা বৈকল্পিক উপলব্ধ? অনেক খোঁজাখুঁজির পরেও এটি পেলাম না।
সংকেত

@ ফেলিক্সফাবেকার, কারণ আপনি এমন একটি পরিবেশে কাজ করছেন যেখানে আপনি গুগল ম্যাপস এপিআই কোনও scriptট্যাগটিতে and োকাতে এবং সেই পদ্ধতিগুলি কল করতে পারবেন না । মতামত-দেশীয়।
Nnanyielugo

11

এখানে এই ফোরামের সি # বাস্তবায়ন

 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 মানচিত্রে এটি কীভাবে করা যায় তার মূল প্রশ্নের ক্ষেত্রে প্রযোজ্য না।
নিক্লাস ওল্ফ

সরাসরি দূরত্ব গণনা করার জন্য কোনও ইনবিল্ট ফাংশন নেই, আপনাকে দুটি পয়েন্টের জন্য ডিরেক্টরি পরিষেবা ব্যবহার করতে হবে এবং ফিরে আসা এক্সএমএল / জেএসএন থেকে দূরত্বটি বের করতে হবে।
নাভেদ আহমেদ

1
আমার মন্তব্যটি এই বিষয়ে ছিল যে জাভাস্ক্রিপ্টে কোনও সমাধান সরবরাহ করা আরও ভাল হত, কারণ থ্রেড স্টার্টার যদি সে পিএইচপি,। নেট বা স্ট্যাটিক এইচটিএমএল ব্যবহার করে তবে তা বলেননি।
নিক্লাস ওল্ফ

11

গুগল দিয়ে আপনি এটি ব্যবহার করে এটি করতে পারেন গোলাকার এপিআই ,google.maps.geometry.spherical.computeDistanceBetween (latLngA, latLngB);

তবে, যদি কোনও গোলকীয় প্রক্ষেপণ বা হ্যাওয়ারসিন দ্রবণের যথার্থতা আপনার পক্ষে যথাযথভাবে সঠিক না হয় (উদাহরণস্বরূপ যদি আপনি পোলের কাছাকাছি থাকেন বা দীর্ঘ দূরত্বের গণনা করছেন), আপনার আলাদা লাইব্রেরি ব্যবহার করা উচিত।

উইকিপিডিয়ায় আমি এই বিষয়টির সর্বাধিক তথ্য পেয়েছি এখানে

কোনও প্রদত্ত অ্যালগরিদমের যথার্থতা যথেষ্ট কিনা তা দেখার কৌশলটি পৃথিবীর সর্বাধিক এবং ন্যূনতম ব্যাসার্ধ পূরণ করা এবং এই পার্থক্যটি আপনার ব্যবহারের ক্ষেত্রে সমস্যার কারণ হতে পারে কিনা তা দেখার জন্য trick আরও অনেক বিবরণ এই নিবন্ধে পাওয়া যাবে

শেষ পর্যন্ত গুগল এপিআই বা হ্যাওয়ারিন সমস্যা ছাড়াই বেশিরভাগ উদ্দেশ্যে পরিবেশন করবে।


9

পিএইচপি ব্যবহার করে, আপনি এই সাধারণ ফাংশনটি ব্যবহার করে দূরত্বটি গণনা করতে পারেন:

// দুটি ল্যাট এবং লম্বার মধ্যে দূরত্ব গণনা করতে

ফাংশন গণনা_দূরত্ব ($ lat1, $ দীর্ঘ 1, $ ল্যাট 2, $ লোন 2, $ ইউনিট = 'এন') 
{ 
  $ theta = $ lon1 - $ lon2; 
  $ dist = sin (deg2rad (rad lat1)) * sin (deg2rad ($ lat2)) + cos (deg2rad ($ lat1)) * cos (deg2rad ($ lat2)) * cos (deg2rad ($ theta)); 
  $ dist = acos ($ dist); 
  $ dist = rad2deg ($ দূর); 
  $ মাইল = $ দিশ * 60 * 1.1515;
  $ ইউনিট = স্ট্র্টউপার ($ ইউনিট);

  যদি ($ ইউনিট == "কে") {
    রিটার্ন ($ মাইল * 1.609344); 
  } অন্যথায় যদি ($ ইউনিট == "এন") {
      ফিরে ($ মাইল * 0.8684);
    } অন্য {
        ফিরে $ মাইল;
      }
}

// ফাংশন এখানে শেষ হয়

2
ফাংশনে একটি শর্ত রয়েছে যে আপনি যদি ইউনিটটি পাস করেন Kতবে এটি আপনাকে কেমি থেকে দূরত্ব দেয়। এটি পরীক্ষা করে দেখুন।
ডেড ম্যান

এই ফাংশনটি খুব ভালভাবে কাজ করে এবং এটি তারার অবস্থান থেকে সমস্ত অবস্থানের দূরত্ব দেয়। এটি কি কোনও উপায়ে ট্র্যাভার করতে পারে প্রথমে এটি প্রথম ক্লোজিস্ট অবস্থানটি সন্ধান করে এবং এটি উত্স হিসাবে শুরু হয় বা শুরু হয় এবং তারপরে এটি পরের নিকটতম তবে প্রথম উত্সটি নয় এবং সকলের কাছে খুঁজে পেতে পারে?
ওয়াহেদ উর রেহমান

8

অফলাইন সমাধান - হ্যাভারসাইন অ্যালগরিদম

জাভাস্ক্রিপ্টে

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.wikedia.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

আমার ক্ষেত্রে এটি এসকিউএল সার্ভারে গণনা করা ভাল ছিল, যেহেতু আমি বর্তমান অবস্থান নিতে এবং তারপরে বর্তমান অবস্থান থেকে একটি নির্দিষ্ট দূরত্বে সমস্ত জিপ কোডগুলি অনুসন্ধান করতে চাইছিলাম। আমার একটি ডিবিও ছিল যা পিন কোডগুলির তালিকা এবং তাদের দীর্ঘতর দীর্ঘস্থায়ী তালিকা রয়েছে। চিয়ার্স

--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

নিশ্চিত নয় যে এটি কোনও ক্লায়েন্টের পাশের ব্যবহারের জন্য দক্ষ।
নিজার বি

সামনের শেষ সমাধান নাও হতে পারে তবে অবশ্যই আমি যা খুঁজছিলাম। ধন্যবাদ।
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

এটি ব্যবহার করা বেশ সহজ গুগল দূরত্বের ম্যাট্রিক্স পরিষেবাটি

প্রথম পদক্ষেপটি হ'ল গুগল এপিআই কনসোল থেকে দূরত্বের ম্যাট্রিক্স পরিষেবাটি সক্রিয় করা। এটি অবস্থানের একটি সেট মধ্যে দূরত্ব ফেরত। এবং এই সাধারণ ফাংশন প্রয়োগ করুন

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>';
              }
            }

          }
        });
      }

যেখানে অরিজিন 1 আপনার অবস্থান এবং গন্তব্যএটি হ'ল গন্তব্যস্থান। আপনি উপরোক্ত দুটি বা আরও বেশি ডেটা যুক্ত করতে পারেন।

উদাহরণ সহ র‌্যাড ফুল ডকুমেন্টেশন


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;
  }

আমি অনলাইনে একটি সংস্করণ পেয়েছি যা ৮০% সঠিক তবে ভুল প্যারামিটারে প্লাগ হয়েছে এবং ইনপুটগুলি ব্যবহারে অসামঞ্জস্যপূর্ণ, এই সংস্করণটি পুরোপুরি ঠিক হয়েছে


0

গুগল ম্যাপে দূরত্ব গণনা করতে, আপনি দিকনির্দেশ API ব্যবহার করতে পারেন। এটি করার অন্যতম সহজ উপায় এটি হবে। গুগল সার্ভার থেকে ডেটা পেতে, আপনি রেট্রোফিট বা ভল্লি ব্যবহার করতে পারেন। উভয়েরই নিজস্ব সুবিধা রয়েছে। নিম্নলিখিত কোডটি একবার দেখুন যেখানে আমি এটি বাস্তবায়নের জন্য রেট্রোফিট ব্যবহার করেছি:

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());
        }
    });

}

উপরে দূরত্ব গণনা করার জন্য ফাংশনের বিল্ড_রেটফিট_এন্ড_জেট_অগ্রহকারের কোড রয়েছে। নীচে রিট্রোফিট ইন্টারফেস সম্পর্কিত:

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);

}

আমি আশা করি এটি আপনার প্রশ্নের ব্যাখ্যা দেয় শুভকামনা :)

উত্স: গুগল ম্যাপস দূরত্বের ক্যালকুলেটর


না- এটি ভ্রমণের দূরত্ব গণনা করে (রাস্তাগুলিতে ইত্যাদি), পয়েন্ট-টু-পয়েন্ট জিওডেসিক দূরত্ব নয়।
ইয়ারিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.