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 ) ); + } +}