দুটি জিও পয়েন্টের মধ্যে দূরত্ব পান


108

আমি এমন একটি অ্যাপ তৈরি করতে চাই যা কোনও ব্যবহারকারী যেখানে রয়েছে তার নিকটতম স্থানটি পরীক্ষা করে cks আমি সহজেই ব্যবহারকারীর অবস্থান পেতে পারি এবং আমার কাছে ইতিমধ্যে অক্ষাংশ এবং দ্রাঘিমাংশের জায়গাগুলির একটি তালিকা রয়েছে।

বর্তমান ব্যবহারকারীর অবস্থানের বিপরীতে তালিকার নিকটতম স্থানটি জানার সর্বোত্তম উপায় কী হবে।

আমি গুগল এপিআইগুলিতে কিছু খুঁজে পাইনি।

উত্তর:


164
Location loc1 = new Location("");
loc1.setLatitude(lat1);
loc1.setLongitude(lon1);

Location loc2 = new Location("");
loc2.setLatitude(lat2);
loc2.setLongitude(lon2);

float distanceInMeters = loc1.distanceTo(loc2);

তথ্যসূত্র: http://developer.android.com/references/android/location/Location.html#distanceTo(android.location.Location)


2
সম্ভবত অবস্থানের ব্যবহারের চেয়ে ধীরে ধীরে।
জোল্টানএফ

অবস্থানের জন্য আমাকে কোন শ্রেণিটি আমদানি করতে হবে import android.location.Location;বা কোনটি
প্রানভ এমএস

@ প্রানভএমএস হ্যাঁ android.location.Location;
অ্যান্ড্রুস

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

122

http://developer.android.com/reference/android/location/Location.html

দূরত্বের দিকে অথবা দূরত্বের মধ্যে দেখুন। অক্ষাংশ এবং দ্রাঘিমাংশ থেকে আপনি একটি অবস্থান অবজেক্ট তৈরি করতে পারেন:

Location location = new Location("");
location.setLatitude(lat);
location.setLongitude(lon);

37
দূরত্বের মধ্যবর্তী স্থিতিশীল পদ্ধতি যা ল্যাট লম্বা পয়েন্টগুলির 2 সেট নেয়, সুতরাং আপনার কোনও অবস্থান
অবজেক্টও

4
আমি নিশ্চিত যে তিনি distanceToপদ্ধতির জন্য এটি বোঝাতে চেয়েছিলেন ।
ল্যাফ

এটি দুর্দান্ত এবং সুপার সহায়ক, তবে কনস্ট্রাক্ট্রারে স্ট্রিং সরবরাহকারী কী?
মিস.সেরেনা

33

একটি আনুমানিক সমাধান (একটি নিখুঁত প্রক্ষেপণের উপর ভিত্তি করে), অনেক দ্রুত (এটিতে কেবল 1 টি ট্রিগ এবং 1 বর্গমূলের প্রয়োজন)।

আপনার পয়েন্টগুলি খুব দূরে না থাকলে এই সন্নিবেশটি প্রাসঙ্গিক। আসল হ্যাসারিন দূরত্বের তুলনায় এটি সর্বদা অতিরিক্ত অনুমান করবে । উদাহরণস্বরূপ এটি যদি আপনার দুটি পয়েন্টের মধ্যে ডেল্টা অক্ষাংশ বা দ্রাঘিমাংশ 4 দশমিক ডিগ্রি ছাড়িয়ে না যায় তবে এটি প্রকৃত দূরত্বের সাথে 0.05382% এর বেশি যোগ করবে না

স্ট্যান্ডার্ড সূত্র (হ্যাভারসাইন) হুবহু এক (এটি পৃথিবীতে দ্রাঘিমাংশ / দ্রাঘিমাংশের জন্য দম্পতির জন্য কাজ করে) তবে এটি 7 গতিবিধি এবং 2 বর্গমূলের প্রয়োজন বলে অনেক ধীর হয়। যদি আপনার দু'টি পয়েন্ট খুব বেশি দূরে না থাকে এবং নিখুঁত নির্ভুলতা সর্বজনীন না হয় তবে আপনি এই আনুমানিক সংস্করণ (ইকুয়েটারট্যাঙ্গুলার) ব্যবহার করতে পারেন, এটি কেবলমাত্র একটি ত্রিকোণমিত্রিক এবং একটি বর্গমূল ব্যবহার করার কারণে এটি আরও দ্রুত।

// Approximate Equirectangular -- works if (lat1,lon1) ~ (lat2,lon2)
int R = 6371; // km
double x = (lon2 - lon1) * Math.cos((lat1 + lat2) / 2);
double y = (lat2 - lat1);
double distance = Math.sqrt(x * x + y * y) * R;

আপনি এই দ্বারা আরও অনুকূলিত করতে পারেন :

  1. বর্গমূলকে অপসারণ করা যদি আপনি কেবল দূরতাকে অন্যের সাথে তুলনা করেন (সেক্ষেত্রে উভয় স্কোয়ার দূরত্বের তুলনা করুন);
  2. যদি আপনি এক মাস্টার পয়েন্ট থেকে অন্য অনেকের কাছে দূরত্ব গণনা করেন তবে কোসাইনকে ফ্যাক্টরিং-আউট করুন ( সেক্ষেত্রে আপনি মাস্টার পয়েন্টের উপর ভিত্তি করে নিখুঁত প্রক্ষেপণ করেন, সুতরাং আপনি সমস্ত তুলনার জন্য একবার কোসাইনকে গণনা করতে পারেন)।

আরও তথ্যের জন্য দেখুন: http://www.movable-type.co.uk/scriptts/latlong.html

বেশ কয়েকটি ভাষায় হ্যাভারসাইন সূত্রটির একটি দুর্দান্ত রেফারেন্স বাস্তবায়ন রয়েছে: http://www.codecodex.com/wiki/Calculate_Distance_Between_Two_PPoint_on_a_Globe


মহান মানুষ থেক্স। তবে যদি আমার একটি ঘেরের মধ্যে একটি অবস্থানের আশেপাশের লোকেশনগুলির একটি সেট পাওয়া দরকার, তবে আমি কি অনুসন্ধানের জায়গার বিপরীতে প্রতিটি অবস্থান পরীক্ষা করতে এবং কেবলমাত্র ঘেরে থাকা জায়গাগুলি রাখার জন্য কিছুক্ষণ লুপ ব্যবহার করব?
themhz

আপনি পারেন, কিন্তু এটি একটি নিষ্ঠুর শক্তি পদ্ধতির O(n)। একটি O(1)সমাধানের জন্য, সঠিক সমাধানটি গণনার আগে সম্ভাব্য ম্যাচগুলি ছাঁটাতে একটি 2 ডি স্পেসিয়াল ইনডেক্স ব্যবহার করুন। আমরা এই প্রশ্নের সুযোগ ছেড়ে
চলেছি

এটি দুর্দান্ত সম্ভাব্য অপটিমাইজেশনের একটি খুব সুন্দর র‌্যাপআপ .. থেক্স! ঠিক কী আমি সন্ধান
করছিলাম

আমি কেবল জানতে চেয়েছিলাম যে এই সূত্রটি বড় দূরত্বের জন্য কাজ করে
সন্দিপন মাঝি

উত্তরটি দেখুন, তবে সংক্ষেপে: না , এটি বড় দূরত্বে কাজ করে না। দুটি পয়েন্টের মধ্যে যত বেশি দূরত্ব হবে ঠিক তেমনি হ্যাভারসাইন ফর্মুলার তুলনায় ত্রুটি তত বেশি æ
লরেন্ট গ্রাগোয়ার

11

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

আপনি যে যথাযথতার পরে রয়েছেন তার উপর নির্ভর করে আপনি হ্যাভারসাইন বা ভিনসেন্টি সূত্রগুলি সন্ধান করতে পারেন ...

এই পৃষ্ঠাগুলি সূত্রগুলি বিস্তারিত জানায়, এবং কম গাণিতিক ঝোঁকগুলির জন্য কীভাবে এগুলি স্ক্রিপ্টে প্রয়োগ করা যায় তার একটি ব্যাখ্যা সরবরাহ করে!

হ্যাভারসাইন সূত্র: http://www.movable-type.co.uk/scriptts/latlong.html

ভিনসেন্টি সূত্র: http://www.movable-type.co.uk/scriptts/latlong-vincenty.html

সূত্রগুলির অর্থগুলির সাথে যদি আপনার কোনও সমস্যা থাকে তবে কেবল মন্তব্য করুন এবং আমি তার উত্তর দেওয়ার জন্য যথাসাধ্য চেষ্টা করব :)


4

ল্যাটল্যাংয়ের মধ্যে দূরত্ব পাওয়ার দুটি উপায় রয়েছে।

public static void distanceBetween (double startLatitude, double startLongitude, double endLatitude, double endLongitude, float[] results)

এটা দেখ

এবং দ্বিতীয়

public float distanceTo (Location dest) যেমনটি প্রবীণ উত্তর দিয়েছেন।



1

কেবলমাত্র নিম্নলিখিত পদ্ধতিটি ব্যবহার করুন, এটি ল্যাট এবং দীর্ঘ পাস করুন এবং মিটারে দূরত্ব পাবেন:

private static double distance_in_meter(final double lat1, final double lon1, final double lat2, final double lon2) {
    double R = 6371000f; // Radius of the earth in m
    double dLat = (lat1 - lat2) * Math.PI / 180f;
    double dLon = (lon1 - lon2) * Math.PI / 180f;
    double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
            Math.cos(latlong1.latitude * Math.PI / 180f) * Math.cos(latlong2.latitude * Math.PI / 180f) *
                    Math.sin(dLon/2) * Math.sin(dLon/2);
    double c = 2f * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
    double d = R * c;
    return d;
}

2
ল্যাটলং 1 এবং ল্যাটলং
ছেলে

1
ল্যাটলং 1 এবং ল্যাটলং 2 কী?
নিসাল মালিন্দা লাইভ্রা

0

গুগল ম্যাপ এপিআই গুগল ম্যাপ এপিআই ব্যবহার করে আপনি দূরত্ব এবং সময় পেতে পারেন

এই পদ্ধতিতে ডাউনলোড করা জেএসনকে কেবল পাস করুন আপনি দুটি ল্যাটলংয়ের মধ্যে আসল সময় দূরত্ব এবং সময় পাবেন

void parseJSONForDurationAndKMS(String json) throws JSONException {

    Log.d(TAG, "called parseJSONForDurationAndKMS");
    JSONObject jsonObject = new JSONObject(json);
    String distance;
    String duration;
    distance = jsonObject.getJSONArray("routes").getJSONObject(0).getJSONArray("legs").getJSONObject(0).getJSONObject("distance").getString("text");
    duration = jsonObject.getJSONArray("routes").getJSONObject(0).getJSONArray("legs").getJSONObject(0).getJSONObject("duration").getString("text");

    Log.d(TAG, "distance : " + distance);
    Log.d(TAG, "duration : " + duration);

    distanceBWLats.setText("Distance : " + distance + "\n" + "Duration : " + duration);


}

0

a = sin² (Δφ / 2) + cos φ1 ⋅ cos φ2 ⋅ sin² (Δλ / 2)

সি = 2 ⋅ আতান 2 (,a, √ (1 − a))

দূরত্ব = আর ⋅ সি

যেখানে lat অক্ষাংশ, long দ্রাঘিমাংশ, আর পৃথিবীর ব্যাসার্ধ (মানে ব্যাসার্ধ = 6,371 কিলোমিটার);

নোট করুন যে ট্রিগল ক্রিয়াকলাপগুলি পাস করার জন্য কোণগুলি রেডিয়ানে থাকা দরকার!

fun distanceInMeter(firstLocation: Location, secondLocation: Location): Double {
    val earthRadius = 6371000.0
    val deltaLatitudeDegree = (firstLocation.latitude - secondLocation.latitude) * Math.PI / 180f
    val deltaLongitudeDegree = (firstLocation.longitude - secondLocation.longitude) * Math.PI / 180f
    val a = sin(deltaLatitudeDegree / 2).pow(2) +
            cos(firstLocation.latitude * Math.PI / 180f) * cos(secondLocation.latitude * Math.PI / 180f) *
            sin(deltaLongitudeDegree / 2).pow(2)
    val c = 2f * atan2(sqrt(a), sqrt(1 - a))
    return earthRadius * c
}


data class Location(val latitude: Double, val longitude: Double)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.