From: maxious Date: Mon, 29 Nov 2010 06:15:34 +0000 Subject: Javascript-less navigation using anchor tags on long lists X-Git-Url: https://maxious.lambdacomplex.org/git/?p=bus.git&a=commitdiff&h=cf533fc0b73141ec33a067a36a9b521acd321c89 --- Javascript-less navigation using anchor tags on long lists --- --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ -maxious-canberra-transit-feed/output/ +origin-src --- /dev/null +++ b/betweenpoint.php @@ -1,1 +1,188 @@ + + + + + + + + + + +
+ + from + to +
+ on routes +Reverse? + + +
+ +
+
+ +
+
+
+ + + --- /dev/null +++ b/betweenpoint.submit.php @@ -1,1 +1,32 @@ +\n"); + } + if ($reverse === "on") { + $ep = explode(";",$points); + $epr = array_reverse($ep); + $p = implode(";",$epr).";"; + $pointsString = substr($p,1); +$sql = "INSERT INTO between_stops ( toLocation, fromLocation, points, routes) VALUES('$from','$to','$pointsString','$routes')"; +$result = pg_query($conn, $sql); + if (!$result) { + echo("Error in SQL query: " . pg_last_error() ."
\n"); + } + } +flush(); + +?> --- /dev/null +++ b/busui/about.php @@ -1,1 +1,9 @@ + +

+Some icons by Joseph Wain / glyphish.com + --- /dev/null +++ b/busui/common.inc.php @@ -1,1 +1,322 @@ - +"; +} +function isFastDevice() { + return true; +} + +function include_header($pageTitle, $opendiv = true, $geolocate = false) { + // if (isDebug()) // set php error level high + echo ' + + + + bus.lambdacomplex.org - '.$pageTitle.' + + + + + + + + '; + if ($geolocate) { +echo " "; + } +echo ' + + '; +if ($opendiv) echo '

+ +
+

'.$pageTitle.'

+
+
'; +} + +function include_footer() +{ + echo '
'; +} + +$service_periods = Array ('sunday','saturday','weekday'); + +function service_period() +{ +switch (date('w')){ + +case 0: + return 'sunday'; +case 6: + return 'saturday'; +default: + return 'weekday'; +} +} + +function remove_spaces($string) +{ + return str_replace(' ','',$string); +} + +function midnight_seconds() +{ +// from http://www.perturb.org/display/Perlfunc__Seconds_Since_Midnight.html + $secs = (date("G") * 3600) + (date("i") * 60) + date("s"); + return $secs; +} + +function midnight_seconds_to_time($seconds) +{ + $midnight = mktime (0, 0, 0, date("n"), date("j"), date("Y")); + return date("h:ia",$midnight+$seconds); +} +function getPage($url) +{ + $ch = curl_init($url); +curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 ); +curl_setopt( $ch, CURLOPT_HEADER, 0 ); +$page = curl_exec($ch); +curl_close($ch); +return $page; +} +function array_flatten($a,$f=array()){ + if(!$a||!is_array($a))return ''; + foreach($a as $k=>$v){ + if(is_array($v))$f=array_flatten($v,$f); + else $f[$k]=$v; + } + return $f; +} + +function staticmap($mapPoints, $zoom = 0, $markerImage = "iconb") +{ +$width = 300; +$height = 300; +$metersperpixel[9]=305.492*$width; +$metersperpixel[10]=152.746*$width; +$metersperpixel[11]=76.373*$width; +$metersperpixel[12]=38.187*$width; +$metersperpixel[13]=19.093*$width; +$metersperpixel[14]=9.547*$width; +$metersperpixel[15]=4.773*$width; +$metersperpixel[16]=2.387*$width; +// $metersperpixel[17]=1.193*$width; +$center = ""; +$markers = ""; +$minlat = 999; +$minlon = 999; +$maxlat = 0; +$maxlon = 0; + + if (sizeof($mapPoints) < 1) return "map error"; + if (sizeof($mapPoints) === 1) { + if ($zoom == 0) $zoom = 14; + $markers .= "{$mapPoints[0][0]},{$mapPoints[0][1]},$markerimage"; + $center = "{$mapPoints[0][0]},{$mapPoints[0][1]}"; + } else { + foreach ($mapPoints as $index => $mapPoint) { + $markers .= $mapPoint[0].",".$mapPoint[1].",".$markerImage.($index+1); + if ($index+1 != sizeof($mapPoints)) $markers .= "|"; + if ($mapPoint[0] < $minlat) $minlat = $mapPoint[0]; + if ($mapPoint[0] > $maxlat) $maxlat = $mapPoint[0]; + if ($mapPoint[1] < $minlon) $minlon = $mapPoint[1]; + if ($mapPoint[1] > $maxlon) $maxlon = $mapPoint[1]; + $totalLat += $mapPoint[0]; + $totalLon += $mapPoint[1]; + } + if ($zoom == 0) { + $mapwidthinmeters = distance($minlat,$minlon,$minlat,$maxlon); + foreach (array_reverse($metersperpixel,true) as $zoomLevel => $maxdistance) + { + if ($zoom == 0 && $mapwidthinmeters < ($maxdistance + 50)) $zoom = $zoomLevel; + } + } + $center = $totalLat/sizeof($mapPoints).",".$totalLon/sizeof($mapPoints); + } + + return ''; +} + +function distance($lat1, $lng1, $lat2, $lng2) +{ + $pi80 = M_PI / 180; + $lat1 *= $pi80; + $lng1 *= $pi80; + $lat2 *= $pi80; + $lng2 *= $pi80; + + $r = 6372.797; // mean radius of Earth in km + $dlat = $lat2 - $lat1; + $dlng = $lng2 - $lng1; + $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)); + $km = $r * $c; + + return $km * 1000; +} + +function decodePolylineToArray($encoded) +{ +// source: http://latlongeeks.com/forum/viewtopic.php?f=4&t=5 + $length = strlen($encoded); + $index = 0; + $points = array(); + $lat = 0; + $lng = 0; + + while ($index < $length) + { + // Temporary variable to hold each ASCII byte. + $b = 0; + + // The encoded polyline consists of a latitude value followed by a + // longitude value. They should always come in pairs. Read the + // latitude value first. + $shift = 0; + $result = 0; + do + { + // The `ord(substr($encoded, $index++))` statement returns the ASCII + // code for the character at $index. Subtract 63 to get the original + // value. (63 was added to ensure proper ASCII characters are displayed + // in the encoded polyline string, which is `human` readable) + $b = ord(substr($encoded, $index++)) - 63; + + // 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 + // by 5 bits each time. + // 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 + // order during encoding, reading them in this way ensures proper + // summation. + $result |= ($b & 0x1f) << $shift; + $shift += 5; + } + // Continue while the read byte is >= 0x20 since the last `chunk` + // was not OR'd with 0x20 during the conversion process. (Signals the end) + while ($b >= 0x20); + + // Check if negative, and convert. (All negative values have the last bit + // set) + $dlat = (($result & 1) ? ~($result >> 1) : ($result >> 1)); + + // Compute actual latitude since value is offset from previous value. + $lat += $dlat; + + // The next values will correspond to the longitude for this point. + $shift = 0; + $result = 0; + do + { + $b = ord(substr($encoded, $index++)) - 63; + $result |= ($b & 0x1f) << $shift; + $shift += 5; + } + while ($b >= 0x20); + + $dlng = (($result & 1) ? ~($result >> 1) : ($result >> 1)); + $lng += $dlng; + + // The actual latitude and longitude values were multiplied by + // 1e5 before encoding so that they could be converted to a 32-bit + // integer representation. (With a decimal accuracy of 5 places) + // Convert back to original values. + $points[] = array($lat * 1e-5, $lng * 1e-5); + } + + return $points; +} + +function object2array($object) { + if (is_object($object)) { + foreach ($object as $key => $value) { + $array[$key] = $value; + } + } + else { + $array = $object; + } + return $array; +} + +function geocode($query, $giveOptions) { + $url = "http://geocoding.cloudmade.com/daa03470bb8740298d4b10e3f03d63e6/geocoding/v2/find.js?query=".$query."&bbox=-35.5,149.00,-35.15,149.1930&return_location=true&bbox_only=true"; + $contents = json_decode(getPage($url)); + if ($giveOptions) return $contents->features; + elseif (isset($contents->features[0]->centroid)) return $contents->features[0]->centroid->coordinates[0].",".$contents->features[0]->centroid->coordinates[1]; + else return ""; +} + +function reverseGeocode($lat,$lng) { + $url = "http://geocoding.cloudmade.com/daa03470bb8740298d4b10e3f03d63e6/geocoding/v2/find.js?around=".$lat.",".$lng."&distance=closest&object_type=road"; + $contents = json_decode(getPage($url)); + return $contents->features[0]->properties->name; +} + +function startsWith($haystack,$needle,$case=true) { + if($case){return (strcmp(substr($haystack, 0, strlen($needle)),$needle)===0);} + return (strcasecmp(substr($haystack, 0, strlen($needle)),$needle)===0); +} + +function endsWith($haystack,$needle,$case=true) { + if($case){return (strcmp(substr($haystack, strlen($haystack) - strlen($needle)),$needle)===0);} + return (strcasecmp(substr($haystack, strlen($haystack) - strlen($needle)),$needle)===0); +} +?> + + --- /dev/null +++ b/busui/index.php @@ -1,1 +1,55 @@ + +
+
+

logo
+ bus.lambdacomplex.org

+
+
+ Launch Trip Planner... + + +
+

Time/Place Settings

+
+ + +
+
+ + "/> +
+
+ + + +
+ + +
+ +
+
+ + --- /dev/null +++ b/busui/readme.txt @@ -1,1 +1,30 @@ +# input location (via GPS or favourites or search) and destination (via searchable list, optional) +# http://10.0.1.153:8765/json/boundboxstops?n=-35.27568499917103&e=149.1346514225006&s=-35.279495003493516 +&w=149.12622928619385&limit=50 +# http://10.0.1.153:8765/json/stoptrips?stop=43&time=64440 # recursively call to show all services nearby, sort by distance, need to filter by service period +# Hey, can pick destination again from a list filtered to places these stops go if you're curious! +# http://10.0.1.153:8765/json/tripstoptimes?trip=2139 # Can recursively call and parse based on intended destination to show ETA +# http://10.0.1.153:8765/json/triprows?trip=2139 # For pretty maps +have to do +/usr/sbin/setsebool -P httpd_can_network_connect=1 +on fedora + +might need http://forum.jquery.com/topic/google-maps-inside-jquery-mobile + +some extras +/json/routes = all routes +/json/neareststops?lat/lng/number +TODO +Destinations +Favourites +OOP stops/routes +Stop sorting/search-filter + +static maps +https://code.google.com/apis/maps/documentation/staticmaps/ +http://www.multimap.com/openapidocs/1.2/web_service/staticmaps.htm +http://dev.openstreetmap.de/staticmap/ (os @ http://sourceforge.net/projects/staticmaplite/) +(php and open source @ http://trac.openstreetmap.org/browser/sites/other/StaticMap?rev=16348) +http://pafciu17.dev.openstreetmap.org/ + --- /dev/null +++ b/busui/routeList.php @@ -1,1 +1,90 @@ + + +
+ '; +echo '