Điểm gần nhất trên một đường (hình chiếu hình cầu / Mercator)


9

Tôi có một dòng (Ax, Ay - Bx, By) trên một phép chiếu Mercator (google maps) và một điểm ngẫu nhiên (Cx, Cy) gần nhất với dòng đó, tôi sẽ biết điểm gần nhất (màu xanh trong suốt trên hình ảnh) đường thẳng tới điểm (màu xanh trong ảnh)

EDIT: để làm rõ rằng đây là một phép chiếu Mercator (phép chiếu hình cầu) nhập mô tả hình ảnh ở đây


3
bài đăng này có giải pháp rất hữu ích có thể khiến bạn quan tâm stackoverflow.com/questions/3120357/get-closest-point-to-a-line
vinayan

1
Màu xanh nhạt đó trông không giống với màu gần nhất, gần nhất sẽ tạo góc 90 độ khi được kết nối với màu xanh đậm, đó có phải là ý bạn không?
Glenn Plas

Tôi đã thực hiện pic bằng tay nên vâng, nó rất rõ ràng
Colas

@vinayan Bài đăng bạn tham khảo giải quyết một vấn đề khác là tìm điểm gần nhất với một dòng , trong khi những gì cần thiết ở đây dường như muốn điểm gần nhất đến một đoạn thẳng .
whuber

1
Đoạn phải dài khoảng 20 - 100 mét, điểm từ centimet đến 30 mét so với đoạn
Colas

Câu trả lời:


2

kiểm tra liên kết này , nó làm tôi sử dụng hàm sau để tính khoảng cách đến các đoạn đường.

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

Sau đó, bạn có thể sử dụng các hàm chiếu để tính khoảng cách, tôi đang sử dụng công thức trên để tính thời gian tại thời điểm đó với tốc độ trung bình và nó hoạt động rất tốt.

Nếu bạn muốn có một thư viện PHP tốt để tính khoảng cách giữa các tọa độ trong PHP, hãy xem lớp GeoCalc


Xin chào Glenn Plas, lớp của bạn dường như có một chút bù sang trái hoặc phải, tôi đã tạo một ảnh chụp màn hình trên Google Earth, bạn sẽ thấy phần bù đó, pic: link , mã tôi đã sử dụngpoint_to_line_segment_distance(41.421649, 2.600410, 41.413851, 2.594356, 41.415710, 2.600638))
Colas

Đó không phải là lớp học của tôi, chỉ tìm thấy nó sau khi tìm kiếm rất nhiều ;-) Nhưng tôi sử dụng độ chính xác 8 chữ số trong các vấn đề của mình, bạn dường như sử dụng 6. Đó có thể là lý do, tôi không bao giờ nhận thấy bất kỳ sự bù đắp nào ở đây. Cảm ơn đã chỉ ra, tôi sẽ nhân đôi điều này ngay khi tôi cần biết.
Glenn Plas

Có thể bạn là rihgt, tôi không thể nhận được nhiều decilmas hơn trên gEarth, btw trong bức ảnh cuối cùng của tôi đoạn dài 1000 mét, độ lệch là ~ 110meters
Colas

Đó là về quy mô tôi sử dụng nó, không nhiều hơn thế. Tôi sử dụng nó để xem lúc nào xe buýt (phương tiện giao thông công cộng) đi qua điểm dừng gần nhất. Tôi sẽ nhân đôi nó và đưa nó vào một bản đồ để 'nhìn thấy' nếu nó chiếu tốt trên một quả cầu.
Glenn Plas

Ồ ... tôi nghĩ rằng chức năng đó được tạo ra cho các hình chiếu hình cầu, vì vậy bây giờ tôi hiểu phần bù
Colas

1

bạn có thể sử dụng hàm computeDistanceB Among () từ google map api .

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

Khoảng cách giữa hai điểm là độ dài của con đường ngắn nhất giữa chúng. Con đường ngắn nhất này được gọi là trắc địa. Trên một quả cầu, tất cả các trắc địa là các đoạn của một vòng tròn lớn. Để tính khoảng cách này, hãy gọi computeDistanceB between (), truyền cho nó hai đối tượng LatLng.

Thay vào đó, bạn có thể sử dụng computeLpm () để tính độ dài của một đường dẫn cụ thể nếu bạn có một vài vị trí

Tôi hy vọng nó sẽ giúp bạn...


đầu tiên tôi cần biết điểm (màu xanh nhạt) để tính khoảng cách giữa
Colas

Giải pháp của tôi dưới đây làm điều đó, điểm trên phân khúc là không rõ. Tôi thực sự có một vấn đề / giải pháp khá giống như đã đề cập. Bạn có thể sử dụng chúng một cách an toàn trên quy mô nhỏ.
Glenn Plas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.