Modified formatting

Made Polyline PHP 5.2 compatible
This commit is contained in:
Justin Foell
2017-12-26 13:22:22 -06:00
parent abbdf7af95
commit 04cfda401a
5 changed files with 171 additions and 156 deletions
+105 -104
View File
@@ -3,7 +3,7 @@
/** /**
* Polyline * Polyline
* *
* PHP Version 5.3 * PHP Version 5.2 (forked)
* *
* A simple class to handle polyline-encoding for Google Maps * A simple class to handle polyline-encoding for Google Maps
* *
@@ -41,112 +41,113 @@
* @license http://www.gnu.org/licenses/lgpl.html LGPL v3 * @license http://www.gnu.org/licenses/lgpl.html LGPL v3
* @link https://github.com/emcconville/google-map-polyline-encoding-tool * @link https://github.com/emcconville/google-map-polyline-encoding-tool
*/ */
class Polyline class Polyline {
{
/**
* Default precision level of 1e-5.
*
* Overwrite this property in extended class to adjust precision of numbers.
* !!!CAUTION!!!
* 1) Adjusting this value will not guarantee that third party
* libraries will understand the change.
* 2) Float point arithmetic IS NOT real number arithmetic. PHP's internal
* float precision may contribute to undesired rounding.
*
* @var int $precision
*/
protected static $precision = 5;
/** /**
* Apply Google Polyline algorithm to list of points. * Default precision level of 1e-5.
* *
* @param array $points List of points to encode. Can be a list of tuples, * Overwrite this property in extended class to adjust precision of numbers.
* or a flat on dimensional array. * !!!CAUTION!!!
* * 1) Adjusting this value will not guarantee that third party
* @return string encoded string * libraries will understand the change.
*/ * 2) Float point arithmetic IS NOT real number arithmetic. PHP's internal
final public static function encode( $points ) * float precision may contribute to undesired rounding.
{ *
$points = self::flatten($points); * @var int $precision
$encodedString = ''; */
$index = 0; protected static $precision = 5;
$previous = array(0,0);
foreach ( $points as $number ) {
$number = (float)($number);
$number = (int)round($number * pow(10, static::$precision));
$diff = $number - $previous[$index % 2];
$previous[$index % 2] = $number;
$number = $diff;
$index++;
$number = ($number < 0) ? ~($number << 1) : ($number << 1);
$chunk = '';
while ( $number >= 0x20 ) {
$chunk .= chr((0x20 | ($number & 0x1f)) + 63);
$number >>= 5;
}
$chunk .= chr($number + 63);
$encodedString .= $chunk;
}
return $encodedString;
}
/** // To remove PHP 5.3 requirement.
* Reverse Google Polyline algorithm on encoded string. protected static $flatten = array();
*
* @param string $string Encoded string to extract points from.
*
* @return array points
*/
final public static function decode( $string )
{
$points = array();
$index = $i = 0;
$previous = array(0,0);
while ($i < strlen($string)) {
$shift = $result = 0x00;
do {
$bit = ord(substr($string, $i++)) - 63;
$result |= ($bit & 0x1f) << $shift;
$shift += 5;
} while ($bit >= 0x20);
$diff = ($result & 1) ? ~($result >> 1) : ($result >> 1); /**
$number = $previous[$index % 2] + $diff; * Apply Google Polyline algorithm to list of points.
$previous[$index % 2] = $number; *
$index++; * @param array $points List of points to encode. Can be a list of tuples,
$points[] = $number * 1 / pow(10, static::$precision); * or a flat on dimensional array.
} *
return $points; * @return string encoded string
} */
final public static function encode( $points ) {
$points = self::flatten( $points );
$encoded_string = '';
$index = 0;
$previous = array( 0, 0 );
foreach ( $points as $number ) {
$number = (float) $number;
$number = (int) round( $number * pow( 10, static::$precision ) );
$diff = $number - $previous[ $index % 2 ];
/** $previous[ $index % 2 ] = $number;
* Reduce multi-dimensional to single list
*
* @param array $array Subject array to flatten.
*
* @return array flattened
*/
final public static function flatten( $array )
{
$flatten = array();
array_walk_recursive(
$array, // @codeCoverageIgnore
function ($current) use (&$flatten) {
$flatten[] = $current;
}
);
return $flatten;
}
/** $number = $diff;
* Concat list into pairs of points $index++;
* $number = ( $number < 0 ) ? ~( $number << 1 ) : ( $number << 1 );
* @param array $list One-dimensional array to segment into list of tuples. $chunk = '';
* while ( $number >= 0x20 ) {
* @return array pairs $chunk .= chr( ( 0x20 | ( $number & 0x1f ) ) + 63 );
*/ $number >>= 5;
final public static function pair( $list ) }
{ $chunk .= chr( $number + 63 );
return is_array($list) ? array_chunk($list, 2) : array(); $encoded_string .= $chunk;
} }
return $encoded_string;
}
/**
* Reverse Google Polyline algorithm on encoded string.
*
* @param string $string Encoded string to extract points from.
*
* @return array points
*/
final public static function decode( $string ) {
$points = array();
$index = $i = 0;
$previous = array( 0, 0 );
while ( $i < strlen( $string ) ) {
$shift = $result = 0x00;
do {
$bit = ord( substr( $string, $i++ ) ) - 63;
$result |= ( $bit & 0x1f ) << $shift;
$shift += 5;
} while ( $bit >= 0x20 );
$diff = ( $result & 1 ) ? ~( $result >> 1 ) : ( $result >> 1 );
$number = $previous[ $index % 2 ] + $diff;
$previous[ $index % 2 ] = $number;
$index++;
$points[] = $number * 1 / pow( 10, static::$precision );
}
return $points;
}
/**
* Reduce multi-dimensional to single list
*
* @param array $array Subject array to flatten.
*
* @return array flattened
*/
final public static function flatten( $array ) {
self::$flatten = array();
array_walk_recursive( $array, array( 'Polyline', 'flatten_callback' ) );
return self::$flatten;
}
final public static function flatten_callback( $value ) {
self::$flatten[] = $value;
}
/**
* Concat list into pairs of points
*
* @param array $list One-dimensional array to segment into list of tuples.
*
* @return array pairs
*/
final public static function pair( $list ) {
return is_array( $list ) ? array_chunk( $list, 2 ) : array();
}
} }
+4 -7
View File
@@ -19,14 +19,14 @@ class WPStrava_RouteShortcode {
'map_width' => '480', 'map_width' => '480',
'map_height' => '320', 'map_height' => '320',
'athlete_token' => WPStrava::get_instance()->settings->get_default_token(), 'athlete_token' => WPStrava::get_instance()->settings->get_default_token(),
'markers' => false, 'markers' => false,
); );
extract( shortcode_atts( $defaults, $atts ) ); extract( shortcode_atts( $defaults, $atts ) );
$strava_som = WPStrava_SOM::get_som( $som ); $strava_som = WPStrava_SOM::get_som( $som );
$route = WPStrava::get_instance()->routes; $route = WPStrava::get_instance()->routes;
$route_details = $route->getRoute( $id ); $route_details = $route->get_route( $id );
//sanitize width & height //sanitize width & height
$map_width = str_replace( '%', '', $map_width ); $map_width = str_replace( '%', '', $map_width );
@@ -66,9 +66,6 @@ class WPStrava_RouteShortcode {
public static function print_scripts() { public static function print_scripts() {
if ( self::$add_script ) { if ( self::$add_script ) {
wp_enqueue_style( 'wp-strava-style' ); wp_enqueue_style( 'wp-strava-style' );
//wp_print_scripts('google-maps');
//wp_print_scripts('wp-strava-script');
} }
} }
} }
+13 -14
View File
@@ -3,18 +3,17 @@
* Routes is a class wrapper for the Strava REST API functions. * Routes is a class wrapper for the Strava REST API functions.
*/ */
class WPStrava_Routes class WPStrava_Routes {
{ const ROUTES_URL = 'http://app.strava.com/routes/';
const ROUTES_URL = 'http://app.strava.com/routes/';
/** /**
* Get single route by ID. * Get single route by ID.
* *
* @param int $route_id ID of activity to retrieve. * @param int $route_id ID of activity to retrieve.
* @return object stdClass representing this route. * @return object stdClass representing this route.
* @author Daniel Lintott * @author Daniel Lintott
*/ */
public function getRoute($route_id ) { public function get_route( $route_id ) {
return WPStrava::get_instance()->get_api()->get( "routes/{$route_id}" ); return WPStrava::get_instance()->get_api()->get( "routes/{$route_id}" );
} // getRouteDetails }
} }
+38 -24
View File
@@ -1,7 +1,5 @@
<?php <?php
require_once WPSTRAVA_PLUGIN_DIR . 'lib/Polyline.php';
class WPStrava_StaticMap { class WPStrava_StaticMap {
/** /**
@@ -11,10 +9,11 @@ class WPStrava_StaticMap {
* *
* @static * @static
* @access public * @access public
* @param object $ride Ride object from strava. * @param object $ride Ride object from strava.
* @param int $height Height of map in pixels. * @param int $height Height of map in pixels.
* @param int $width Width of map in pixels. * @param int $width Width of map in pixels.
* @param bool $markers Display start and finish markers. * @param bool $markers Display start and finish markers.
* @return string HTML img tag with static map image.
*/ */
public static function get_image_tag( $ride, $height = 320, $width = 480, $markers = false ) { public static function get_image_tag( $ride, $height = 320, $width = 480, $markers = false ) {
$key = WPStrava::get_instance()->settings->gmaps_key; $key = WPStrava::get_instance()->settings->gmaps_key;
@@ -24,34 +23,49 @@ class WPStrava_StaticMap {
return ''; return '';
} }
$url = "https://maps.googleapis.com/maps/api/staticmap?maptype=terrain&size={$width}x{$height}&sensor=false&key={$key}&path=color:0xFF0000BF|weight:2|enc:"; $url = "https://maps.googleapis.com/maps/api/staticmap?maptype=terrain&size={$width}x{$height}&sensor=false&key={$key}&path=color:0xFF0000BF|weight:2|enc:";
$url_len = strlen( $url ); $url_len = strlen( $url );
$max_chars = 1865; $max_chars = 1865;
$polyline = '';
if ( ! empty( $ride->map->polyline ) && ( $url_len + strlen( $ride->map->polyline ) < $max_chars ) ) { if ( ! empty( $ride->map->polyline ) && ( $url_len + strlen( $ride->map->polyline ) < $max_chars ) ) {
$url .= $ride->map->polyline; $polyline = $ride->map->polyline;
$points = self::decode_polyline($ride->map->polyline);
} elseif ( ! empty( $ride->map->summary_polyline ) ) { } elseif ( ! empty( $ride->map->summary_polyline ) ) {
$url .= $ride->map->summary_polyline; $polyline = $ride->map->summary_polyline;
$points = self::decode_polyline($ride->map->summary_polyline);
} }
$url .= $polyline;
if ($markers) { if ( $markers ) {
$markers = '&markers=color:green|' . $points['start'][0] . ',' . $points['start'][1] . $points = self::decode_start_finish( $polyline );
'&markers=color:red|' . $points['finish'][0] . ',' . $points['finish'][1]; $markers = '&markers=color:green|' . $points['start'][0] . ',' . $points['start'][1] .
$url .= $markers; '&markers=color:red|' . $points['finish'][0] . ',' . $points['finish'][1];
} $url .= $markers;
}
return "<img class='wp-strava-img' src='{$url}' />"; return "<img class='wp-strava-img' src='{$url}' />";
} }
private static function decode_polyline($enc) { /**
$points = Polyline::decode($enc); * From an encoded polyline, get the start and finish points for
$points = Polyline::pair($points); * the purposes of displaying start and finish markers.
$start = $points[0]; *
$finish = $points[count($points)-1]; * @static
* @see https://developers.google.com/maps/documentation/utilities/polylinealgorithm
* @access private
* @param string $enc Encoded polyline.
* @return array with indexes of start & finish containing lat/lon for each.
*/
private static function decode_start_finish( $enc ) {
require_once WPSTRAVA_PLUGIN_DIR . 'lib/Polyline.php';
$points = Polyline::decode( $enc );
$points = Polyline::pair( $points );
$start = $points[0];
$finish = $points[ count( $points ) - 1 ];
return array('start' => $start, 'finish' => $finish); return array(
} 'start' => $start,
'finish' => $finish,
);
}
} }
+11 -7
View File
@@ -38,12 +38,16 @@ Strava Latest Map - shows map of latest activity with option to limit latest map
== Changelog == == Changelog ==
= 1.3.0 =
Added [route] shortcode and start/finish https://github.com/cmanon/wp-strava/pull/10/
Fixed error with /rides link (should be /activities). https://wordpress.org/support/topic/problem-with-link-4/
= 1.2.0 = = 1.2.0 =
Added multi-athlete configuration. Added multi-athlete configuration. https://wordpress.org/support/topic/multi-strava-user/
Additional transitions from Ride -> Activity. Additional transitions from Ride -> Activity.
Updated setup instructions to reflect latest Strava API set up process. Updated setup instructions to reflect latest Strava API set up process.
Backwards Compatibility - removed PHP 5.3+ specific operator (should work with PHP 5.2 now - versions 1.1 and 1.1.1 don't). Backwards Compatibility - removed PHP 5.3+ specific operator (should work with PHP 5.2 now - versions 1.1 and 1.1.1 don't). https://wordpress.org/support/topic/version-1-1-broken/
Reworked error reporting and formatting. Reworked error reporting and formatting. https://wordpress.org/support/topic/updating-settings-failure/#post-9764942
= 1.1.1 = = 1.1.1 =
Changes to better support translations through https://translate.wordpress.org. Changes to better support translations through https://translate.wordpress.org.
@@ -52,15 +56,15 @@ Cleaned up formatting.
= 1.1 = = 1.1 =
Added [activity] shortcode to deprecate [ride] in the future. Added [activity] shortcode to deprecate [ride] in the future.
Fixed static method call error in shortcode. Fixed static method call error in shortcode.
Added title to Strava Latest Map Widget. Added title to Strava Latest Map Widget. https://wordpress.org/support/topic/change-widget-title-from-latest-ride-to-latest-run-or-something-else/
Added Lance Willett to contributors. Added Lance Willett to contributors.
Added target="_blank" to widget hrefs. Added target="_blank" to widget hrefs.
Added Google Maps Key to settings (required for map images). Added Google Maps Key to settings (required for map images). https://wordpress.org/support/topic/the-google-maps-api-server-rejected-your-request-3/
Added cache clear option to remove transient & image data. Added cache clear option to remove transient & image data.
Cleaned up formatting. Cleaned up formatting.
= 1.0 = = 1.0 =
Change to Strava API V3. Change to Strava API V3. https://wordpress.org/support/topic/does-not-work-354/
Switch ride shortcode to use static map. Switch ride shortcode to use static map.
= 0.70 = = 0.70 =
@@ -73,7 +77,7 @@ Fixed several bugs.
Added feature to show athlete name/link to the widget if the search option is by club. Added feature to show athlete name/link to the widget if the search option is by club.
= 0.61 = = 0.61 =
Added option to select unit of measurements on the widget. Added option to select unit of measurements on the widget. https://wordpress.org/support/topic/feature-request-runs-in-minkm/
= 0.6 = = 0.6 =
Initial version. Initial version.