mirror of
https://github.com/wavelog/wavelog.git
synced 2026-03-22 10:24:14 +00:00
Static Map API (#1098)
Added new Static Map Feature --------- Co-authored-by: phl0 <github@florian-wolters.de>
This commit is contained in:
@@ -134,4 +134,125 @@ class Genfunctions
|
||||
return $flag;
|
||||
}
|
||||
|
||||
/**
|
||||
* Function to convert a FontAwesome icon to a PNG image and returns filename if successful (or already exists)
|
||||
* Source: https://github.com/sperelson/Awesome2PNG
|
||||
* Modified by HB9HIL
|
||||
*
|
||||
* @param string $unicode Unicode of the FontAwesome icon (e.g. f0c8) - required
|
||||
* @param string $color Hexadecimal color of the icon (default: ffffff)
|
||||
* @param string $dest_file Destination file path (optional)
|
||||
* @param int $pixelshigh Height of the icon in pixels (default: 32)
|
||||
* @param int $alpha Alpha channel of the icon (default: 0)
|
||||
* @param array $padding Padding of the icon (default: array(3, 3, 3, 3))
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
function fas2png($unicode, $color='ffffff', $dest_file = null, $pixelshigh=32, $alpha=0, $padding=array(3, 3, 3, 3)) {
|
||||
try {
|
||||
// Set the target path
|
||||
if ($dest_file != null) {
|
||||
$icon = $dest_file;
|
||||
} else {
|
||||
$CI = &get_instance();
|
||||
$cachepath = $CI->config->item('cache_path') == '' ? APPPATH . 'cache/' : $CI->config->item('cache_path');
|
||||
$cacheDir = $cachepath . "fas_icons_cache/";
|
||||
if (!is_dir($cacheDir)) {
|
||||
mkdir($cacheDir, 0755, true);
|
||||
}
|
||||
$icon = $cacheDir . 'icon_' . $unicode . '_' . $color . '_' . $pixelshigh . '_a' . $alpha . '_p' . implode('-', $padding) . '.png';
|
||||
}
|
||||
|
||||
// Check if the icon already exists
|
||||
if (file_exists($icon)) {
|
||||
return $icon;
|
||||
}
|
||||
|
||||
// Check if the font file exists
|
||||
$font = realpath(APPPATH . '../') . '/assets/fontawesome/webfonts/fa-solid-900.ttf';
|
||||
if (!file_exists($font)) {
|
||||
throw new Exception('Font file not found: ' . $font);
|
||||
}
|
||||
|
||||
// Variables for brute-forcing the correct point height
|
||||
$ratio = 96 / 72;
|
||||
$ratioadd = 0.0001;
|
||||
$heightalright = false;
|
||||
$count = 0;
|
||||
$maxcount = 20000;
|
||||
|
||||
$text = json_decode('"&#x'.$unicode.';"');
|
||||
if ($text === null) {
|
||||
throw new Exception('Failed to decode unicode: &#x'.$unicode.';');
|
||||
}
|
||||
|
||||
// Brute-force point height
|
||||
while (!$heightalright && $count < $maxcount) {
|
||||
$x = $pixelshigh / $ratio;
|
||||
$count++;
|
||||
$bounds = imagettfbbox($x, 0, $font, $text);
|
||||
|
||||
if ($bounds === false) {
|
||||
throw new Exception('Failed to calculate bounding box with imagettfbbox.');
|
||||
}
|
||||
|
||||
$height = abs($bounds[7] - abs($bounds[1]));
|
||||
|
||||
if ($height == $pixelshigh) {
|
||||
$heightalright = true;
|
||||
} else {
|
||||
if ($height < $pixelshigh) {
|
||||
$ratio -= $ratioadd;
|
||||
} else {
|
||||
$ratio += $ratioadd;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!$heightalright) {
|
||||
throw new Exception('Could not calculate the correct height for the icon.');
|
||||
}
|
||||
|
||||
$width = abs($bounds[4]) + abs($bounds[0]);
|
||||
|
||||
// Create the image
|
||||
$im = imagecreatetruecolor($width + $padding[2] + $padding[3], $pixelshigh + $padding[0] + $padding[1]);
|
||||
if ($im === false) {
|
||||
throw new Exception('Failed to create image resource.');
|
||||
}
|
||||
|
||||
imagesavealpha($im, true);
|
||||
$trans = imagecolorallocatealpha($im, 0, 0, 0, 127);
|
||||
imagefill($im, 0, 0, $trans);
|
||||
imagealphablending($im, true);
|
||||
|
||||
// Prepare font color
|
||||
$fontcolor = $alpha << 24 | hexdec($color);
|
||||
|
||||
// Add the icon
|
||||
if (imagettftext($im, $x, 0, 1 + $padding[2], $height - abs($bounds[1]) - 1 + $padding[0], $fontcolor, $font, $text) === false) {
|
||||
throw new Exception('Failed to render icon with imagettftext.');
|
||||
}
|
||||
|
||||
imagesavealpha($im, true);
|
||||
|
||||
// Save the image
|
||||
if (imagepng($im, $icon) === false) {
|
||||
throw new Exception('Failed to save PNG image.');
|
||||
}
|
||||
|
||||
// Sleep to make sure the file is available in the next run.
|
||||
usleep(100000); // 100ms
|
||||
|
||||
// Clean up
|
||||
imagedestroy($im);
|
||||
|
||||
return $icon;
|
||||
|
||||
} catch (Exception $e) {
|
||||
log_message('error', $e->getMessage());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -166,6 +166,39 @@ class Qra {
|
||||
//return findings
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Function to calculate the center of a bunch of coordinates
|
||||
* Source: https://www.phpsnippet.com/snippet/center-point-of-multiple-gps-coordinates-with-php
|
||||
*
|
||||
* @param array $coordinates Array of coordinates [latitude, longitude]
|
||||
* Example:
|
||||
* $coordinates = [
|
||||
* [37.7797, -122.41924],
|
||||
* [37.77323, -122.41114],
|
||||
* [37.79203, -122.40864],
|
||||
* [37.7952, -122.4222]
|
||||
* ];
|
||||
*
|
||||
* @return array [latitude, longitude] Center of the coordinates
|
||||
*/
|
||||
|
||||
function getCenterLatLng($coordinates) {
|
||||
$x = $y = $z = 0;
|
||||
$n = count($coordinates);
|
||||
foreach ($coordinates as $point)
|
||||
{
|
||||
$lt = $point[0] * pi() / 180;
|
||||
$lg = $point[1] * pi() / 180;
|
||||
$x += cos($lt) * cos($lg);
|
||||
$y += cos($lt) * sin($lg);
|
||||
$z += sin($lt);
|
||||
}
|
||||
$x /= $n;
|
||||
$y /= $n;
|
||||
|
||||
return [atan2(($z / $n), sqrt($x * $x + $y * $y)) * 180 / pi(), atan2($y, $x) * 180 / pi()];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user