Intereting Posts
Вызов определенной функции из PHP с помощью Jquery & Ajax Как я могу использовать функцию preg_replace PHP для преобразования кодовых точек Unicode в реальные символы / объекты HTML? Специальные символы и двойные кавычки в PHP Как показать не более 5 номеров в разбивке на страницы? Невозможно заставить PHP PDT xDebug остановиться на контрольных точках в Eclipse вызов вложенной функции php codeigniter делать вывод параллельно с php-кодом преобразовать mysql resultset в объект (имя, данные), который будет загружаться в HighCharts Служба Php Artisan требует фатальной ошибки после обновления php7 Как запустить php в интерактивной CLI в Windows Как найти только «новые» сообщения при использовании функций IMAP PHP для почтового ящика POP3? Ошибка MySQL – «У вас есть ошибка в синтаксисе SQL» Объединить два изображения и круглый угол в PHP Как создать таблицу HTML из массива PHP? сортировка данных по строке в виде числа

Реализация Формулы Vincenty's в PHP

Я пытаюсь реализовать формулы Винценти со следующим:

/* Implemented using Vincenty's formulae from http://en.wikipedia.org/wiki/Vincenty%27s_formulae, * answers "Direct Problem". * $latlng is a ('lat'=>x1, 'lng'=>y1) array * $distance is in miles * $angle is in degrees */ function addDistance($latlng, $distance, $bearing) { //variables $bearing = deg2rad($bearing); $iterations = 20; //avoid too-early termination while avoiding the non-convergant case //knowns $f = EARTH_SPHEROID_FLATTENING; //1/298.257223563 $a = EARTH_RADIUS_EQUATOR_MILES; //3963.185 mi $phi1 = deg2rad($latlng['lat']); $l1 = deg2rad($latlng['lng']); $b = (1 - $f) * $a; //first block $tanU1 = (1-$f)*tan($phi1); $U1 = atan($tanU1); $sigma1 = atan($tanU1 / cos($bearing)); $sinalpha = cos($U1)*sin($bearing); $cos2alpha = (1 - $sinalpha) * (1 + $sinalpha); $usquared = $cos2alpha * (($a*$a - $b*$b) / 2); $A = 1 + ($usquared)/16384 * (4096+$usquared*(-768+$usquared*(320 - 175*$usquared))); $B = ($usquared / 1024)*(256*$usquared*(-128 + $usquared * (74 - 47*$usquared))); //the loop - determining our value $sigma = $distance / ($b * $A); for($i = 0; $i < $iterations; ++$i) { $twosigmam = 2*$sigma1 + $sigma; $delta_sigma = $B * sin($sigma) * (cos($twosigmam)+(1/4)*$B*(cos(-1 + 2*cos(cos($twosigmam))) - (1/6)*$B*cos($twosigmam)*(-3+4*sin(sin($sigma)))*(-3+4*cos(cos($twosigmam))))); $sigma = $distance / ($b * $A) + $delta_sigma; } //second block $phi2 = atan((sin($U1)*cos($sigma)+cos($U1)*sin($sigma)*cos($bearing)) / ((1-$f) * sqrt(sin($sinalpha) + pow(sin($U1)*sin($sigma) - cos($U1)*cos($sigma)*cos($bearing), 2)))); $lambda = atan((sin($sigma) * sin($bearing)) / (cos($U1)*cos($sigma) - sin($U1)*sin($sigma)*cos($bearing))); $C = ($f / 16)* $cos2alpha * (4+$f*(4-3*$cos2alpha)); $L = $lambda - (1 - $C) * $f * $sinalpha * ($sigma + $C*sin($sigma)*(cos($twosigmam)+$C*cos($sigma)*(-1+2*cos(cos($twosigmam))))); $alpha2 = atan($sinalpha / (-sin($U1)*sin($sigma) + cos($U1)*cos($sigma)*cos($bearing))); //and return our results return array('lat' => rad2deg($phi2), 'lng' => rad2deg($lambda)); } var_dump(addDistance(array('lat' => 93.129, 'lng' => -43.221), 20, 135); 

Проблема заключается в том, что результаты не являются разумными – я получаю отклонения до 20 широт и долготу, сохраняя расстояние в 20. Разве это не в единицах эллиптического расстояния на сфере? Я что-то недопонимаю, или моя реализация ошибочна?

В транскрипции имеется ряд ошибок из раздела «Прямая проблема» в разделе « Википедия» :

  • Ваше выражение u 2 имеет 2 знаменателя, где должно быть b 2 ;
  • Ваши выражения A и B не согласуются с тем, должен ли исходный коэффициент фракции быть a / b * c в скобки для правильного выражения a / b * c as (a/b) * c – то, что происходит без круглых скобок, – это проблема синтаксиса php, которую я не знаю ответьте, но вы должны одобрить ясность;
  • Вы должны повторять «до тех пор, пока не будет значительного изменения сигмы», что может произойти или не произойти в вашем фиксированном количестве итераций;
  • В вашей формуле DELTA_sigma есть ошибки:
    • на странице wikipedia первый член внутри квадратной скобки [ is cos sigma (-1 т. д.), тогда как у вас есть cos (-1 т. д., что сильно отличается;
    • в той же формуле, а также позже, заметим, что cos 2 x означает (cos x)(cos x) , а не cos cos x !
  • Ваша формула phi_2 имеет sin($sinalpha) где он должен иметь sin($sinalpha)*sin($sinalpha) ;

Я думаю, что все.