| @@ 111-157 (lines=47) @@ | ||
| 108 | * |
|
| 109 | * @return number |
|
| 110 | */ |
|
| 111 | protected function getPerpendicularDistance(Coordinate $point, Line $line) |
|
| 112 | { |
|
| 113 | $ellipsoid = $point->getEllipsoid(); |
|
| 114 | ||
| 115 | $ellipsoidRadius = $ellipsoid->getArithmeticMeanRadius(); |
|
| 116 | ||
| 117 | $firstLinePointLat = $this->deg2radLatitude($line->getPoint1()->getLat()); |
|
| 118 | $firstLinePointLng = $this->deg2radLongitude($line->getPoint1()->getLng()); |
|
| 119 | ||
| 120 | $firstLinePointX = $ellipsoidRadius * cos($firstLinePointLng) * sin($firstLinePointLat); |
|
| 121 | $firstLinePointY = $ellipsoidRadius * sin($firstLinePointLng) * sin($firstLinePointLat); |
|
| 122 | $firstLinePointZ = $ellipsoidRadius * cos($firstLinePointLat); |
|
| 123 | ||
| 124 | $secondLinePointLat = $this->deg2radLatitude($line->getPoint2()->getLat()); |
|
| 125 | $secondLinePointLng = $this->deg2radLongitude($line->getPoint2()->getLng()); |
|
| 126 | ||
| 127 | $secondLinePointX = $ellipsoidRadius * cos($secondLinePointLng) * sin($secondLinePointLat); |
|
| 128 | $secondLinePointY = $ellipsoidRadius * sin($secondLinePointLng) * sin($secondLinePointLat); |
|
| 129 | $secondLinePointZ = $ellipsoidRadius * cos($secondLinePointLat); |
|
| 130 | ||
| 131 | $pointLat = $this->deg2radLatitude($point->getLat()); |
|
| 132 | $pointLng = $this->deg2radLongitude($point->getLng()); |
|
| 133 | ||
| 134 | $pointX = $ellipsoidRadius * cos($pointLng) * sin($pointLat); |
|
| 135 | $pointY = $ellipsoidRadius * sin($pointLng) * sin($pointLat); |
|
| 136 | $pointZ = $ellipsoidRadius * cos($pointLat); |
|
| 137 | ||
| 138 | $normalizedX = $firstLinePointY * $secondLinePointZ - $firstLinePointZ * $secondLinePointY; |
|
| 139 | $normalizedY = $firstLinePointZ * $secondLinePointX - $firstLinePointX * $secondLinePointZ; |
|
| 140 | $normalizedZ = $firstLinePointX * $secondLinePointY - $firstLinePointY * $secondLinePointX; |
|
| 141 | ||
| 142 | $length = sqrt($normalizedX * $normalizedX + $normalizedY * $normalizedY + $normalizedZ * $normalizedZ); |
|
| 143 | ||
| 144 | $normalizedX /= $length; |
|
| 145 | $normalizedY /= $length; |
|
| 146 | $normalizedZ /= $length; |
|
| 147 | ||
| 148 | $thetaPoint = $normalizedX * $pointX + $normalizedY * $pointY + $normalizedZ * $pointZ; |
|
| 149 | ||
| 150 | $length = sqrt($pointX * $pointX + $pointY * $pointY + $pointZ * $pointZ); |
|
| 151 | ||
| 152 | $thetaPoint /= $length; |
|
| 153 | ||
| 154 | $distance = abs((M_PI / 2) - acos($thetaPoint)); |
|
| 155 | ||
| 156 | return $distance * $ellipsoidRadius; |
|
| 157 | } |
|
| 158 | ||
| 159 | /** |
|
| 160 | * @param float $latitude |
|
| @@ 30-76 (lines=47) @@ | ||
| 27 | * |
|
| 28 | * @return float |
|
| 29 | */ |
|
| 30 | public function getPerpendicularDistance(Coordinate $point, Line $line) |
|
| 31 | { |
|
| 32 | $ellipsoid = $point->getEllipsoid(); |
|
| 33 | ||
| 34 | $ellipsoidRadius = $ellipsoid->getArithmeticMeanRadius(); |
|
| 35 | ||
| 36 | $firstLinePointLat = $this->deg2radLatitude($line->getPoint1()->getLat()); |
|
| 37 | $firstLinePointLng = $this->deg2radLongitude($line->getPoint1()->getLng()); |
|
| 38 | ||
| 39 | $firstLinePointX = $ellipsoidRadius * cos($firstLinePointLng) * sin($firstLinePointLat); |
|
| 40 | $firstLinePointY = $ellipsoidRadius * sin($firstLinePointLng) * sin($firstLinePointLat); |
|
| 41 | $firstLinePointZ = $ellipsoidRadius * cos($firstLinePointLat); |
|
| 42 | ||
| 43 | $secondLinePointLat = $this->deg2radLatitude($line->getPoint2()->getLat()); |
|
| 44 | $secondLinePointLng = $this->deg2radLongitude($line->getPoint2()->getLng()); |
|
| 45 | ||
| 46 | $secondLinePointX = $ellipsoidRadius * cos($secondLinePointLng) * sin($secondLinePointLat); |
|
| 47 | $secondLinePointY = $ellipsoidRadius * sin($secondLinePointLng) * sin($secondLinePointLat); |
|
| 48 | $secondLinePointZ = $ellipsoidRadius * cos($secondLinePointLat); |
|
| 49 | ||
| 50 | $pointLat = $this->deg2radLatitude($point->getLat()); |
|
| 51 | $pointLng = $this->deg2radLongitude($point->getLng()); |
|
| 52 | ||
| 53 | $pointX = $ellipsoidRadius * cos($pointLng) * sin($pointLat); |
|
| 54 | $pointY = $ellipsoidRadius * sin($pointLng) * sin($pointLat); |
|
| 55 | $pointZ = $ellipsoidRadius * cos($pointLat); |
|
| 56 | ||
| 57 | $normalizedX = $firstLinePointY * $secondLinePointZ - $firstLinePointZ * $secondLinePointY; |
|
| 58 | $normalizedY = $firstLinePointZ * $secondLinePointX - $firstLinePointX * $secondLinePointZ; |
|
| 59 | $normalizedZ = $firstLinePointX * $secondLinePointY - $firstLinePointY * $secondLinePointX; |
|
| 60 | ||
| 61 | $length = sqrt($normalizedX * $normalizedX + $normalizedY * $normalizedY + $normalizedZ * $normalizedZ); |
|
| 62 | ||
| 63 | $normalizedX /= $length; |
|
| 64 | $normalizedY /= $length; |
|
| 65 | $normalizedZ /= $length; |
|
| 66 | ||
| 67 | $thetaPoint = $normalizedX * $pointX + $normalizedY * $pointY + $normalizedZ * $pointZ; |
|
| 68 | ||
| 69 | $length = sqrt($pointX * $pointX + $pointY * $pointY + $pointZ * $pointZ); |
|
| 70 | ||
| 71 | $thetaPoint /= $length; |
|
| 72 | ||
| 73 | $distance = abs((M_PI / 2) - acos($thetaPoint)); |
|
| 74 | ||
| 75 | return $distance * $ellipsoidRadius; |
|
| 76 | } |
|
| 77 | ||
| 78 | /** |
|
| 79 | * @param float $latitude |
|