দুটি অক্ষাংশ-দ্রাঘিমাংশ পয়েন্টের মধ্যে দূরত্ব গণনা করবেন? (হ্যাভারসাইন সূত্র)


905

অক্ষাংশ এবং দ্রাঘিমাংশ দ্বারা নির্দিষ্ট করা দুটি পয়েন্টের মধ্যে আমি দূরত্বটি কীভাবে গণনা করব?

স্পষ্টতার জন্য, আমি কিলোমিটারের দূরত্ব চাই; পয়েন্টগুলি WGS84 সিস্টেম ব্যবহার করে এবং আমি উপলব্ধ পদ্ধতির আপেক্ষিক যথাযথতা বুঝতে চাই।


আরও সঠিক নির্ভুলতার জন্য - দেখুন স্ট্যাকওভারফ্লো.com
প্রশ্নগুলি /

3
মনে রাখবেন যে আপনি ডাব্লুজিএস ৮৪ এর মতো বিপ্লবের উপবৃত্তাকারে একটি হাভারসাইন সূত্র প্রয়োগ করতে পারবেন না You আপনি কেবলমাত্র ব্যাসার্ধের সাথে একটি গোলকের ক্ষেত্রে এই পদ্ধতিটি প্রয়োগ করতে পারেন।
মাইক টি

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

@ মাইকটি - সত্য যদিও এখানকার অনেক উত্তর ছোট দূরত্বের জন্য দরকারী বলে মনে হচ্ছে : আপনি যদি ডাব্লুজিএস ৮৪ থেকে ল্যাট / লম্বা নেন এবং হাওরসাইন প্রয়োগ করেন যেমন একটি গোলকের পয়েন্ট ছিল তবে আপনি কি উত্তর পাবেন না যার ত্রুটি কেবলমাত্র কারণে পৃথিবীর চ্যাপ্টা ফ্যাক্টর, তাই সম্ভবত আরও সঠিক সূত্রের 1% এর মধ্যে? এই সংক্ষিপ্ত দূরত্বে যে সাবধানতা অবলম্বন রয়েছে তা দিয়ে একটি শহরের মধ্যেই বলুন।
টুলমেকারস্টেভ

1
এই plateforms জন্য: মনো / .NET 4.5 / .NET কোর / উইন্ডোজ ফোন 8.x / ইউনিভার্সাল উইন্ডোজ প্ল্যাটফর্ম / Xamarin আইওএস / Xamarin অ্যান্ড্রয়েড দেখতে stackoverflow.com/a/54296314/2736742
উ: মোরেল

উত্তর:


1144

এই লিঙ্কটি আপনার পক্ষে সহায়ক হতে পারে, কারণ এটি দূরত্ব গণনার জন্য হ্যাভারসাইন সূত্রের ব্যবহারের বিবরণ দেয় ।

উদ্ধৃতাংশ:

এই স্ক্রিপ্টটি [জাভাস্ক্রিপ্টে] দুটি পয়েন্টের মধ্যে - অর্থাৎ, পৃথিবীর পৃষ্ঠের সবচেয়ে কমতম দূরত্ব - 'হ্যাভারসাইন' সূত্র ব্যবহার করে দুর্দান্ত চক্রের দূরত্ব গণনা করে।

function getDistanceFromLatLonInKm(lat1,lon1,lat2,lon2) {
  var R = 6371; // Radius of the earth in km
  var dLat = deg2rad(lat2-lat1);  // deg2rad below
  var dLon = deg2rad(lon2-lon1); 
  var a = 
    Math.sin(dLat/2) * Math.sin(dLat/2) +
    Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * 
    Math.sin(dLon/2) * Math.sin(dLon/2)
    ; 
  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
  var d = R * c; // Distance in km
  return d;
}

function deg2rad(deg) {
  return deg * (Math.PI/180)
}

51
এই গণনা / পদ্ধতিটি পৃথিবীর জন্য একটি গোলক (একটি নিখুঁত গোলক নয়) হিসাবে অ্যাকাউন্ট করে? মূল প্রশ্নটি ডাব্লুজিএস ৮৪ গ্লোবের পয়েন্টগুলির মধ্যে দূরত্ব চেয়েছিল। নিখুঁত গোলকটি ব্যবহার করে ত্রুটিটি কতটা নিচে নেমেছে তা নিশ্চিত নয়, তবে আমার সন্দেহ যে পয়েন্টগুলি পৃথিবীতে কোথায় রয়েছে তার উপর নির্ভর করে এটি যথেষ্ট পরিমাণে হতে পারে, সুতরাং এই পার্থক্যটি মনে রাখা ভাল।
redcalx

15
হাওয়ারসাইন সূত্রটি পৃথিবীটিকে গোলাকৃতির হিসাবে বিবেচনা করে না, সুতরাং সেই কারণেই আপনি কিছু ত্রুটি প্রবর্তন করবেন। এটি 0.5% এর থেকে ভাল এর গ্যারান্টিযুক্ত হতে পারে না। এটি ত্রুটির একটি গ্রহণযোগ্য স্তর হতে পারে বা নাও হতে পারে।
ব্র্যান্ডন

24
উইকিপিডিয়া নিবন্ধটি ব্যবহার করে যে সূত্রটি সরাসরি প্রয়োগ করা হবে তার Math.atan2(Math.sqrt(a), Math.sqrt(1-a))পরিবর্তে ব্যবহার করার কোনও কারণ আছে কি Math.asin(Math.sqrt(h))? এটি কি আরও দক্ষ এবং / বা সংখ্যার চেয়ে বেশি স্থিতিশীল?
Musiphil

16
@ উসমান মুতাওয়াকিল ভাল, আপনি যে 38 মাইল পাবেন তা রাস্তার দূরত্ব। এই অ্যালগরিদম পৃথিবীর পৃষ্ঠের উপর একটি সরলরেখার দূরত্ব গণনা করে। গুগল ম্যাপের একটি দূরত্বের সরঞ্জাম রয়েছে (নীচে বাম, "ল্যাবগুলি") যা একই কাজ করে, তুলনা করতে এটি ব্যবহার করুন।
পাস্কাল

4
@ ফোর্ট_201092: কারণ এটি প্রয়োজনীয় নয় - (sin(x))²সমান হিসাবে(sin(-x))²
জিন হোমিনাল

359

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

function distance(lat1, lon1, lat2, lon2) {
  var p = 0.017453292519943295;    // Math.PI / 180
  var c = Math.cos;
  var a = 0.5 - c((lat2 - lat1) * p)/2 + 
          c(lat1 * p) * c(lat2 * p) * 
          (1 - c((lon2 - lon1) * p))/2;

  return 12742 * Math.asin(Math.sqrt(a)); // 2 * R; R = 6371 km
}

আপনি আমার jscreen নিয়ে খেলতে পারেন এবং ফলাফলগুলি এখানে দেখতে পারেন ।

সম্প্রতি পাইথনেও আমার একই কাজ করা দরকার ছিল, তাই এখানে অজগর বাস্তবায়ন :

from math import cos, asin, sqrt, pi

def distance(lat1, lon1, lat2, lon2):
    p = pi/180
    a = 0.5 - cos((lat2-lat1)*p)/2 + cos(lat1*p) * cos(lat2*p) * (1-cos((lon2-lon1)*p))/2
    return 12742 * asin(sqrt(a)) #2*R*asin...

এবং সম্পূর্ণতার জন্য: উইকিতে হ্যাভারসাইন


13
@ অ্যাংজুলার এম এবং খুব সম্ভবত এই সম্ভাবনা রয়েছে যে গুগল দূরত্ব গণনা করে যদি আপনি কিছু রাস্তা নিচ্ছেন এবং কোনও সরল রেখা নয়।
সালভাদোর ডালি

3
গুগল ড্রাইভিংয়ের দূরত্ব গণনা করে, এটি "কাকটি উড়ে যাওয়ার সাথে সাথে" গণনা করে
শখের শখের

4
@ ওউডি এবং এটির গতি বাড়বে? সম্ভবত সম্ভবত না, তবে আমি পুরানো ব্রাউজারগুলিতে কপিরাইট করা লোকদের জন্য প্রচুর 'আপনার জিনিসগুলি কাজ করে না "শেষ করব
সালভাদোর ডালি

4
হ্যাঁ তবে কি // 2 * R; R = 6371 kmবোঝায়? এবং বর্তমান পদ্ধতি কিমি বা মাইল উত্তর সরবরাহ করে? আরও ভাল ডকুমেন্টেশন প্রয়োজন। ধন্যবাদ
খলিল খালাফ

20
@ খলিলখালাফ আপনি এখানে রসিকতা করছেন বা ট্রল করার চেষ্টা করছেন? কিমি কিলোমিটার দাঁড়িয়ে। আপনি কী ভাবেন যে আর এর অর্থ দাঁড়ায় (বিশেষত যদি আমরা একটি শাপিয়ার কথা বলি)? আপনি ইতিমধ্যে কিমিটি দেখলে উত্তরটি কী ইউনিটে হবে তা অনুমান করুন। আপনি এখানে কী ধরনের ডকুমেন্টেশন সন্ধান করছেন: আক্ষরিকভাবে সেখানে 4 টি লাইন রয়েছে।
সালভাদোর ডালি

69

এখানে একটি সি # বাস্তবায়ন:

static class DistanceAlgorithm
{
    const double PIx = 3.141592653589793;
    const double RADIUS = 6378.16;

    /// <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 * RADIUS;
    }

}

14
আপনি নিরক্ষীয় ব্যাসার্ধ ব্যবহার করছেন, তবে আপনার গড় ব্যাসার্ধটি ব্যবহার করা উচিত যা
is৩71১

7
এটি হওয়া উচিত নয় double dlon = Radians(lon2 - lon1);এবংdouble dlat = Radians(lat2 - lat1);
ক্রিস মেরিসিক

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

আমি আরেকটি সম্পাদনা জমা দিয়েছি কারণ ল্যাট 1 এবং ল্যাট 2 এরও রেডিয়ানে রূপান্তর করা দরকার। আমি এখানে পাওয়া সূত্র এবং কোডটির
ব্রায়ান বেদার্ড

না RADIUS6371 অন্যান্য উত্তর হতে মান লাগবে?
ক্রিস হেইস

66

এখানে হ্যাভারসাইন সূত্রটির একটি জাভা বাস্তবায়ন রয়েছে।

public final static double AVERAGE_RADIUS_OF_EARTH_KM = 6371;
public int calculateDistanceInKilometer(double userLat, double userLng,
  double venueLat, double venueLng) {

    double latDistance = Math.toRadians(userLat - venueLat);
    double lngDistance = Math.toRadians(userLng - venueLng);

    double a = Math.sin(latDistance / 2) * Math.sin(latDistance / 2)
      + Math.cos(Math.toRadians(userLat)) * Math.cos(Math.toRadians(venueLat))
      * Math.sin(lngDistance / 2) * Math.sin(lngDistance / 2);

    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));

    return (int) (Math.round(AVERAGE_RADIUS_OF_EARTH_KM * c));
}

দ্রষ্টব্য যে এখানে আমরা নিকটতম কিমি উত্তর গোল করছি।


2
আমরা যদি মিটারে দুটি পয়েন্টের মধ্যে দূরত্ব গণনা করতে চাই, তবে আরও সঠিক উপায়টি কী হবে? 6371000পৃথিবীর ব্যাসার্ধ হিসাবে ব্যবহার করতে ? (পৃথিবীর গড় ব্যাসার্ধটি 71৩71১০০০০ মিটার) বা আপনার কাজ থেকে কিলোমিটারকে মিটারে রূপান্তর করবে?
মাইক্রো

আপনি যদি মাইল চান, একাধিক ফলাফল0.621371
lasec0203

42

এই সমস্ত জন্য আপনাকে অনেক ধন্যবাদ। আমি আমার উদ্দেশ্য-সি আইফোন অ্যাপে নিম্নলিখিত কোডগুলি ব্যবহার করেছি:

const double PIx = 3.141592653589793;
const double RADIO = 6371; // Mean radius of Earth in Km

double convertToRadians(double val) {

   return val * PIx / 180;
}

-(double)kilometresBetweenPlace1:(CLLocationCoordinate2D) place1 andPlace2:(CLLocationCoordinate2D) place2 {

        double dlon = convertToRadians(place2.longitude - place1.longitude);
        double dlat = convertToRadians(place2.latitude - place1.latitude);

        double a = ( pow(sin(dlat / 2), 2) + cos(convertToRadians(place1.latitude))) * cos(convertToRadians(place2.latitude)) * pow(sin(dlon / 2), 2);
        double angle = 2 * asin(sqrt(a));

        return angle * RADIO;
}

অক্ষাংশ এবং দ্রাঘিমাংশ দশমিক হয়। আমি আসিন () কলের জন্য কমপক্ষে () ব্যবহার করিনি কারণ আমি যে দূরত্বগুলি ব্যবহার করছি তা এত কম যে তাদের প্রয়োজন হয় না।

আমি রেডিয়ানদের মানগুলিতে পাস না হওয়া পর্যন্ত এটি ভুল উত্তর দিয়েছে - এখন এটি অ্যাপলের মানচিত্র অ্যাপ্লিকেশন :-) থেকে প্রাপ্ত মানগুলির তুলনায় অনেকটাই সমান same

অতিরিক্ত আপডেট:

আপনি যদি iOS4 বা তার পরে ব্যবহার করছেন তবে অ্যাপল এটি করার জন্য কিছু পদ্ধতি সরবরাহ করে যাতে একই কার্যকারিতাটি অর্জন করা যায়:

-(double)kilometresBetweenPlace1:(CLLocationCoordinate2D) place1 andPlace2:(CLLocationCoordinate2D) place2 {

    MKMapPoint  start, finish;


    start = MKMapPointForCoordinate(place1);
    finish = MKMapPointForCoordinate(place2);

    return MKMetersBetweenMapPoints(start, finish) / 1000;
}

1
আইওএস এসডিকে নিজস্ব বাস্তবায়ন রয়েছে: developer.apple.com/library/ios/docamentation/CoreLocation/… :
tuler

আমার মনে হয় চারপাশের প্রথম বন্ধনীটি pow(sin(dlat / 2), 2) + cos(convertToRadians(place1.latitude))ভুল। এগুলি সরিয়ে ফেলুন এবং ফলাফলটি আমি যা পাই তার সাথে মেলে যখন আমি এই পৃষ্ঠায় অন্যান্য প্রয়োগগুলি ব্যবহার করি বা স্ক্র্যাচ থেকে উইকিপিডিয়া থেকে হাভারসাইন সূত্রটি প্রয়োগ করি ।
জেনেডপ

NYC এর জন্য স্থানাঙ্কগুলি (40.7127837, -74.0059413) এবং এলএর জন্য (34.052234, -118.243685) ব্যবহার করে, ()সেই পরিমাণের চারপাশে আমি 3869.75 পেয়েছি। তাদের ছাড়া, আমি 3935.75 পেয়েছি, যা ওয়েব অনুসন্ধানে পরিণত হয় pretty
জেনেডপ

40

এটি একটি সাধারণ পিএইচপি ফাংশন যা খুব যুক্তিসঙ্গত অনুমান দেয় (+/- 1% ত্রুটি মার্জিনের অধীনে)।

<?php
function distance($lat1, $lon1, $lat2, $lon2) {

    $pi80 = M_PI / 180;
    $lat1 *= $pi80;
    $lon1 *= $pi80;
    $lat2 *= $pi80;
    $lon2 *= $pi80;

    $r = 6372.797; // mean radius of Earth in km
    $dlat = $lat2 - $lat1;
    $dlon = $lon2 - $lon1;
    $a = sin($dlat / 2) * sin($dlat / 2) + cos($lat1) * cos($lat2) * sin($dlon / 2) * sin($dlon / 2);
    $c = 2 * atan2(sqrt($a), sqrt(1 - $a));
    $km = $r * $c;

    //echo '<br/>'.$km;
    return $km;
}
?>

আগে যেমন বলেছি; পৃথিবী গোলক নয়। এটি একটি পুরানো, পুরানো বেসবলের মতো যা মার্ক ম্যাকগায়ার অনুশীলন করার সিদ্ধান্ত নিয়েছিলেন - এটি ডেন্ট এবং বাধা দিয়ে পূর্ণ। সহজ গণনাগুলি (এটির মতো) এটি একটি গোলকের মতো আচরণ করে।

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

আরও তথ্যের জন্য: উইকিপিডিয়া ভৌগলিক দূরত্ব


4
এটি পুরোপুরি কাজ করে! আমি সবেমাত্র $ দূরত্ব_ মাইলস = $ কিমি * 0.621371; এবং মাইল দূরত্বের জন্য আমার কেবল এটিই প্রয়োজন! ধন্যবাদ টনি

31

আমি এখানে আমার কাজের উদাহরণ পোস্ট করি।

মাইএসকিউএলে অক্ষাংশ এবং দ্রাঘিমাংশ সহ 50 কিলোমিটারের কম, একটি নির্ধারিত বিন্দুর (আমরা একটি এলোমেলো পয়েন্ট ব্যবহার করব - ল্যাট: 45.20327, দীর্ঘ: 23.7806) সারণিতে সমস্ত পয়েন্ট তালিকাভুক্ত করুন (সারণী ক্ষেত্রগুলি কর্ড_লাট এবং কর্ড_লং):

কিলোমিটারগুলিতে DISTANCE <50 সমেত সমস্ত তালিকাভুক্ত করুন (পৃথিবী ব্যাসার্ধ বিবেচনা করুন 6371 কেমি):

SELECT denumire, (6371 * acos( cos( radians(45.20327) ) * cos( radians( coord_lat ) ) * cos( radians( 23.7806 ) - radians(coord_long) ) + sin( radians(45.20327) ) * sin( radians(coord_lat) ) )) AS distanta 
FROM obiective 
WHERE coord_lat<>'' 
    AND coord_long<>'' 
HAVING distanta<50 
ORDER BY distanta desc

উপরের উদাহরণটি মাইএসকিউএল 5.0.95 এবং 5.5.16 (লিনাক্স) এ পরীক্ষিত হয়েছিল।


আমি মনে করি একটি ভাল পন্থা একটি এপ্রোক্সিমেশন ব্যবহার করে ফলাফলগুলি ফিল্টার করার আগে হতে পারে, তাই ভারী সূত্রটি কেবলমাত্র কিছু ক্ষেত্রে প্রয়োগ করা হয়। বিশেষত দরকারী যদি আপনার অন্যান্য শর্ত থাকে। আমি এটি প্রাথমিক অ্যাপ্রোক্সের জন্য ব্যবহার করছি: stackoverflow.com/questions/1253499/…
প্যাটো

28

অন্যান্য উত্তর একটি বাস্তবায়ন অনুপস্থিত.

প্যাকেজটির distmকার্যকারিতা সহ দুটি পয়েন্টের মধ্যে দূরত্ব গণনা করা বেশ সোজা geospherefor

distm(p1, p2, fun = distHaversine)

কোথায়:

p1 = longitude/latitude for point(s)
p2 = longitude/latitude for point(s)
# type of distance calculation
fun = distCosine / distHaversine / distVincentySphere / distVincentyEllipsoid 

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

distm(p1, p2, fun = distVincentyEllipsoid)

অবশ্যই আপনাকে geosphereপ্যাকেজটি ব্যবহার করতে হবে না , আপনি Rকোনও ফাংশন সহ বেসের দূরত্বও গণনা করতে পারেন :

hav.dist <- function(long1, lat1, long2, lat2) {
  R <- 6371
  diff.long <- (long2 - long1)
  diff.lat <- (lat2 - lat1)
  a <- sin(diff.lat/2)^2 + cos(lat1) * cos(lat2) * sin(diff.long/2)^2
  b <- 2 * asin(pmin(1, sqrt(a))) 
  d = R * b
  return(d)
}

আপনি যা বলেছিলেন তাতে আমি স্পষ্ট তা নিশ্চিত করার জন্য: পোস্টের শেষে আপনি যে কোডটি দিচ্ছেন: এটি কি ভিনসেন্টি সূত্রের বাস্তবায়ন? যতদূর আপনি জানেন, ভূ-জগতে ভিনসেন্টিকে ফোন করার মতো উত্তর দেওয়া উচিত? [আমার জিওস্ফিয়ার বা অন্যান্য গ্রন্থাগার নেই; ক্রস প্ল্যাটফর্ম অ্যাপ্লিকেশনটিতে অন্তর্ভুক্ত করার জন্য কেবল কিছু কোড সন্ধান করা। আমি অবশ্যই কোনও পরিচিত ভাল ক্যালকুলেটরের বিরুদ্ধে কিছু পরীক্ষার কেস যাচাই করব]]
টুলমেকারস্টেভ

1
@ টোলমেকারস্টাইভ আমার উত্তর শেষে ফাংশনটি হ্যাভারসাইন পদ্ধতির একটি বাস্তবায়ন
জাপ

হাই @ জাপ আমি জিজ্ঞাসা করতে পারি যে সূত্রের পরিমাপের এককটি কী? এটা কি মিটারে?
জ্যাকসন

11

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

নাসায় একজনের কাছ থেকে পোস্ট করা, বিকল্পগুলির বিষয়ে আলোচনা করার সময় আমি খুঁজে পেয়েছি এটি সেরা

http://www.cs.nyu.edu/visual/home/proj/tiger/gisfaq.html

উদাহরণস্বরূপ, আপনি যদি 100 মাইল ব্যাসার্ধের মধ্যে সারিগুলি দূরত্বে বাছাই করেন। ফ্ল্যাট আর্থের সূত্রটি হ্যাওয়ারসিনের চেয়ে অনেক দ্রুত হবে।

HalfPi = 1.5707963;
R = 3956; /* the radius gives you the measurement unit*/

a = HalfPi - latoriginrad;
b = HalfPi - latdestrad;
u = a * a + b * b;
v = - 2 * a * b * cos(longdestrad - longoriginrad);
c = sqrt(abs(u + v));
return R * c;

লক্ষ্য করুন এখানে কেবল একটি কোসাইন এবং একটি বর্গমূল রয়েছে। হ্যাভারসাইন সূত্রে সেগুলির মধ্যে বনাম 9।


এটি একটি দুর্দান্ত সম্ভাবনা। কেবল সচেতন থাকবেন যে আলোচনায় প্রস্তাবিত সর্বাধিক দূরত্বটি 100 নয়, 12 মাইল এবং তবুও ত্রুটিগুলি পৃথিবীর অবস্থানের উপর নির্ভর করে 30 মিটার (100 ফুট) পর্যন্ত লম্বা হতে পারে।
এরিক উ

7

আপনি এটি গণনা করতে CLLocationDistance এ বিল্ডটি ব্যবহার করতে পারেন:

CLLocation *location1 = [[CLLocation alloc] initWithLatitude:latitude1 longitude:longitude1];
CLLocation *location2 = [[CLLocation alloc] initWithLatitude:latitude2 longitude:longitude2];
[self distanceInMetersFromLocation:location1 toLocation:location2]

- (int)distanceInMetersFromLocation:(CLLocation*)location1 toLocation:(CLLocation*)location2 {
    CLLocationDistance distanceInMeters = [location1 distanceFromLocation:location2];
    return distanceInMeters;
}

আপনার ক্ষেত্রে যদি আপনি কিলোমিটারটি কেবল 1000 দিয়ে বিভাজক করতে চান।


7

আমি আর একটি উত্তর যুক্ত করতে পছন্দ করি না তবে গুগল ম্যাপস এপিআই v.3 এর গোলক জ্যামিতি (এবং আরও) রয়েছে। আপনার WGS84 কে দশমিক ডিগ্রীতে রূপান্তর করার পরে আপনি এটি করতে পারেন:

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

distance = google.maps.geometry.spherical.computeDistanceBetween(
    new google.maps.LatLng(fromLat, fromLng), 
    new google.maps.LatLng(toLat, toLng));

গুগলের গণনাগুলি কতটা সঠিক বা কোন মডেলটি ব্যবহৃত হয়েছে সে সম্পর্কে কোনও শব্দ নেই (যদিও এটি "জিওয়েড" এর পরিবর্তে "গোলাকৃতির" বলে। পৃথিবীর উপরিভাগ যা প্রত্যেকের মনে হয়।


দূরত্ব মিটারে। বিকল্পভাবে কেউ গণনা দৈর্ঘ্য () ব্যবহার করতে পারেন
ইলেক্ট্রোবাবে

7

পাইথন ইমপ্লিমেন্টেশন অরিজিন হ'ল সংযুক্ত আমেরিকার কেন্দ্রবিন্দু।

from haversine import haversine
origin = (39.50, 98.35)
paris = (48.8567, 2.3508)
haversine(origin, paris, miles=True)

কিলোমিটারে উত্তর পেতে কেবল মাইল = মিথ্যা সেট করুন।


1
আপনি একটি অ-মানক প্যাকেজ আমদানি করছেন যা সমস্ত কাজ করে। আমি জানি না যে এই সমস্ত দরকারী কিনা।
টিপিহিম

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

7

একটি সহজ সমাধান এবং আরও সঠিক হতে পারে: গ্রিনউইচ (বা কোনও দ্রাঘিমাংশ) চক্রের নিরক্ষীয় অঞ্চলে পৃথিবীর পরিধি 40,000 কিলোমিটার। এভাবে:

pythagoras = function (lat1, lon1, lat2, lon2) {
   function sqr(x) {return x * x;}
   function cosDeg(x) {return Math.cos(x * Math.PI / 180.0);}

   var earthCyclePerimeter = 40000000.0 * cosDeg((lat1 + lat2) / 2.0);
   var dx = (lon1 - lon2) * earthCyclePerimeter / 360.0;
   var dy = 37000000.0 * (lat1 - lat2) / 360.0;

   return Math.sqrt(sqr(dx) + sqr(dy));
};

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


এই ফাংশন কি কিমিটারে ফেরার দূরত্ব?
উইক্কি

এটি কেবলমাত্র নিরক্ষীয় এবং দ্রাঘিমাংশ চক্রগুলি কিমি থেকে দূরে রয়েছে। মাইলের জন্য, 40000 এবং 37000 কে 1.6 দ্বারা ভাগ করুন। কৌতূহল অনুভব করে, আপনি এটিকে
রিসে

এটি এখানে দেওয়া সেরা উত্তর বলে মনে হচ্ছে। আমি এটি ব্যবহার করতে চাই তবে আমি কেবল বিস্মিত হয়েছি যে এই অ্যালগরিদমের যথার্থতা যাচাই করার কোনও উপায় আছে কিনা। আমি চ (50,5,58,3) পরীক্ষা করেছি। এটি 832km দেয়, যেখানে চলনযোগ্য টাইপ.কম.উপ / স্ক্রিপ্টস / ল্যাটলং এইচটিএমএল 'হ'রসাইন' সূত্র ব্যবহার করে 899km দেয়। এত বড় পার্থক্য আছে কি?
চঙ ঠোঁট ফ্যাং

তদুপরি, আমি মনে করি উপরের কোড দ্বারা প্রত্যাবর্তিত মানটি এম, এবং কিমি নয়।
চঙ ঠোঁট ফ্যাং

@ চেংলিপফ্যাং - সতর্কতা: পাইথাগোরিয়ান উপপাদ্যটি ছোট অঞ্চলের জন্য কেবল যুক্তিসঙ্গত অনুমান, কারণ এই উপপাদ্যটি পৃথিবী সমতল বলে ধরে নিয়েছে। চরম ক্ষেত্রে হিসাবে, নিরক্ষীয় অঞ্চলে শুরু করুন এবং 90 ডিগ্রি পূর্ব এবং 90 ডিগ্রি উত্তরে সরে যান। অবশ্যই শেষ ফলাফলটি উত্তর মেরু, এবং 0 ডিগ্রি পূর্ব এবং 90 ডিগ্রি উত্তরে চলার সমান; সুতরাং sqrt (sqr (dx) + sqr (dy)) করা প্রথম ক্ষেত্রে বুদ্ধিমানভাবে বন্ধ হয়ে যাবে। ~ বর্গক্ষেত্র (10 কিলোমিটার বর্গক্ষেত্র + 10 কিলোমিটার বর্গ) ~ = 14.4 কিমি বনাম সঠিক দূরত্ব k 10 কিলোমিটার।
নির্মাতা স্টিভ

7

উপরের সমস্ত উত্তর ধরে নেয় পৃথিবী একটি গোলক। যাইহোক, আরও সঠিক অনুমানটি হ'ল একটি ওবলেট স্পেরয়েড।

a= 6378.137#equitorial radius in km
b= 6356.752#polar radius in km

def Distance(lat1, lons1, lat2, lons2):
    lat1=math.radians(lat1)
    lons1=math.radians(lons1)
    R1=(((((a**2)*math.cos(lat1))**2)+(((b**2)*math.sin(lat1))**2))/((a*math.cos(lat1))**2+(b*math.sin(lat1))**2))**0.5 #radius of earth at lat1
    x1=R*math.cos(lat1)*math.cos(lons1)
    y1=R*math.cos(lat1)*math.sin(lons1)
    z1=R*math.sin(lat1)

    lat2=math.radians(lat2)
    lons2=math.radians(lons2)
    R1=(((((a**2)*math.cos(lat2))**2)+(((b**2)*math.sin(lat2))**2))/((a*math.cos(lat2))**2+(b*math.sin(lat2))**2))**0.5 #radius of earth at lat2
    x2=R*math.cos(lat2)*math.cos(lons2)
    y2=R*math.cos(lat2)*math.sin(lons2)
    z2=R*math.sin(lat2)

    return ((x1-x2)**2+(y1-y2)**2+(z1-z2)**2)**0.5

6

কিমি থেকে দূরত্ব গণনা করতে এখানে এসকিউএল বাস্তবায়ন রয়েছে,

SELECT UserId, ( 3959 * acos( cos( radians( your latitude here ) ) * cos( radians(latitude) ) * 
cos( radians(longitude) - radians( your longitude here ) ) + sin( radians( your latitude here ) ) * 
sin( radians(latitude) ) ) ) AS distance FROM user HAVING
distance < 5  ORDER BY distance LIMIT 0 , 5;

ল্যাঙ্গেজ প্রোগ্রামিংয়ের মাধ্যমে বাস্তবায়নের আরও তথ্যের জন্য, আপনি কেবল এখানে দেওয়া পিএইচপি স্ক্রিপ্টটি দিয়ে যেতে পারেন


5

এখানে একটি হল টাইপ করা বিষয় Haversine সূত্র বাস্তবায়ন

static getDistanceFromLatLonInKm(lat1: number, lon1: number, lat2: number, lon2: number): number {
    var deg2Rad = deg => {
        return deg * Math.PI / 180;
    }

    var r = 6371; // Radius of the earth in km
    var dLat = deg2Rad(lat2 - lat1);   
    var dLon = deg2Rad(lon2 - lon1);
    var a =
        Math.sin(dLat / 2) * Math.sin(dLat / 2) +
        Math.cos(deg2Rad(lat1)) * Math.cos(deg2Rad(lat2)) *
        Math.sin(dLon / 2) * Math.sin(dLon / 2);
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
    var d = r * c; // Distance in km
    return d;
}

5

হিসাবে চিহ্নিত হয়েছে, একটি নির্ভুল গণনা বিবেচনা করা উচিত যে পৃথিবী একটি নিখুঁত গোলক নয়। এখানে দেওয়া বিভিন্ন অ্যালগরিদমের কয়েকটি তুলনা এখানে দেওয়া হয়েছে:

geoDistance(50,5,58,3)
Haversine: 899 km
Maymenn: 833 km
Keerthana: 897 km
google.maps.geometry.spherical.computeDistanceBetween(): 900 km

geoDistance(50,5,-58,-3)
Haversine: 12030 km
Maymenn: 11135 km
Keerthana: 10310 km
google.maps.geometry.spherical.computeDistanceBetween(): 12044 km

geoDistance(.05,.005,.058,.003)
Haversine: 0.9169 km
Maymenn: 0.851723 km
Keerthana: 0.917964 km
google.maps.geometry.spherical.computeDistanceBetween(): 0.917964 km

geoDistance(.05,80,.058,80.3)
Haversine: 33.37 km
Maymenn: 33.34 km
Keerthana: 33.40767 km
google.maps.geometry.spherical.computeDistanceBetween(): 33.40770 km

ছোট দূরত্বে কেরথানার অ্যালগরিদম গুগল ম্যাপের সাথে মিলে যায় বলে মনে হয়। গুগল ম্যাপস কোনও সাধারণ অ্যালগরিদম অনুসরণ করে বলে মনে হচ্ছে না যে এটি সম্ভবত এখানে সবচেয়ে সঠিক পদ্ধতি হতে পারে।

যাইহোক, এখানে কেরথানার অ্যালগরিদমের জাভাস্ক্রিপ্ট বাস্তবায়ন:

function geoDistance(lat1, lng1, lat2, lng2){
    const a = 6378.137; // equitorial radius in km
    const b = 6356.752; // polar radius in km

    var sq = x => (x*x);
    var sqr = x => Math.sqrt(x);
    var cos = x => Math.cos(x);
    var sin = x => Math.sin(x);
    var radius = lat => sqr((sq(a*a*cos(lat))+sq(b*b*sin(lat)))/(sq(a*cos(lat))+sq(b*sin(lat))));

    lat1 = lat1 * Math.PI / 180;
    lng1 = lng1 * Math.PI / 180;
    lat2 = lat2 * Math.PI / 180;
    lng2 = lng2 * Math.PI / 180;

    var R1 = radius(lat1);
    var x1 = R1*cos(lat1)*cos(lng1);
    var y1 = R1*cos(lat1)*sin(lng1);
    var z1 = R1*sin(lat1);

    var R2 = radius(lat2);
    var x2 = R2*cos(lat2)*cos(lng2);
    var y2 = R2*cos(lat2)*sin(lng2);
    var z2 = R2*sin(lat2);

    return sqr(sq(x1-x2)+sq(y1-y2)+sq(z1-z2));
}

4

এই স্ক্রিপ্টটি [পিএইচপি-তে] দুটি পয়েন্টের মধ্যে দূরত্ব গণনা করে।

public static function getDistanceOfTwoPoints($source, $dest, $unit='K') {
        $lat1 = $source[0];
        $lon1 = $source[1];
        $lat2 = $dest[0];
        $lon2 = $dest[1];

        $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);
        $miles = $dist * 60 * 1.1515;
        $unit = strtoupper($unit);

        if ($unit == "K") {
            return ($miles * 1.609344);
        }
        else if ($unit == "M")
        {
            return ($miles * 1.609344 * 1000);
        }
        else if ($unit == "N") {
            return ($miles * 0.8684);
        } 
        else {
            return $miles;
        }
    }

4

জাভার বাস্তবায়ন হ্যাভারসাইন সূত্র অনুসারে

double calculateDistance(double latPoint1, double lngPoint1, 
                         double latPoint2, double lngPoint2) {
    if(latPoint1 == latPoint2 && lngPoint1 == lngPoint2) {
        return 0d;
    }

    final double EARTH_RADIUS = 6371.0; //km value;

    //converting to radians
    latPoint1 = Math.toRadians(latPoint1);
    lngPoint1 = Math.toRadians(lngPoint1);
    latPoint2 = Math.toRadians(latPoint2);
    lngPoint2 = Math.toRadians(lngPoint2);

    double distance = Math.pow(Math.sin((latPoint2 - latPoint1) / 2.0), 2) 
            + Math.cos(latPoint1) * Math.cos(latPoint2)
            * Math.pow(Math.sin((lngPoint2 - lngPoint1) / 2.0), 2);
    distance = 2.0 * EARTH_RADIUS * Math.asin(Math.sqrt(distance));

    return distance; //km value
}

3

গোলকের দুটি পয়েন্টের মধ্যে দূরত্ব গণনা করতে আপনাকে গ্রেট সার্কেল গণনা করতে হবে

যদি আপনাকে ফ্ল্যাট পৃষ্ঠে আপনার দূরত্বগুলি পুনরায় প্রকাশ করতে হয় তবে ম্যাপটুলগুলিতে মানচিত্র প্রক্ষেপণে সহায়তা করতে প্রচুর সি / সি ++ গ্রন্থাগার রয়েছে । এটি করার জন্য আপনাকে বিভিন্ন সমন্বয় সিস্টেমের প্রজেকশন স্ট্রিংয়ের প্রয়োজন হবে।

আপনি পয়েন্টটি ভিজুয়ালাইজ করার জন্য ম্যাপ উইন্ডোকে একটি দরকারী সরঞ্জামও পেতে পারেন । এছাড়াও এটির ওপেন সোর্স হিসাবে এটি কীভাবে প্রোজ.ডিল লাইব্রেরিটি ব্যবহার করতে হয় তার জন্য একটি দরকারী গাইড, এটি মূল ওপেন সোর্স প্রজেকশন লাইব্রেরি হিসাবে উপস্থিত বলে মনে হয়।


3

এখানে কারওর প্রয়োজন পড়লে জাভাতে পোর্ট করা স্বীকৃত উত্তর প্রয়োগ রয়েছে।

package com.project529.garage.util;


/**
 * Mean radius.
 */
private static double EARTH_RADIUS = 6371;

/**
 * Returns the distance between two sets of latitudes and longitudes in meters.
 * <p/>
 * Based from the following JavaScript SO answer:
 * http://stackoverflow.com/questions/27928/calculate-distance-between-two-latitude-longitude-points-haversine-formula,
 * which is based on https://en.wikipedia.org/wiki/Haversine_formula (error rate: ~0.55%).
 */
public double getDistanceBetween(double lat1, double lon1, double lat2, double lon2) {
    double dLat = toRadians(lat2 - lat1);
    double dLon = toRadians(lon2 - lon1);

    double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
            Math.cos(toRadians(lat1)) * Math.cos(toRadians(lat2)) *
                    Math.sin(dLon / 2) * Math.sin(dLon / 2);
    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
    double d = EARTH_RADIUS * c;

    return d;
}

public double toRadians(double degrees) {
    return degrees * (Math.PI / 180);
}

2

এখানে বাস্তবায়ন ভিবি.এনইটি রয়েছে, এই বাস্তবায়ন আপনাকে কেএম বা মাইলগুলির ফলাফল দেবে যা আপনি পাস করে এমন একটি এনাম মানের উপর ভিত্তি করে।

Public Enum DistanceType
    Miles
    KiloMeters
End Enum

Public Structure Position
    Public Latitude As Double
    Public Longitude As Double
End Structure

Public Class Haversine

    Public Function Distance(Pos1 As Position,
                             Pos2 As Position,
                             DistType As DistanceType) As Double

        Dim R As Double = If((DistType = DistanceType.Miles), 3960, 6371)

        Dim dLat As Double = Me.toRadian(Pos2.Latitude - Pos1.Latitude)

        Dim dLon As Double = Me.toRadian(Pos2.Longitude - Pos1.Longitude)

        Dim a As Double = Math.Sin(dLat / 2) * Math.Sin(dLat / 2) + Math.Cos(Me.toRadian(Pos1.Latitude)) * Math.Cos(Me.toRadian(Pos2.Latitude)) * Math.Sin(dLon / 2) * Math.Sin(dLon / 2)

        Dim c As Double = 2 * Math.Asin(Math.Min(1, Math.Sqrt(a)))

        Dim result As Double = R * c

        Return result

    End Function

    Private Function toRadian(val As Double) As Double

        Return (Math.PI / 180) * val

    End Function

End Class

"ক" গণনা করার পরে, আপনি ভুল করে দুটি বার ম্যাথ.সিন ( ডি ল্যাট ..) লিখেছেন ?
মার্কো ওটিনা

2

আমি সূত্রটি সহজ করে গণনাটি নিচে নামিয়েছি।

এটি এটি রুবিতে রয়েছে:

include Math
earth_radius_mi = 3959
radians = lambda { |deg| deg * PI / 180 }
coord_radians = lambda { |c| { :lat => radians[c[:lat]], :lng => radians[c[:lng]] } }

# from/to = { :lat => (latitude_in_degrees), :lng => (longitude_in_degrees) }
def haversine_distance(from, to)
  from, to = coord_radians[from], coord_radians[to]
  cosines_product = cos(to[:lat]) * cos(from[:lat]) * cos(from[:lng] - to[:lng])
  sines_product = sin(to[:lat]) * sin(from[:lat])
  return earth_radius_mi * acos(cosines_product + sines_product)
end

2
function getDistanceFromLatLonInKm(lat1,lon1,lat2,lon2,units) {
  var R = 6371; // Radius of the earth in km
  var dLat = deg2rad(lat2-lat1);  // deg2rad below
  var dLon = deg2rad(lon2-lon1); 
  var a = 
    Math.sin(dLat/2) * Math.sin(dLat/2) +
    Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * 
    Math.sin(dLon/2) * Math.sin(dLon/2)
    ; 
  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
  var d = R * c; 
  var miles = d / 1.609344; 

if ( units == 'km' ) {  
return d; 
 } else {
return miles;
}}

ছকের সমাধান, মাইল জন্য বৈধ।


2

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

public static double distanceLatLong2(double lat1, double lng1, double lat2, double lng2) 
{
  double earthRadius = 6371.0d; // KM: use mile here if you want mile result

  double dLat = toRadian(lat2 - lat1);
  double dLng = toRadian(lng2 - lng1);

  double a = Math.pow(Math.sin(dLat/2), 2)  + 
          Math.cos(toRadian(lat1)) * Math.cos(toRadian(lat2)) * 
          Math.pow(Math.sin(dLng/2), 2);

  double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));

  return earthRadius * c; // returns result kilometers
}

public static double toRadian(double degrees) 
{
  return (degrees * Math.PI) / 180.0d;
}

2

মাইএসকিএলে নীচের ফাংশনটি ব্যবহার করে প্যারামিটারগুলি পাস করুন POINT(LONG,LAT)

CREATE FUNCTION `distance`(a POINT, b POINT)
 RETURNS double
    DETERMINISTIC
BEGIN

RETURN

GLength( LineString(( PointFromWKB(a)), (PointFromWKB(b)))) * 100000; -- To Make the distance in meters

END;

2
function getDistanceFromLatLonInKm(position1, position2) {
    "use strict";
    var deg2rad = function (deg) { return deg * (Math.PI / 180); },
        R = 6371,
        dLat = deg2rad(position2.lat - position1.lat),
        dLng = deg2rad(position2.lng - position1.lng),
        a = Math.sin(dLat / 2) * Math.sin(dLat / 2)
            + Math.cos(deg2rad(position1.lat))
            * Math.cos(deg2rad(position1.lat))
            * Math.sin(dLng / 2) * Math.sin(dLng / 2),
        c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
    return R * c;
}

console.log(getDistanceFromLatLonInKm(
    {lat: 48.7931459, lng: 1.9483572},
    {lat: 48.827167, lng: 2.2459745}
));

2

এখানে একটি উদাহরণ postgres SQL (কিমি এ, মাইল সংস্করণের জন্য, 0,8684 সংস্করণ দ্বারা 1,609344 প্রতিস্থাপন)

CREATE OR REPLACE FUNCTION public.geodistance(alat float, alng float, blat  

float, blng  float)
  RETURNS float AS
$BODY$
DECLARE
    v_distance float;
BEGIN

    v_distance = asin( sqrt(
            sin(radians(blat-alat)/2)^2 
                + (
                    (sin(radians(blng-alng)/2)^2) *
                    cos(radians(alat)) *
                    cos(radians(blat))
                )
          )
        ) * cast('7926.3352' as float) * cast('1.609344' as float) ;


    RETURN v_distance;
END 
$BODY$
language plpgsql VOLATILE SECURITY DEFINER;
alter function geodistance(alat float, alng float, blat float, blng float)
owner to postgres;

2

এখানে রুবি কোডে অন্য একটি রূপান্তরিত হয়েছে :

include Math
#Note: from/to = [lat, long]

def get_distance_in_km(from, to)
  radians = lambda { |deg| deg * Math.PI / 180 }
  radius = 6371 # Radius of the earth in kilometer
  dLat = radians[to[0]-from[0]]
  dLon = radians[to[1]-from[1]]

  cosines_product = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(radians[from[0]]) * Math.cos(radians[to[1]]) * Math.sin(dLon/2) * Math.sin(dLon/2)

  c = 2 * Math.atan2(Math.sqrt(cosines_product), Math.sqrt(1-cosines_product)) 
  return radius * c # Distance in kilometer
end

1

পিএইচপি http://www.geodatasource.com/developers/php এর সাথে দূরত্ব গণনা করার জন্য এখানে একটি ভাল উদাহরণ রয়েছে :

 function distance($lat1, $lon1, $lat2, $lon2, $unit) {

     $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);
     $miles = $dist * 60 * 1.1515;
     $unit = strtoupper($unit);

     if ($unit == "K") {
         return ($miles * 1.609344);
     } else if ($unit == "N") {
          return ($miles * 0.8684);
     } else {
          return $miles;
     }
 }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.