Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- /**
- * Вычисление расстояния между двумя географическими точками
- *
- * @author Григорьев Олег aka vasa_c
- * @author Волобуев Сергей aka selfchief
- */
- namespace Maps\Helpers;
- class Point
- {
- const PI = 3.1415926;
- const EARTH_RADIUS = 6372795;
- /**
- * Конструктор
- *
- * @param float $x
- * долгота
- * @param float $y
- * широта
- */
- public function __construct($x, $y) {
- $this->x = $x;
- $this->y = $y;
- }
- /**
- * Вычислить расстояние до другой точки
- *
- * @param Point|float $x
- * вторая точка или её долгота
- * @param float $y [optional]
- * широта
- * @return float
- * расстояние в метрах
- */
- public function distance($x, $y = null) {
- if ($x instanceof self) {
- $y = $x->getY();
- $x = $x->getX();
- }
- $long1 = $this->x * self::PI / 180;
- $lat1 = $this->y * self::PI / 180;
- $long2 = $x * self::PI / 180;
- $lat2 = $y * self::PI / 180;
- $y = \sqrt(\pow(\cos($lat2) * \sin($long2 - $long1), 2) +
- \pow(\cos($lat1) * \sin($lat2) - \sin($lat1) * \cos($lat2) * \cos($long2 - $long1), 2));
- $x = \sin($lat1) * \sin($lat2) + \cos($lat1) * \cos($lat2) * \cos($long2 - $long1);
- return \atan2($y, $x) * self::EARTH_RADIUS;
- }
- /**
- * Получить долготу
- *
- * @return float
- */
- public function getX() {
- return $this->x;
- }
- /**
- * Получить широту
- *
- * @return float
- */
- public function getY() {
- return $this->y;
- }
- /**
- * Долгота
- *
- * @var float
- */
- private $x;
- /**
- * Широта
- *
- * @var float
- */
- private $y;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement