encodeValue((int)round($lat * $factor) - $prevLat); $output .= $this->encodeValue((int)round($lng * $factor) - $prevLng); $prevLat = (int)round($lat * $factor); $prevLng = (int)round($lng * $factor); } return $output; } /** * Encodes a single integer value using Google's polyline encoding algorithm. * * Steps: * - Left shift the value * - Invert bits if negative * - Split into 5-bit chunks * - Convert to ASCII characters * * @param int $value Signed integer delta to encode * * @return string Encoded character sequence */ public function encodeValue(int $value): string { $value = $value < 0 ? ~($value << 1) : ($value << 1); $result = ''; while ($value >= 0x20) { $result .= chr((0x20 | ($value & 0x1f)) + 63); $value >>= 5; } return $result . chr($value + 63); } }