एक रेखा पर सबसे निकटतम बिंदु (गोलाकार / मर्केटर प्रक्षेपण)


9

मेरे पास एक व्यापारी प्रक्षेपण (गूगल मैप्स) और एक यादृच्छिक बिंदु (Cx, Cy ) के ऊपर एक रेखा (Ax, Ay - Bx, By) है , मुझे निकटतम बिंदु (छवि पर पारदर्शी नीला) को जानना होगा उस लाइन को इंगित करने के लिए (छवि में नीला)

EDIT: यह स्पष्ट करने के लिए कि यह एक व्यापारी प्रक्षेपण (गोलाकार प्रक्षेपण) में है यहां छवि विवरण दर्ज करें


3
इस पोस्ट के लिए बहुत उपयोगी समाधान है कि आप रुचि हो सकती है stackoverflow.com/questions/3120357/get-closest-point-to-a-line
विनयन

1
यह हल्का नीला निकटतम नहीं दिखता है, निकटतम को गहरे नीले रंग से जुड़ा होने पर 90 डिग्री का कोण बनाना चाहिए, क्या इसका मतलब है?
ग्लेन प्लास

मैंने हाथ से चित्र बनाया, हाँ, यह पॉसिबल है
कोलास

@vinayan आपके द्वारा संदर्भित पोस्ट एक पंक्ति के निकटतम बिंदु को खोजने की एक अलग समस्या को हल करता है , जबकि यहां जो आवश्यक है वह एक लाइन सेगमेंट के लिए निकटतम बिंदु चाहता है ।
whuber

1
खंड लगभग 20-100 मीटर लंबा होना चाहिए, सेंटीमीटर से 30 सेंटीमीटर तक का बिंदु
कोलस डिस

जवाबों:


2

बाहर की जाँच के लिए इस लिंक , यह मेरे निम्नलिखित फ़ंक्शन का उपयोग रेखा खंड को दूरी की गणना करने के लिए किया।

PHP में:

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

फिर आप दूरी की गणना करने के लिए प्रक्षेपण कार्यों का उपयोग कर सकते हैं, मैं उपरोक्त सूत्र का उपयोग उस समय की गणना करने के लिए कर रहा हूं जो एक औसत गति दी गई है और यह वास्तव में अच्छी तरह से काम करती है।

यदि आप PHP में निर्देशांक के बीच की दूरी की गणना करने के लिए एक अच्छी PHP लाइब्रेरी चाहते हैं, तो GeoCalc वर्ग की जाँच करें


हे ग्लेन प्लास, आपकी कक्षा को बाईं या दाईं ओर थोड़ी ऑफसेट लगती है , मैंने Google धरती पर एक स्क्रीनशॉट बनाया है जिसमें आप देखेंगे कि ऑफसेट, चित्र: लिंक , जिस कोड का मैंने उपयोग किया हैpoint_to_line_segment_distance(41.421649, 2.600410, 41.413851, 2.594356, 41.415710, 2.600638))
Colas

यह मेरी कक्षा नहीं है, बस इसे बहुत खोजने के बाद मिला;; लेकिन मैं अपनी समस्याओं में 8 अंकों की सटीकता का उपयोग करता हूं, आप 6 का उपयोग करते प्रतीत होते हैं। यही कारण हो सकता है, मैंने कभी भी यहां कोई ऑफसेट नहीं देखा। इसे इंगित करने के लिए धन्यवाद, मैं जल्द ही इसे दोगुना कर दूंगा क्योंकि मुझे जानना आवश्यक है।
ग्लेन प्लास

हो सकता है कि आप rihgt हों, मैं gEarth पर अधिक डिसिलम नहीं प्राप्त कर सकता, btw मेरी आखिरी तस्वीर में खंड 1000 मीटर लंबा था, ऑफसेट ~ 110 मीटर था
कोलास

यह उस पैमाने के बारे में है जिस पर मैं इसका उपयोग करता हूं, इससे अधिक नहीं। मैं इसका उपयोग यह देखने के लिए करता हूं कि किस समय एक बस (सार्वजनिक परिवहन) एक स्टॉप निकटतम से गुजरती है। मैं इसे दोगुना करने जा रहा हूं और इसे एक मानचित्र पर 'देखने' के लिए रखूंगा अगर यह एक गोले पर अच्छी तरह से प्रोजेक्ट करता है।
ग्लेन प्लास

ओह ... मैंने सोचा था कि गोलाकार अनुमानों के लिए फ़ंक्शन किया गया था, इसलिए अब मैं ऑफसेट को समझता हूं
कोला डेस

1

आप computeDistanceBetween () फ़ंक्शन का उपयोग Google मानचित्र एपीआई से कर सकते हैं ।

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

दो बिंदुओं के बीच की दूरी उनके बीच सबसे छोटे मार्ग की लंबाई है। इस सबसे छोटे रास्ते को जियोडेसिक कहा जाता है। एक क्षेत्र पर सभी भूगणित एक महान चक्र के खंड हैं। इस दूरी की गणना करने के लिए, ComputeDistanceBetween () को कॉल करें, इसे दो LatLng ऑब्जेक्ट पास करें।

यदि आप कई स्थानों पर हैं, तो आप किसी दिए गए पथ की लंबाई की गणना करने के लिए कम्प्यूट्यूटेलिटी () का उपयोग कर सकते हैं

मुझे उम्मीद है इससे आपको मदद मिली होगी...


पहले मुझे बिंदु (हल्का नीला) के बीच की दूरी की गणना करने की आवश्यकता है
कोलास

नीचे मेरा समाधान यह है कि, खंड पर बिंदु अज्ञात है। मैं वास्तव में एक समान समस्या / समाधान के रूप में उल्लेख किया है। आप छोटे स्तर पर इनका सुरक्षित उपयोग कर सकते हैं।
ग्लेन प्लास
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.