จุดที่ใกล้ที่สุดบนเส้น (ประมาณการทรงกลม / Mercator)


9

ฉันมีเส้น (Axe, Ay - Bx, By)เหนือเส้นโครงแผนที่ปรอท (google maps) และจุดสุ่ม (Cx, Cy)ใกล้กับเส้นนั้นฉันอยากจะรู้จุดที่ใกล้ที่สุด (ภาพโปร่งใสสีน้ำเงิน) บรรทัดนั้นชี้ไปที่ (สีน้ำเงินในภาพ)

แก้ไข: เพื่อชี้แจงว่าสิ่งนี้อยู่ในการฉายภาพ Mercator (การฉายทรงกลม) ป้อนคำอธิบายรูปภาพที่นี่


3
โพสต์นี้มีวิธีการแก้ปัญหามีประโยชน์มากที่คุณอาจจะสนใจstackoverflow.com/questions/3120357/get-closest-point-to-a-line
วินายน

1
สีฟ้าอ่อนนั่นดูไม่ใกล้เคียงที่สุดที่ใกล้เคียงที่สุดควรสร้างมุม 90 องศาเมื่อเชื่อมต่อกับสีน้ำเงินเข้มนั่นคือสิ่งที่คุณหมายถึง?
Glenn Plas

ฉันทำรูปด้วยมือดังนั้นใช่มันเป็นไปได้
Colas

@vinayan โพสต์ที่คุณอ้างอิงแก้ปัญหาที่แตกต่างกันในการหาจุดที่ใกล้ที่สุดไปยังสายในขณะที่สิ่งที่จำเป็นที่นี่ดูเหมือนจะต้องการจุดที่ใกล้ที่สุดกับส่วนของเส้น
whuber

1
ส่วนควรจะยาวประมาณ 20-100 เมตรจุดจากเซนติเมตรถึง 30 เมตรมากจากส่วน
Colas

คำตอบ:


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 Earth คุณจะเห็นว่าออฟเซ็ตรูป: ลิงค์รหัสที่ฉันใช้point_to_line_segment_distance(41.421649, 2.600410, 41.413851, 2.594356, 41.415710, 2.600638))
Colas

มันไม่ใช่ชั้นเรียนของฉันเพิ่งพบหลังจากค้นหามาก ;-) แต่ฉันใช้ความแม่นยำ 8 หลักในปัญหาของฉันคุณดูเหมือนจะใช้ 6 นั่นอาจเป็นเหตุผลที่ฉันไม่เคยสังเกตเห็นสิ่งใดตรงข้ามที่นี่ ขอบคุณสำหรับการชี้ให้เห็นฉันจะตรวจสอบอีกครั้งในไม่ช้านี้ฉันจำเป็นต้องรู้
Glenn Plas

บางทีคุณอาจจะเป็น rihgt ฉันไม่สามารถรับ decilmas เพิ่มเติมใน gEarth ได้ btw ในรูปสุดท้ายของฉันส่วนยาว 1,000 เมตรส่วนตรงข้ามคือ ~ 110meters
Colas

นั่นเป็นเรื่องเกี่ยวกับสเกลที่ฉันใช้มันไม่มากไปกว่านั้น ฉันใช้มันเพื่อดูว่าเวลาใดที่รถบัส (ระบบขนส่งสาธารณะ) ผ่านป้ายหยุดที่ใกล้ที่สุด ฉันจะตรวจสอบอีกครั้งและวางมันลงในแผนที่เพื่อ 'ดู' หากมันฉายออกมาดี
Glenn Plas

โอ้ ... ฉันคิดว่าฟังก์ชั่นนี้ถูกสร้างขึ้นมาเพื่อการคาดการณ์ทรงกลมดังนั้นตอนนี้ฉันจึงเข้าใจการชดเชย
Colas

1

คุณสามารถใช้ computeDistanceBetween () ฟังก์ชันจากแผนที่ Google API

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

ระยะห่างระหว่างจุดสองจุดคือความยาวของเส้นทางที่สั้นที่สุดระหว่างจุดทั้งสอง เส้นทางที่สั้นที่สุดนี้เรียกว่า geodesic geodesics ทั้งหมดนั้นอยู่ในทรงกลมของวงกลมใหญ่ ในการคำนวณระยะทางนี้เรียกใช้ computeDistanceB Between () ผ่านวัตถุ LatLng สองตัว

คุณอาจใช้ computeLength () เพื่อคำนวณความยาวของเส้นทางที่กำหนดหากคุณมีหลายตำแหน่ง

ฉันหวังว่ามันจะช่วยคุณ ...


ก่อนอื่นฉันต้องรู้จุด (สีฟ้าอ่อน) เพื่อคำนวณระยะทางระหว่าง
Colas

โซลูชันของฉันด้านล่างทำเช่นนั้นจุดในส่วนไม่เป็นที่รู้จัก จริงๆแล้วฉันมีปัญหา / แนวทางแก้ไขที่คล้ายกันดังที่กล่าวไว้ คุณสามารถใช้สิ่งเหล่านี้อย่างปลอดภัยในระดับเล็ก ๆ
Glenn Plas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.