<?php |
<?php |
|
|
/* |
/* |
* Copyright 2010,2011 Alexander Sadleir |
* Copyright 2010,2011 Alexander Sadleir |
|
|
Licensed under the Apache License, Version 2.0 (the "License"); |
Licensed under the Apache License, Version 2.0 (the "License"); |
you may not use this file except in compliance with the License. |
you may not use this file except in compliance with the License. |
You may obtain a copy of the License at |
You may obtain a copy of the License at |
|
|
http://www.apache.org/licenses/LICENSE-2.0 |
http://www.apache.org/licenses/LICENSE-2.0 |
|
|
Unless required by applicable law or agreed to in writing, software |
Unless required by applicable law or agreed to in writing, software |
distributed under the License is distributed on an "AS IS" BASIS, |
distributed under the License is distributed on an "AS IS" BASIS, |
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
See the License for the specific language governing permissions and |
See the License for the specific language governing permissions and |
limitations under the License. |
limitations under the License. |
*/ |
*/ |
// SELECT array_to_string(array(SELECT REPLACE(name_2006, ',', '\,') as name FROM suburbs order by name), ',') |
// SELECT array_to_string(array(SELECT REPLACE(name_2006, ',', '\,') as name FROM suburbs order by name), ',') |
$suburbs = explode(",", "Acton,Ainslie,Amaroo,Aranda,Banks,Barton,Belconnen,Bonner,Bonython,Braddon,Bruce,Calwell,Campbell,Chapman,Charnwood,Chifley,Chisholm,City,Conder,Cook,Curtin,Deakin,Dickson,Downer,Duffy,Dunlop,Evatt,Fadden,Farrer,Fisher,Florey,Flynn,Forrest,Franklin,Fraser,Fyshwick,Garran,Gilmore,Giralang,Gordon,Gowrie,Greenway,Griffith,Gungahlin,Hackett,Hall,Harrison,Hawker,Higgins,Holder,Holt,Hughes,Hume,Isaacs,Isabella Plains,Kaleen,Kambah,Kingston,Latham,Lawson,Lyneham,Lyons,Macarthur,Macgregor,Macquarie,Mawson,McKellar,Melba,Mitchell,Monash,Narrabundah,Ngunnawal,Nicholls,Oaks Estate,O'Connor,O'Malley,Oxley,Page,Palmerston,Parkes,Pearce,Phillip,Pialligo,Red Hill,Reid,Richardson,Rivett,Russell,Scullin,Spence,Stirling,Symonston,Tharwa,Theodore,Torrens,Turner,Wanniassa,Waramanga,Watson,Weetangera,Weston,Yarralumla"); |
$suburbs = explode(",", "Acton,Ainslie,Amaroo,Aranda,Banks,Barton,Belconnen,Bonner,Bonython,Braddon,Bruce,Calwell,Campbell,Chapman,Charnwood,Chifley,Chisholm,City,Conder,Cook,Curtin,Deakin,Dickson,Downer,Duffy,Dunlop,Evatt,Fadden,Farrer,Fisher,Florey,Flynn,Forrest,Franklin,Fraser,Fyshwick,Garran,Gilmore,Giralang,Gordon,Gowrie,Greenway,Griffith,Gungahlin,Hackett,Hall,Harrison,Hawker,Higgins,Holder,Holt,Hughes,Hume,Isaacs,Isabella Plains,Kaleen,Kambah,Kingston,Latham,Lawson,Lyneham,Lyons,Macarthur,Macgregor,Macquarie,Mawson,McKellar,Melba,Mitchell,Monash,Narrabundah,Ngunnawal,Nicholls,Oaks Estate,O'Connor,O'Malley,Oxley,Page,Palmerston,Parkes,Pearce,Phillip,Pialligo,Red Hill,Reid,Richardson,Rivett,Russell,Scullin,Spence,Stirling,Symonston,Tharwa,Theodore,Torrens,Turner,Wanniassa,Waramanga,Watson,Weetangera,Weston,Yarralumla"); |
|
|
function staticmap($mapPoints, $collapsible = true, $twotone = false, $path = false, $numbered = false) { |
function staticmap($mapPoints, $collapsible = true, $twotone = false, $path = false, $numbered = false) { |
|
|
$markers = ""; |
$markers = ""; |
$height = 300; |
$height = 300; |
$width = $height; |
$width = $height; |
$index = 0; |
$index = 0; |
if (sizeof($mapPoints) < 1) |
if (sizeof($mapPoints) < 1) |
return "map error"; |
return "map error"; |
if (sizeof($mapPoints) === 1) { |
if (sizeof($mapPoints) === 1) { |
$markers = "markers={$mapPoints[0][0]},{$mapPoints[0][1]}"; |
$markers = "markers={$mapPoints[0][0]},{$mapPoints[0][1]}"; |
} else { |
} else { |
if (!$numbered) { |
if (!$numbered) { |
$markers = "markers="; |
$markers = "markers="; |
} |
} |
if ($path) { |
if ($path) { |
$markers.= "markers={$mapPoints[0][0]},{$mapPoints[0][1]}&path="; |
$markers.= "markers={$mapPoints[0][0]},{$mapPoints[0][1]}&path="; |
} |
} |
foreach ($mapPoints as $index => $mapPoint) { |
foreach ($mapPoints as $index => $mapPoint) { |
if ($twotone && $index == 0) { |
if ($twotone && $index == 0) { |
$markers = "markerd=color:red|".$mapPoint[0] . "," . $mapPoint[1]."&markers="; |
$markers = "markerd=color:red|".$mapPoint[0] . "," . $mapPoint[1]."&markers="; |
} else { |
} else { |
if ($numbered) { |
if ($numbered) { |
$label = ($index > 9 ? 9 : $index); |
$label = ($index > 9 ? 9 : $index); |
$markers.= "markers=label:$label|" . $mapPoint[0] . "," . $mapPoint[1]; |
$markers.= "markers=label:$label|" . $mapPoint[0] . "," . $mapPoint[1]; |
if ($index + 1 != sizeof($mapPoints)) { |
if ($index + 1 != sizeof($mapPoints)) { |
$markers.= "&"; |
$markers.= "&"; |
} |
} |
} else { |
} else { |
$markers.= $mapPoint[0] . "," . $mapPoint[1]; |
$markers.= $mapPoint[0] . "," . $mapPoint[1]; |
if ($index + 1 != sizeof($mapPoints)) { |
if ($index + 1 != sizeof($mapPoints)) { |
$markers.= "|"; |
$markers.= "|"; |
} |
} |
} |
} |
$index++; |
$index++; |
} |
} |
} |
} |
} |
} |
$output = ""; |
$output = ""; |
if ($collapsible) |
if ($collapsible) |
$output.= '<div class="map" data-role="collapsible" data-collapsed="true"><h3>Open Map...</h3>'; |
$output.= '<div class="map" data-role="collapsible" data-collapsed="true"><h3>Open Map...</h3>'; |
if (isIOSDevice()) $output.= '<img class="hiresmap" src="http://maps.googleapis.com/maps/api/staticmap?size=' . $width . 'x' . $height . '&' . $markers . '&scale=2&sensor=true" width=' . $width . ' height=' . $height . '>'; |
if (isIOSDevice()) $output.= '<img class="hiresmap" src="http://maps.googleapis.com/maps/api/staticmap?size=' . $width . 'x' . $height . '&' . $markers . '&scale=2&sensor=true" width=' . $width . ' height=' . $height . ' alt="map of stop location">'; |
else $output.= '<img class="lowresmap" src="http://maps.googleapis.com/maps/api/staticmap?size=' . $width . 'x' . $height . '&' . $markers . '&scale=1&format=jpg&sensor=true" width=' . $width . ' height=' . $height . '>'; |
else $output.= '<img class="lowresmap" src="http://maps.googleapis.com/maps/api/staticmap?size=' . $width . 'x' . $height . '&' . $markers . '&scale=1&format=jpg&sensor=true" width=' . $width . ' height=' . $height . ' alt="map of stop location">'; |
|
|
if ($collapsible) |
if ($collapsible) |
$output.= '</div>'; |
$output.= '</div>'; |
return $output; |
return $output; |
} |
} |
|
|
function distance($lat1, $lng1, $lat2, $lng2, $roundLargeValues = false) { |
function distance($lat1, $lng1, $lat2, $lng2, $roundLargeValues = false) { |
$pi80 = M_PI / 180; |
$pi80 = M_PI / 180; |
$lat1*= $pi80; |
$lat1*= $pi80; |
$lng1*= $pi80; |
$lng1*= $pi80; |
$lat2*= $pi80; |
$lat2*= $pi80; |
$lng2*= $pi80; |
$lng2*= $pi80; |
$r = 6372.797; // mean radius of Earth in km |
$r = 6372.797; // mean radius of Earth in km |
$dlat = $lat2 - $lat1; |
$dlat = $lat2 - $lat1; |
$dlng = $lng2 - $lng1; |
$dlng = $lng2 - $lng1; |
$a = sin($dlat / 2) * sin($dlat / 2) + cos($lat1) * cos($lat2) * sin($dlng / 2) * sin($dlng / 2); |
$a = sin($dlat / 2) * sin($dlat / 2) + cos($lat1) * cos($lat2) * sin($dlng / 2) * sin($dlng / 2); |
$c = 2 * atan2(sqrt($a), sqrt(1 - $a)); |
$c = 2 * atan2(sqrt($a), sqrt(1 - $a)); |
$km = $r * $c; |
$km = $r * $c; |
if ($roundLargeValues) { |
if ($roundLargeValues) { |
if ($km < 1) |
if ($km < 1) |
return floor($km * 1000); |
return floor($km * 1000); |
else |
else |
return round($km, 2) . "k"; |
return round($km, 2) . "k"; |
} |
} |
else |
else |
return floor($km * 1000); |
return floor($km * 1000); |
} |
} |
|
|
function decodePolylineToArray($encoded) { |
function decodePolylineToArray($encoded) { |
// source: http://latlongeeks.com/forum/viewtopic.php?f=4&t=5 |
// source: http://latlongeeks.com/forum/viewtopic.php?f=4&t=5 |
$length = strlen($encoded); |
$length = strlen($encoded); |
$index = 0; |
$index = 0; |
$points = array(); |
$points = array(); |
$lat = 0; |
$lat = 0; |
$lng = 0; |
$lng = 0; |
while ($index < $length) { |
while ($index < $length) { |
// Temporary variable to hold each ASCII byte. |
// Temporary variable to hold each ASCII byte. |
$b = 0; |
$b = 0; |
// The encoded polyline consists of a latitude value followed by a |
// The encoded polyline consists of a latitude value followed by a |
// longitude value. They should always come in pairs. Read the |
// longitude value. They should always come in pairs. Read the |
// latitude value first. |
// latitude value first. |
$shift = 0; |
$shift = 0; |
$result = 0; |
$result = 0; |
do { |
do { |
// The `ord(substr($encoded, $index++))` statement returns the ASCII |
// The `ord(substr($encoded, $index++))` statement returns the ASCII |
// code for the character at $index. Subtract 63 to get the original |
// code for the character at $index. Subtract 63 to get the original |
// value. (63 was added to ensure proper ASCII characters are displayed |
// value. (63 was added to ensure proper ASCII characters are displayed |
// in the encoded polyline string, which is `human` readable) |
// in the encoded polyline string, which is `human` readable) |
$b = ord(substr($encoded, $index++)) - 63; |
$b = ord(substr($encoded, $index++)) - 63; |
// AND the bits of the byte with 0x1f to get the original 5-bit `chunk. |
// AND the bits of the byte with 0x1f to get the original 5-bit `chunk. |
// Then left shift the bits by the required amount, which increases |
// Then left shift the bits by the required amount, which increases |
// by 5 bits each time. |
// by 5 bits each time. |
// OR the value into $results, which sums up the individual 5-bit chunks |
// OR the value into $results, which sums up the individual 5-bit chunks |
// into the original value. Since the 5-bit chunks were reversed in |
// into the original value. Since the 5-bit chunks were reversed in |
// order during encoding, reading them in this way ensures proper |
// order during encoding, reading them in this way ensures proper |
// summation. |
// summation. |
$result|= ($b & 0x1f) << $shift; |
$result|= ($b & 0x1f) << $shift; |
$shift+= 5; |
$shift+= 5; |
} |
} |
// Continue while the read byte is >= 0x20 since the last `chunk` |
// Continue while the read byte is >= 0x20 since the last `chunk` |
// was not OR'd with 0x20 during the conversion process. (Signals the end) |
// was not OR'd with 0x20 during the conversion process. (Signals the end) |