একটি লাইনের নিকটতম বিন্দু (গোলাকার / মার্কেটর অভিক্ষেপ)


9

মেরেটর প্রজেকশন (গুগল ম্যাপস ) এর উপরে আমার একটি রেখা রয়েছে (অক্ষ, আয় - বিএক্স, বাই) এবং সেই লাইনের নিকটবর্তী একটি এলোমেলো পয়েন্ট (সিক্স, সি) , আমি নিকটতম বিন্দুটি জানতে চাই (চিত্রটিতে স্বচ্ছ নীল) over বিন্দু থেকে রেখা (ছবিতে নীল)

সম্পাদনা করুন: এটি একটি মার্কেটর প্রক্ষেপণে রয়েছে তা স্পষ্ট করার জন্য (গোলাকার প্রকৃতি) এখানে চিত্র বর্ণনা লিখুন


3
এই পোস্টে খুব দরকারী সমাধান আপনার স্বার্থ হতে পারে হয়েছে stackoverflow.com/questions/3120357/get-closest-point-to-a-line
vinayan

1
হালকা নীলটি সবচেয়ে কাছের মতো দেখাচ্ছে না, গা closest় নীল সাথে সংযুক্ত হওয়ার সময় নিকটতম একটি 90 ডিগ্রি কোণ তৈরি করা উচিত, আপনি কী বোঝাতে চান এটি?
গ্লেন প্লাস

আমি হাতে হাতে ছবিটি তৈরি করেছি তাই হ্যাঁ, এটি দুর্দান্ত
কোলাস

@ভিনায়ন আপনার পোস্টটি যে রেফারেন্সটি উল্লেখ করেছে তা রেখার নিকটতম বিন্দুটি খুঁজে পাওয়ার একটি পৃথক সমস্যা সমাধান করে , যেখানে এখানে যা প্রয়োজন তা মনে হয় একটি রেখাংশের নিকটতম বিন্দুটি চান ।
whuber

1
সেগমেন্টটি প্রায় 20-100 মিটার দীর্ঘ হতে হবে, সেন্টিমিটার থেকে 30 সেন্টিমিটার পর্যন্ত পয়েন্টটি সেগমেন্ট থেকে অনেক বেশি
Colas

উত্তর:


2

এই লিঙ্কটি পরীক্ষা করে দেখুন , এটি আমাকে রেখাংশগুলিতে দূরত্ব গণনা করতে নীচের ফাংশনটি ব্যবহার করেছে।

পিএইচপি-তে:

function point_to_line_segment_distance($startX,$startY, $endX,$endY, $pointX,$pointY) {

   // list($distanceSegment, $x, $y) = point_to_line_segment_distance($startX,$startY, $endX,$endY, $pointX,$pointY);

    // Adapted from Philip Nicoletti's function, found here: http://www.codeguru.com/forum/printthread.php?t=194400

    $r_numerator = ($pointX - $startX) * ($endX - $startX) + ($pointY - $startY) * ($endY - $startY);
    $r_denominator = ($endX - $startX) * ($endX - $startX) + ($endY - $startY) * ($endY - $startY);
    $r = $r_numerator / $r_denominator;

    $px = $startX + $r * ($endX - $startX);
    $py = $startY + $r * ($endY - $startY);

    $s = (($startY-$pointY) * ($endX - $startX) - ($startX - $pointX) * ($endY - $startY) ) / $r_denominator;

    $distanceLine = abs($s) * sqrt($r_denominator);

    $closest_point_on_segment_X = $px;
    $closest_point_on_segment_Y = $py;

    if ( ($r >= 0) && ($r <= 1) ) {
       $distanceSegment = $distanceLine;
    }
    else {
       $dist1 = ($pointX - $startX) * ($pointX - $startX) + ($pointY - $startY) * ($pointY - $startY);
       $dist2 = ($pointX - $endX) * ($pointX - $endX) + ($pointY - $endY) * ($pointY - $endY);
       if ($dist1 < $dist2) {
          $closest_point_on_segment_X = $startX;
          $closest_point_on_segment_Y = $startY;
          $distanceSegment = sqrt($dist1);
       }
       else {
          $closest_point_on_segment_X = $endX;
          $closest_point_on_segment_Y = $endY;
          $distanceSegment = sqrt($dist2);
       }
    }

    return array($distanceSegment, $closest_point_on_segment_X, $closest_point_on_segment_Y);
}

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

আপনি যদি পিএইচপি-র স্থানাঙ্কগুলির মধ্যে দূরত্ব গণনা করতে কোনও ভাল পিএইচপি লাইব্রেরি চান তবে জিওকাল্ক ক্লাসটি পরীক্ষা করে দেখুন


আরে গ্লেন প্লাস, আপনার ক্লাসটি বাম বা ডানদিকে একটু অফসেট পেয়েছে বলে মনে হচ্ছে , আমি গুগল আর্থে একটি স্ক্রিনশট তৈরি করেছি আপনি দেখতে পাবেন যে অফসেট, ছবি: লিঙ্ক , আমি যে কোডটি ব্যবহার করেছিpoint_to_line_segment_distance(41.421649, 2.600410, 41.413851, 2.594356, 41.415710, 2.600638))
কোলাস

এটি আমার ক্লাস নয়, কেবল এটি অনেক সন্ধানের পরে খুঁজে পেয়েছে ;-) তবে আমি আমার সমস্যাগুলিতে 8 অঙ্কের নির্ভুলতা ব্যবহার করি, আপনি 6 ব্যবহার করেন বলে মনে হয়। কারণ এটি হতে পারে, আমি এখানে কোনও অফসেট লক্ষ্য করিনি। এটি নির্দেশ করার জন্য ধন্যবাদ, আমি যত তাড়াতাড়ি আমার জানা দরকার তাড়াতাড়ি এটি ডাবল চেক করব।
গ্লেন প্লস

হতে পারে আপনি rihgt, আমি আরো decilmas gEarth উপর প্রাপ্ত করা হয় করতে পারে না, আমার শেষ মাংসখণ্ডের মধ্যে BTW সেগমেন্ট ছিল 1000 মিটার দীর্ঘ, পুষিয়ে যেত ~ 110meters
Colas

এটি আমি যে স্কেলটিতে এটি ব্যবহার করি এটি তার চেয়ে বেশি আর কিছু নয়। আমি কোন বাস (গণপরিবহন) সবচেয়ে কাছের একটি স্টপটি কখন পাস করে তা দেখতে এটি ব্যবহার করি। আমি যদিও এটি ডাবল চেক করতে যাচ্ছি এবং এটি কোনও গোলকের উপর ভালভাবে প্রজেক্ট হয় কিনা তা 'দেখার' জন্য এটি একটি মানচিত্রে রাখছি।
গ্লেন প্লাস

ওহ ... আমি ভেবেছিলাম যে কর্মটি গোলাকার অনুমানের জন্য তৈরি করা হয়েছিল, তাই এখন আমি অফসেটটি বুঝতে পেরেছি
Colas

1

আপনি গুগল ম্যাপ এপিআই থেকে কম্পিউটডেস্টেন্সিট বিটউইন () ফাংশনটি ব্যবহার করতে পারেন ।

distance = google.maps.geometry.spherical.computeDistanceBetween(firstCoord, secondCoord);

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

পরিবর্তে আপনি যদি কয়েকটি অবস্থান থাকে তবে একটি প্রদত্ত পাথের দৈর্ঘ্য গণনা করার জন্য কম্পিউটেলেন্থ () ব্যবহার করতে পারেন

আমি এটি আপনাকে সাহায্য করে আশা করি...


প্রথমে আমার মধ্যে পয়েন্টটি (হালকা নীল) জেনে রাখা দরকার
কোলাস

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