From e1814ccfb6bb5896db7e4060c5ba9d8cee78c529 Mon Sep 17 00:00:00 2001
From: Justin Foell <630830+jrfoell@users.noreply.github.com>
Date: Fri, 26 Nov 2021 16:36:39 -0600
Subject: [PATCH] Initial pass at static Mapbox maps
---
src/WPStrava/ActivityRenderer.php | 2 +-
src/WPStrava/LatestMap.php | 2 +-
src/WPStrava/RouteRenderer.php | 2 +-
src/WPStrava/SegmentsRenderer.php | 2 +-
src/WPStrava/StaticGMap.php | 56 ++++++++++++++++++++++++
src/WPStrava/StaticMap.php | 71 +++++++++++++------------------
src/WPStrava/StaticMapbox.php | 58 +++++++++++++++++++++++++
7 files changed, 147 insertions(+), 46 deletions(-)
create mode 100644 src/WPStrava/StaticGMap.php
create mode 100644 src/WPStrava/StaticMapbox.php
diff --git a/src/WPStrava/ActivityRenderer.php b/src/WPStrava/ActivityRenderer.php
index 26ecef6..cb0edf3 100644
--- a/src/WPStrava/ActivityRenderer.php
+++ b/src/WPStrava/ActivityRenderer.php
@@ -55,7 +55,7 @@ class WPStrava_ActivityRenderer {
$activity_output .= $activity->get_activity_link(
$activity_details->id,
- WPStrava_StaticMap::get_image_tag( $activity_details, $map_height, $map_width, $atts['markers'], $activity_details->name ),
+ WPStrava_StaticMap::get_map()->get_image_tag( $activity_details, $map_height, $map_width, $atts['markers'], $activity_details->name ),
$activity_details->name
);
diff --git a/src/WPStrava/LatestMap.php b/src/WPStrava/LatestMap.php
index a28815d..e62a4d9 100644
--- a/src/WPStrava/LatestMap.php
+++ b/src/WPStrava/LatestMap.php
@@ -54,7 +54,7 @@ class WPStrava_LatestMap {
// phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped -- Image OK.
$strava_activity->get_activity_link(
$activity->id,
- WPStrava_StaticMap::get_image_tag( $activity, null, null, false, $activity->name ),
+ WPStrava_StaticMap::get_map()->get_image_tag( $activity, null, null, false, $activity->name ),
$activity->name
);
// phpcs:enable WordPress.Security.EscapeOutput.OutputNotEscaped
diff --git a/src/WPStrava/RouteRenderer.php b/src/WPStrava/RouteRenderer.php
index 524e8ff..f507635 100644
--- a/src/WPStrava/RouteRenderer.php
+++ b/src/WPStrava/RouteRenderer.php
@@ -60,7 +60,7 @@ class WPStrava_RouteRenderer {
$route_output .= $route->get_route_link(
$route_details->id,
- WPStrava_StaticMap::get_image_tag( $route_details, $map_height, $map_width, $atts['markers'], $route_details->name ),
+ WPStrava_StaticMap::get_map()->get_image_tag( $route_details, $map_height, $map_width, $atts['markers'], $route_details->name ),
$route_details->name
);
diff --git a/src/WPStrava/SegmentsRenderer.php b/src/WPStrava/SegmentsRenderer.php
index c034611..c7a9631 100644
--- a/src/WPStrava/SegmentsRenderer.php
+++ b/src/WPStrava/SegmentsRenderer.php
@@ -63,7 +63,7 @@ class WPStrava_SegmentsRenderer {
$segments_output .= $segments->get_segments_link(
$segment_details->id,
- WPStrava_StaticMap::get_image_tag( $segment_details, $map_height, $map_width, $atts['markers'], $segment_details->name ),
+ WPStrava_StaticMap::get_map()->get_image_tag( $segment_details, $map_height, $map_width, $atts['markers'], $segment_details->name ),
$segment_details->name
);
diff --git a/src/WPStrava/StaticGMap.php b/src/WPStrava/StaticGMap.php
new file mode 100644
index 0000000..de5cedf
--- /dev/null
+++ b/src/WPStrava/StaticGMap.php
@@ -0,0 +1,56 @@
+settings->gmaps_key;
+
+ // Short circuit if missing key or activity object doesn't have the data we need.
+ if ( empty( $key ) || empty( $activity->map ) ) {
+ return '';
+ }
+
+ if ( ! $height || ! $width ) {
+ $height = 320;
+ $width = 480;
+ }
+
+ $url = "https://maps.googleapis.com/maps/api/staticmap?maptype=terrain&size={$width}x{$height}&scale=2&sensor=false&key={$key}&path=color:0xFF0000BF|weight:2|enc:";
+ $url_len = strlen( $url );
+
+ $polyline = '';
+ if ( ! empty( $activity->map->polyline ) && ( $url_len + strlen( $activity->map->polyline ) < self::$max_chars ) ) {
+ $polyline = $activity->map->polyline;
+ } elseif ( ! empty( $activity->map->summary_polyline ) ) {
+ $polyline = $activity->map->summary_polyline;
+ } elseif ( ! empty( $activity->map->polyline ) ) {
+ // Need to reduce the polyline b/c it's too big and no summary was provided.
+ $polyline = $this->reduce_polyline( $url_len, $activity->map->polyline );
+ }
+ $url .= $polyline;
+
+ if ( $markers ) {
+ $points = $this->decode_start_finish( $polyline );
+ $markers = '&markers=color:green|' . $points['start'][0] . ',' . $points['start'][1] .
+ '&markers=color:red|' . $points['finish'][0] . ',' . $points['finish'][1];
+ $url .= $markers;
+ }
+
+ $title_attr = $title ? " title='" . esc_attr( $title ) . "'" : '';
+ return "
";
+ }
+}
diff --git a/src/WPStrava/StaticMap.php b/src/WPStrava/StaticMap.php
index 1db9475..8d469f1 100644
--- a/src/WPStrava/StaticMap.php
+++ b/src/WPStrava/StaticMap.php
@@ -1,8 +1,8 @@
settings->gmaps_key;
+ abstract public function get_image_tag( $activity, $height = 320, $width = 480, $markers = false, $title = '' );
- // Short circuit if missing key or activity object doesn't have the data we need.
- if ( empty( $key ) || empty( $activity->map ) ) {
- return '';
+ /**
+ * Factory method to get the correct StaticMap class based on specified string
+ * or by the options setting.
+ *
+ * @param string $auth 'google' or 'mapbox' (default 'google').
+ * @return WPStrava_StaticMap Instance of StaticMap
+ * @author Justin Foell
+ * @since NEXT
+ */
+ public static function get_map( $type = 'google' ) {
+ /*
+ if ( 'google' === $type ) {
+ return new WPStrava_StaticGMap();
}
-
- if ( ! $height || ! $width ) {
- $height = 320;
- $width = 480;
- }
-
- $url = "https://maps.googleapis.com/maps/api/staticmap?maptype=terrain&size={$width}x{$height}&scale=2&sensor=false&key={$key}&path=color:0xFF0000BF|weight:2|enc:";
- $url_len = strlen( $url );
-
- $polyline = '';
- if ( ! empty( $activity->map->polyline ) && ( $url_len + strlen( $activity->map->polyline ) < self::$max_chars ) ) {
- $polyline = $activity->map->polyline;
- } elseif ( ! empty( $activity->map->summary_polyline ) ) {
- $polyline = $activity->map->summary_polyline;
- } elseif ( ! empty( $activity->map->polyline ) ) {
- // Need to reduce the polyline b/c it's too big and no summary was provided.
- $polyline = self::reduce_polyline( $url_len, $activity->map->polyline );
- }
- $url .= $polyline;
-
- if ( $markers ) {
- $points = self::decode_start_finish( $polyline );
- $markers = '&markers=color:green|' . $points['start'][0] . ',' . $points['start'][1] .
- '&markers=color:red|' . $points['finish'][0] . ',' . $points['finish'][1];
- $url .= $markers;
- }
-
- $title_attr = $title ? " title='" . esc_attr( $title ) . "'" : '';
- return "
";
+ */
+ // Default to refresh.
+ return new WPStrava_StaticMapbox();
}
/**
@@ -76,7 +59,7 @@ class WPStrava_StaticMap {
* }
* }
*/
- private static function decode_start_finish( $enc ) {
+ protected function decode_start_finish( $enc ) {
require_once WPSTRAVA_PLUGIN_DIR . 'src/Polyline.php';
$points = Polyline::decode( $enc );
$points = Polyline::pair( $points );
@@ -91,13 +74,13 @@ class WPStrava_StaticMap {
* From a (large) encoded polyline, reduce the number of points
* until it is small enough for a GET URL.
*
- * @param int $url_len Length of map URL.
- * @param string $enc Encoded polyline.
+ * @param int $base_url_len Length of map URL.
+ * @param string $enc Encoded polyline.
* @return string Smaller encoded polyline.
* @author Justin Foell
* @since 2.10.0
*/
- private static function reduce_polyline( $url_len, $enc ) {
+ protected function reduce_polyline( $base_url_len, $enc ) {
require_once WPSTRAVA_PLUGIN_DIR . 'src/Polyline.php';
$points = Polyline::decode( $enc );
$points = Polyline::pair( $points );
@@ -109,11 +92,15 @@ class WPStrava_StaticMap {
$points = Polyline::flatten( $points );
$polyline = Polyline::encode( $points );
- if ( $url_len + strlen( $polyline ) >= self::$max_chars ) {
+ if ( $base_url_len + $this->polyline_length( $polyline ) >= self::$max_chars ) {
// Reduce again.
- $polyline = self::reduce_polyline( $url_len, $polyline );
+ $polyline = $this->reduce_polyline( $base_url_len, $polyline );
}
return $polyline;
}
+
+ protected function polyline_length( $polyline ) {
+ return strlen( $polyline );
+ }
}
diff --git a/src/WPStrava/StaticMapbox.php b/src/WPStrava/StaticMapbox.php
new file mode 100644
index 0000000..40a4854
--- /dev/null
+++ b/src/WPStrava/StaticMapbox.php
@@ -0,0 +1,58 @@
+map->polyline ) ) {
+ $polyline = $activity->map->polyline;
+ } elseif ( ! empty( $activity->map->summary_polyline ) ) {
+ $polyline = $activity->map->summary_polyline;
+ }
+
+ if ( empty( $polyline ) ) {
+ // No polyline provided.
+ return '';
+ }
+
+ $url = $this->build_url( $polyline, $height, $width, $markers );
+
+ $url_len = strlen( $url );
+ if ( $url_len > self::$max_chars ) {
+ // Need to reduce the polyline b/c it's too big.
+ $polyline = $this->reduce_polyline( $url_len - $this->polyline_length( $polyline ), $polyline );
+ $url = $this->build_url( $polyline, $height, $width, $markers );
+ }
+
+ $title_attr = $title ? " title='" . esc_attr( $title ) . "'" : '';
+ return "
";
+ }
+
+ private function build_url( $polyline, $height = 320, $width = 480, $markers = false ) {
+
+ $url = 'https://api.mapbox.com/styles/v1/mapbox/outdoors-v11/static/';
+ $size = "auto/{$width}x{$height}@2x";
+ $token = 'access_token=pk.eyJ1IjoianJmb2VsbCIsImEiOiJ4NkNwU2RjIn0.MHjY7k0Okawa3bdV9HtSXg';
+
+ $path = array();
+
+ if ( $markers ) {
+ $points = $this->decode_start_finish( $polyline );
+ $path[] = "pin-s+008000({$points['start'][0]},{$points['start'][1]})";
+ $path[] = "pin-s+ff0000({$points['finish'][0]},{$points['finish'][1]})";
+ }
+
+ // polyline must be URL encoded https://stackoverflow.com/a/65523379/2146022
+ $url_polyline = rawurlencode( $polyline );
+ $path[] = "path-2+ff0000({$url_polyline})";
+ $url .= implode( ',', $path ) . "/{$size}?{$token}";
+
+ return $url;
+ }
+
+ protected function polyline_length( $polyline ) {
+ return strlen( rawurlencode( $polyline ) );
+ }
+}