Titik terdekat pada garis (Proyeksi bola / Mercator)

9

Saya memiliki garis (Ax, Ay - Bx, By) pada proyeksi mercator (google maps) dan titik acak (Cx, Cy) terdekat dengan garis itu, saya ingin mengetahui titik terdekat (transparan biru pada gambar) di atas garis ke titik (biru pada gambar)

EDIT: untuk mengklarifikasi bahwa ini ada dalam proyeksi Mercator (proyeksi bulat) masukkan deskripsi gambar di sini

Cola
sumber
3
posting ini memiliki solusi yang sangat berguna yang mungkin menarik bagi Anda stackoverflow.com/questions/3120357/get-closest-point-to-a-line
vinayan
1
Biru muda itu tidak terlihat seperti yang terdekat, yang terdekat harus menciptakan sudut 90 derajat ketika terhubung ke biru tua, apakah itu yang Anda maksud?
Glenn Plas
Saya membuat foto dengan tangan jadi ya, itu mungkin
Colas
@vinayan Posting Anda referensi memecahkan masalah yang berbeda dalam menemukan titik terdekat ke garis , sedangkan apa yang diperlukan di sini tampaknya ingin titik terdekat ke segmen garis .
whuber
1
Segmen harus sekitar 20-100 meter, titik dari sentimeter hingga 30 meter lebih banyak dari segmen
Colas

Jawaban:

2

lihat tautan ini , itu membuat saya menggunakan fungsi berikut untuk menghitung jarak ke segmen garis.

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

Anda kemudian dapat menggunakan fungsi proyeksi untuk menghitung jarak, saya menggunakan rumus di atas untuk menghitung waktu pada saat itu diberikan kecepatan rata-rata dan itu bekerja dengan sangat baik.

Jika Anda ingin perpustakaan PHP yang baik untuk menghitung jarak antar koordinat dalam PHP, periksa kelas GeoCalc

Glenn Plas
sumber
Hai Glenn Plas, kelas Anda tampaknya memiliki sedikit offset ke kiri atau kanan, saya membuat tangkapan layar di Google earth, Anda akan melihat offset itu, pic: tautan , kode yang saya gunakanpoint_to_line_segment_distance(41.421649, 2.600410, 41.413851, 2.594356, 41.415710, 2.600638))
Colas
Ini bukan kelas saya, hanya menemukannya setelah mencari banyak ;-) Tapi saya menggunakan presisi 8 digit dalam masalah saya, Anda tampaknya menggunakan 6. Itu bisa menjadi alasan, saya tidak pernah melihat ada offset di sini. Terima kasih telah menunjukkannya, saya akan memeriksa ulang ini segera setelah saya perlu tahu.
Glenn Plas
Mungkin Anda benar, saya tidak bisa mendapatkan lebih banyak decilmas di gEarth, btw di gambar terakhir saya panjangnya 1.000 meter, offsetnya ~ 110meters
Colas
Itu tentang skala saya menggunakannya, tidak lebih dari itu. Saya menggunakannya untuk melihat jam berapa bus (angkutan umum) melewati halte terdekat. Namun saya akan mengeceknya lagi dan meletakkannya di peta untuk 'melihat' apakah proyek itu bagus di sphere.
Glenn Plas
Oh ... Saya pikir fungsi itu dibuat untuk proyeksi bola, jadi sekarang saya mengerti offset
Colas
1

Anda dapat menggunakan fungsi computeDistanceBetween () dari google map api .

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

Jarak antara dua titik adalah panjang jalur terpendek di antara mereka. Jalur terpendek ini disebut geodesik. Pada sebuah bola, semua geodesik adalah segmen dari lingkaran besar. Untuk menghitung jarak ini, panggil computeDistanceBetween (), berikan dua objek LatLng.

Anda bisa menggunakan computeLength () untuk menghitung panjang lintasan yang diberikan jika Anda memiliki beberapa lokasi

Saya harap ini membantu Anda ...

Aragon
sumber
pertama saya perlu tahu titik (biru muda) untuk menghitung jarak antara
Colas
Solusi saya di bawah ini melakukan itu, titik pada segmen tidak diketahui. Saya sebenarnya memiliki masalah / solusi yang agak mirip seperti yang disebutkan. Anda dapat menggunakannya dengan aman dalam skala kecil.
Glenn Plas