<?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 geo" itemprop="geo" itemscope itemtype="http://schema.org/GeoCoordinates" data-role="collapsible" data-collapsed="true"><h3>Open Map...</h3> |
if (isIOSDevice()) |
<meta itemprop="latitude" content="'.$mapPoints[0][0].'" /> |
|
<abbr class="latitude" title="'.$mapPoints[0][0].'"></abbr> |
|
<abbr class="longitude" title="'.$mapPoints[0][1].'"></abbr> |
|
<meta itemprop="longitude" content="'.$mapPoints[0][1].'" />'; |
|
} |
|
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">'; |
$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 |
} |
|
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">'; |
$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) |
while ($b >= 0x20); |
while ($b >= 0x20); |
// Check if negative, and convert. (All negative values have the last bit |
// Check if negative, and convert. (All negative values have the last bit |
// set) |
// set) |
$dlat = (($result & 1) ? ~($result >> 1) : ($result >> 1)); |
$dlat = (($result & 1) ? ~($result >> 1) : ($result >> 1)); |
// Compute actual latitude since value is offset from previous value. |
// Compute actual latitude since value is offset from previous value. |
$lat+= $dlat; |
$lat+= $dlat; |
// The next values will correspond to the longitude for this point. |
// The next values will correspond to the longitude for this point. |
$shift = 0; |
$shift = 0; |
$result = 0; |
$result = 0; |
do { |
do { |
$b = ord(substr($encoded, $index++)) - 63; |
$b = ord(substr($encoded, $index++)) - 63; |
$result|= ($b & 0x1f) << $shift; |
$result|= ($b & 0x1f) << $shift; |
$shift+= 5; |
$shift+= 5; |
} while ($b >= 0x20); |
} while ($b >= 0x20); |
$dlng = (($result & 1) ? ~($result >> 1) : ($result >> 1)); |
$dlng = (($result & 1) ? ~($result >> 1) : ($result >> 1)); |
$lng+= $dlng; |
$lng+= $dlng; |
// The actual latitude and longitude values were multiplied by |
// The actual latitude and longitude values were multiplied by |
// 1e5 before encoding so that they could be converted to a 32-bit |
// 1e5 before encoding so that they could be converted to a 32-bit |
// integer representation. (With a decimal accuracy of 5 places) |
// integer representation. (With a decimal accuracy of 5 places) |
// Convert back to original values. |
// Convert back to original values. |
$points[] = array( |
$points[] = array( |
$lat * 1e-5, |
$lat * 1e-5, |
$lng * 1e-5 |
$lng * 1e-5 |
); |
); |
} |
} |
return $points; |
return $points; |
} |
} |
|
|
function geocode($query, $giveOptions) { |
function geocode($query, $giveOptions) { |
global $cloudmadeAPIkey; |
global $cloudmadeAPIkey; |
$url = 'http://geocoding.cloudmade.com/$cloudmadeAPIkey/geocoding/v2/find.js?query=' . urlencode($query) . '&bbox=-35.5,149.00,-35.15,149.1930&return_location=true&bbox_only=true'; |
$url = 'http://geocoding.cloudmade.com/$cloudmadeAPIkey/geocoding/v2/find.js?query=' . urlencode($query) . '&bbox=-35.5,149.00,-35.15,149.1930&return_location=true&bbox_only=true'; |
$contents = json_decode(getPage($url)); |
$contents = json_decode(getPage($url)); |
if ($giveOptions) |
if ($giveOptions) |
return $contents->features; |
return $contents->features; |
elseif (isset($contents->features[0]->centroid)) |
elseif (isset($contents->features[0]->centroid)) |
return $contents->features[0]->centroid->coordinates[0] . ',' . $contents->features[0]->centroid->coordinates[1]; |
return $contents->features[0]->centroid->coordinates[0] . ',' . $contents->features[0]->centroid->coordinates[1]; |
else |
else |
return ''; |
return ''; |
} |
} |
|
|
function reverseGeocode($lat, $lng) { |
function reverseGeocode($lat, $lng) { |
global $cloudmadeAPIkey; |
global $cloudmadeAPIkey; |
$url = 'http://geocoding.cloudmade.com/$cloudmadeAPIkey/geocoding/v2/find.js?around=' . $lat . ',' . $lng . '&distance=closest&object_type=road'; |
$url = 'http://geocoding.cloudmade.com/$cloudmadeAPIkey/geocoding/v2/find.js?around=' . $lat . ',' . $lng . '&distance=closest&object_type=road'; |
$contents = json_decode(getPage($url)); |
$contents = json_decode(getPage($url)); |
return $contents->features[0]->properties->name; |
return $contents->features[0]->properties->name; |
} |
} |
|
|