Найближча точка на лінії (сферична проекція / Меркатор)


9

У мене є лінія (Ax, Ay - Bx, By) над проекцією Меркатора (Google Maps) та випадковою точкою (Cx, Cy), найближчою до цієї лінії, я б знав найближчу точку (прозорий синій на зображенні) над цей рядок до точки (синій на зображенні)

EDIT: уточнити, що це в проекції Меркатора (сферична проекція) введіть тут опис зображення


3
цей пост має дуже корисне рішення , яке може зацікавити вас stackoverflow.com/questions/3120357/get-closest-point-to-a-line
Віная

1
Цей світло-блакитний колір не схожий на найближчий, найближчий повинен створити кут 90 градусів при підключенні до темно-синього, це те, що ви маєте на увазі?
Glenn Plas

Я зробив картинку вручну, так так, це можливо
Колас

@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 Earth, ви побачите це зміщення, рис: посилання , код, який я використавpoint_to_line_segment_distance(41.421649, 2.600410, 41.413851, 2.594356, 41.415710, 2.600638))
Колас

Це не мій клас, я просто знайшов його після багато пошуків ;-) Але я використовую 8 цифр точності у своїх проблемах, ви, здається, використовуєте 6. Це може бути причиною, я ніколи не помічав жодного зміщення тут. Дякую, що вказали на це, я двічі перевіряю це, як тільки мені потрібно знати.
Glenn Plas

Можливо, ви rihgt, я не можу отримати більше децильм на gEarth, btw, на моєму останньому знімку сегмент був довжиною 1000 метрів, зміщення склало ~ 110 метрів
Колас

Ось щодо масштабу, яким я його використовую, не більше того. Я використовую це, щоб побачити, в який час автобус (громадський транспорт) проходить зупинку найближчої. Я збираюся подвійно перевірити його і поставити його на карту, щоб "побачити", чи добре він проектує на сферу.
Glenn Plas

О ... я думав, що ця функція була зроблена для сферичних проекцій, тому тепер я розумію зміщення
Колас

1

ви можете використовувати функцію computeDistanceBetween () з google map api .

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

Відстань між двома точками - це довжина найкоротшого шляху між ними. Цей найкоротший шлях називають геодезичним. На кулі всі геодезики є сегментами великого кола. Щоб обчислити цю відстань, зателефонуйте computeDistanceBet Between (), передавши їй два об’єкти LatLng.

Натомість ви можете використовувати computeLength () для обчислення довжини певного шляху, якщо у вас є кілька локацій

я сподіваюся, що це допоможе тобі ...


спершу мені потрібно знати точку (світло-синій), щоб обчислити відстань між
Колас

Моє рішення нижче робить це, точка на сегменті невідома. У мене фактично є досить схожа проблема / рішення, як згадувалося. Ви можете сміливо використовувати їх у невеликих масштабах.
Гленн Плаз
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.