From: maxious Date: Tue, 04 May 2010 13:48:53 +0000 Subject: Super street corner locator! X-Git-Url: http://maxious.lambdacomplex.org/git/?p=bus.git&a=commitdiff&h=b5faea57b658d8456618cb558dda9bb9b0276cab --- Super street corner locator! --- --- /dev/null +++ b/OpenStreetMap.js @@ -1,1 +1,165 @@ +/** + * Namespace: Util.OSM + */ +OpenLayers.Util.OSM = {}; +/** + * Constant: MISSING_TILE_URL + * {String} URL of image to display for missing tiles + */ +OpenLayers.Util.OSM.MISSING_TILE_URL = "/404.php"; + +/** + * Property: originalOnImageLoadError + * {Function} Original onImageLoadError function. + */ +OpenLayers.Util.OSM.originalOnImageLoadError = OpenLayers.Util.onImageLoadError; + +/** + * Function: onImageLoadError + */ +OpenLayers.Util.onImageLoadError = function() { + if (this.src.match(/^http:\/\/[abc]\.[a-z]+\.openstreetmap\.org\//)) { + this.src = OpenLayers.Util.OSM.MISSING_TILE_URL; + } else if (this.src.match(/^http:\/\/[def]\.tah\.openstreetmap\.org\//)) { + // do nothing - this layer is transparent + } else { + OpenLayers.Util.OSM.originalOnImageLoadError; + } +}; + +/** + * Class: OpenLayers.Layer.OSM.Mapnik + * + * Inherits from: + * - + */ +OpenLayers.Layer.OSM.Mapnik = OpenLayers.Class(OpenLayers.Layer.OSM, { + /** + * Constructor: OpenLayers.Layer.OSM.Mapnik + * + * Parameters: + * name - {String} + * options - {Object} Hashtable of extra options to tag onto the layer + */ + initialize: function(name, options) { + var url = [ + "http://a.tiles.bigtincan.com/${z}/${x}/${y}.png", + "http://b.tiles.bigtincan.com/${z}/${x}/${y}.png", + "http://c.tiles.bigtincan.com/${z}/${x}/${y}.png" + ]; + options = OpenLayers.Util.extend({ numZoomLevels: 19 }, options); + var newArguments = [name, url, options]; + OpenLayers.Layer.OSM.prototype.initialize.apply(this, newArguments); + }, + + CLASS_NAME: "OpenLayers.Layer.OSM.Mapnik" +}); + +OpenLayers.Layer.OSM.NearMap = OpenLayers.Class(OpenLayers.Layer.OSM, { + /** + * Constructor: OpenLayers.Layer.OSM.Mapnik + * + * Parameters: + * name - {String} + * options - {Object} Hashtable of extra options to tag onto the layer + */ + initialize: function(name, options) { + var url = [ + "http://nearmap:findreality@web0.nearmap.com/maps/hl=en&nml=Vert&x=${x}&y=${y}&z=${z}", + "http://nearmap:findreality@web1.nearmap.com/maps/hl=en&nml=Vert&x=${x}&y=${y}&z=${z}", + "http://nearmap:findreality@web2.nearmap.com/maps/hl=en&nml=Vert&x=${x}&y=${y}&z=${z}", + "http://nearmap:findreality@web3.nearmap.com/maps/hl=en&nml=Vert&x=${x}&y=${y}&z=${z}" + ]; + options = OpenLayers.Util.extend({ numZoomLevels: 22 }, options); + var newArguments = [name, url, options]; + OpenLayers.Layer.OSM.prototype.initialize.apply(this, newArguments); + }, + + CLASS_NAME: "OpenLayers.Layer.OSM.NearMap" +}); + +/** + * Class: OpenLayers.Layer.OSM.Osmarender + * + * Inherits from: + * - + */ +OpenLayers.Layer.OSM.Osmarender = OpenLayers.Class(OpenLayers.Layer.OSM, { + /** + * Constructor: OpenLayers.Layer.OSM.Osmarender + * + * Parameters: + * name - {String} + * options - {Object} Hashtable of extra options to tag onto the layer + */ + initialize: function(name, options) { + var url = [ + "http://a.tah.openstreetmap.org/Tiles/tile/${z}/${x}/${y}.png", + "http://b.tah.openstreetmap.org/Tiles/tile/${z}/${x}/${y}.png", + "http://c.tah.openstreetmap.org/Tiles/tile/${z}/${x}/${y}.png" + ]; + options = OpenLayers.Util.extend({ numZoomLevels: 18 }, options); + var newArguments = [name, url, options]; + OpenLayers.Layer.OSM.prototype.initialize.apply(this, newArguments); + }, + + CLASS_NAME: "OpenLayers.Layer.OSM.Osmarender" +}); + +/** + * Class: OpenLayers.Layer.OSM.CycleMap + * + * Inherits from: + * - + */ +OpenLayers.Layer.OSM.CycleMap = OpenLayers.Class(OpenLayers.Layer.OSM, { + /** + * Constructor: OpenLayers.Layer.OSM.CycleMap + * + * Parameters: + * name - {String} + * options - {Object} Hashtable of extra options to tag onto the layer + */ + initialize: function(name, options) { + var url = [ + "http://a.andy.sandbox.cloudmade.com/tiles/cycle/${z}/${x}/${y}.png", + "http://b.andy.sandbox.cloudmade.com/tiles/cycle/${z}/${x}/${y}.png", + "http://c.andy.sandbox.cloudmade.com/tiles/cycle/${z}/${x}/${y}.png" + ]; + options = OpenLayers.Util.extend({ numZoomLevels: 19 }, options); + var newArguments = [name, url, options]; + OpenLayers.Layer.OSM.prototype.initialize.apply(this, newArguments); + }, + + CLASS_NAME: "OpenLayers.Layer.OSM.CycleMap" +}); + +/** + * Class: OpenLayers.Layer.OSM.Maplint + * + * Inherits from: + * - + */ +OpenLayers.Layer.OSM.Maplint = OpenLayers.Class(OpenLayers.Layer.OSM, { + /** + * Constructor: OpenLayers.Layer.OSM.Maplint + * + * Parameters: + * name - {String} + * options - {Object} Hashtable of extra options to tag onto the layer + */ + initialize: function(name, options) { + var url = [ + "http://d.tah.openstreetmap.org/Tiles/maplint/${z}/${x}/${y}.png", + "http://e.tah.openstreetmap.org/Tiles/maplint/${z}/${x}/${y}.png", + "http://f.tah.openstreetmap.org/Tiles/maplint/${z}/${x}/${y}.png" + ]; + options = OpenLayers.Util.extend({ numZoomLevels: 18, isBaseLayer: false, visibility: false }, options); + var newArguments = [name, url, options]; + OpenLayers.Layer.OSM.prototype.initialize.apply(this, newArguments); + }, + + CLASS_NAME: "OpenLayers.Layer.OSM.Maplint" +}); + --- a/display.php +++ b/display.php @@ -1,29 +1,50 @@ - + --- /dev/null +++ b/displaystops.georss.php @@ -1,1 +1,43 @@ + +Bus Stops from OSM'; +$conn = pg_connect("dbname=openstreetmap user=postgres password=snmc"); +if (!$conn) { + echo "An error occured.\n"; + exit; +} +/*SELECT * from current_node_tags, (Select id FROM current_node_tags WHERE "v" LIKE '%bus%') as a +where a.id = current_node_tags.id; */ +$result_stops = pg_query($conn, "Select * FROM current_node_tags INNER JOIN current_nodes ON +current_node_tags.id=current_nodes.id WHERE v LIKE '%bus%' "); +if (!$result_stops) { + echo "An stops retirieve error occured.\n"; + exit; +} + +while ($stop = pg_fetch_assoc($result_stops)) { + echo "\n\n"; + echo ""; +$result_stopkeys = pg_query($conn, "SELECT * from current_node_tags where id = {$stop['id']};"); +if (!$result_stopkeys) { + echo "An stops keys retirieve error occured.\n"; + exit; +} +$name = ""; +while ($stopkeys = pg_fetch_assoc($result_stopkeys)) { +echo htmlspecialchars(print_r($stopkeys,true)); +$name .= htmlspecialchars($stopkeys['v']); +} +echo ""; + echo "$name"; + +echo " ";echo ($stop['latitude']/10000000)." ".($stop['longitude']/10000000); +echo " "; +echo ''; +} + +echo "\n\n"; +?> --- a/displaystops.kml.php +++ /dev/null @@ -1,58 +1,1 @@ - -'; -echo ''; -echo ''; -$conn = pg_connect("dbname=openstreetmap user=postgres password=snmc"); -if (!$conn) { - echo "An error occured.\n"; - exit; -} -/*SELECT * from current_node_tags, (Select id FROM current_node_tags WHERE "v" LIKE '%bus%') as a -where a.id = current_node_tags.id; */ -$result_stops = pg_query($conn, "Select * FROM current_node_tags INNER JOIN current_nodes ON -current_node_tags.id=current_nodes.id WHERE v LIKE '%bus%' "); -if (!$result_stops) { - echo "An stops retirieve error occured.\n"; - exit; -} - -while ($stop = pg_fetch_assoc($result_stops)) { - echo "\n\n"; - echo ""; -$result_stopkeys = pg_query($conn, "SELECT * from current_node_tags where id = {$stop['id']};"); -if (!$result_stopkeys) { - echo "An stops keys retirieve error occured.\n"; - exit; -} -$name = ""; -while ($stopkeys = pg_fetch_assoc($result_stopkeys)) { -echo htmlspecialchars(print_r($stopkeys,true)); -$name .= htmlspecialchars($stopkeys['v']); -} -echo ""; - echo "$name"; - -echo "#target"; -echo "\n "; - echo ($stop['longitude']/10000000).",".($stop['latitude']/10000000)."\n"; -echo " "; -echo ''; -} - -echo "\n\n"; -?> --- /dev/null +++ b/displaytimepoints.georss.php @@ -1,1 +1,26 @@ + '; +echo ' Points'; +$conn = pg_connect("dbname=bus user=postgres password=snmc"); +if (!$conn) { + echo "An error occured.\n"; + exit; +} +$result_timepoints = pg_query($conn, "Select * FROM timing_point where lat is not null and lng is not null "); +if (!$result_timepoints) { + echo "An timepoints retirieve error occured.\n"; + exit; +} + +while ($timepoint = pg_fetch_assoc($result_timepoints)) { + echo ""; + echo "".htmlspecialchars ($timepoint['name']).""; + echo "".htmlspecialchars($timepoint['name']).""; +echo " ".($timepoint['lat']/10000000)." ".($timepoint['lng']/10000000).""; +echo "\n"; +} + +echo "\n\n"; +?> --- a/displaytimepoints.kml.php +++ /dev/null @@ -1,58 +1,1 @@ - -'; -echo ''; -echo ''; -$conn = pg_connect("dbname=openstreetmap user=postgres password=snmc"); -if (!$conn) { - echo "An error occured.\n"; - exit; -} -/*SELECT * from current_node_tags, (Select id FROM current_node_tags WHERE "v" LIKE '%bus%') as a -where a.id = current_node_tags.id; */ -$result_stops = pg_query($conn, "Select * FROM current_node_tags INNER JOIN current_nodes ON -current_node_tags.id=current_nodes.id WHERE v LIKE '%bus%' "); -if (!$result_stops) { - echo "An stops retirieve error occured.\n"; - exit; -} - -while ($stop = pg_fetch_assoc($result_stops)) { - echo "\n\n"; - echo ""; -$result_stopkeys = pg_query($conn, "SELECT * from current_node_tags where id = {$stop['id']};"); -if (!$result_stopkeys) { - echo "An stops keys retirieve error occured.\n"; - exit; -} -$name = ""; -while ($stopkeys = pg_fetch_assoc($result_stopkeys)) { -echo htmlspecialchars(print_r($stopkeys,true)); -$name .= htmlspecialchars($stopkeys['v']); -} -echo ""; - echo "$name"; - -echo "#target"; -echo "\n "; - echo ($stop['longitude']/10000000).",".($stop['latitude']/10000000)."\n"; -echo " "; -echo ''; -} - -echo "\n\n"; -?> --- a/maxious-canberra-transit-feed/02-tidytimepoints.rb +++ b/maxious-canberra-transit-feed/02-tidytimepoints.rb @@ -62,8 +62,12 @@ "Cameron Ave Station - Platform 5" => "Cameron Ave Bus Station - Platform 5", "Burton & Garranan Hall, Daley Road ANU" => "Burton & Garran Hall, Daley Road ANU", "Burton & Garranan Hall,Daley Road ANU" => "Burton & Garran Hall, Daley Road ANU", + "Garran/Daley Rd" => "Burton & Garran Hall, Daley Road ANU", + "Kingstons Ave/National Crt" => "Kings Ave/National Crt", "Newcastle Street after Isa St" => "Newcastle / Isa Street Fyshwick", "National Circ/Canberra Ave" => "National Circuit / Canberra Ave", + "St Clare of Conder" => "St Clare of Assisi Primary", + "McKillop College Isabella Campus" => "MacKillop College Isabella Campus", } time_point_corrections.each do |wrong, right| $time_points_sources[wrong].each do |wrongfile| --- a/maxious-canberra-transit-feed/03-locatetimepoints.rb +++ b/maxious-canberra-transit-feed/03-locatetimepoints.rb @@ -3,6 +3,32 @@ require 'highline.rb' include HighLine + +require 'rubygems' +require 'json' +require 'net/http' +def cbr_geocode(query) + base_url = "http://geocoding.cloudmade.com/daa03470bb8740298d4b10e3f03d63e6/geocoding/v2/find.js?query=" + url = "#{base_url}#{URI.encode(query)}&bbox=-35.47,148.83,-35.16,149.25&return_location=true" + resp = Net::HTTP.get_response(URI.parse(url)) + data = resp.body + + # we convert the returned JSON data to native Ruby + # data structure - a hash + result = JSON.parse(data) + + # if the hash has 'Error' as a key, we raise an error + if result.has_key? 'Error' + raise "web service error" + end + return result +end +class Array + + def find_dups + inject(Hash.new(0)) { |h,e| h[e] += 1; h }.select { |k,v| v > 1 }.collect { |x| x.first } + end +end require 'yaml' require 'pp' @@ -31,7 +57,7 @@ if ask_if("Insert Timing Point names to database?") $time_points.each do |time_point| begin - time_point = time_point.gsub(/\\/, '\&\&').gsub(/'/, "''") + time_point = time_point.gsub(/\\/, '\&\&').gsub(/'/, "''").gsub("St", "%") res = connbus.exec("INSERT INTO timing_point (name) VALUES ('#{time_point}')") puts "Put '#{time_point}' into DB" rescue PGError => e @@ -43,6 +69,7 @@ if ask_if("Fill null Timing Points from OSM bus_stop database?") +# TODO Where there's a "Cnr" or a \/ or a &, Look for 2 ways or nodes and average the closest two! begin null_points = connbus.exec('SELECT name FROM timing_point WHERE lat IS null OR lng IS null;') rescue PGError => e @@ -54,8 +81,9 @@ begin name = null_point_name.to_s.gsub(/\\/, '\&\&').gsub(/'/, "''") pp name + search_name = ask("Hmm, if we're still looking, the name is probably wrong. What's the right name?", :string, :default => name) matching_nodes = connosm.exec("Select * FROM (SELECT * from current_node_tags, - (Select id as ctagid FROM current_node_tags WHERE v LIKE '%#{name}%') as a + (Select id as ctagid FROM current_node_tags WHERE v LIKE '%#{search_name}%') as a where a.ctagid = current_node_tags.id) as ctags INNER JOIN current_nodes ON ctags.id=current_nodes.id") rescue PGError => e @@ -99,6 +127,103 @@ else puts "Uhh, there was no suggestion ID like that. Try again next time!" end + + puts "Hmm, so maybe this isn't a point? Maybe it's a way.... like a street or something? Is it a 'street' or a 'corner' or nothing?" + whatisit = ask("So what is it:", :string, :default => "corner") + if whatisit == "street" + begin + name = null_point_name.to_s.gsub(/\\/, '\&\&').gsub(/'/, "''") + pp "#{name} (ways)" + search_name = ask("Streets tend to have pretty bad quality data, What's the real name of the street?", :string, :default => name) + matching_ways = connosm.exec("Select avg(latitude), avg(longitude), name FROM ( + SELECT * from current_way_nodes,(Select id as ctagid, v as name FROM current_way_tags WHERE k = 'name' AND v LIKE + '%#{search_name}%') as a where a.ctagid = current_way_nodes.id) as ctags INNER JOIN current_nodes ON ctags.node_id=current_nodes.id + GROUP BY name") + rescue PGError => e + puts "Error selecting matching ways from DB #{e}" + #conn.close() if conn + end + suggested_ways = Hash.new() + + matching_ways.each do |matching_way_row| + #pp matching_way_row + # 0 = lat*100000 + # 1 = lng*100000 + # 2 = name + suggested_way = suggested_ways.fetch(matching_way_row[2], {'lat' => Float(matching_way_row[0])/10000000, + 'lng' => Float(matching_way_row[1])/10000000}) + suggested_way['name'] = suggested_way['name'] + suggested_ways[matching_way_row[2]] = suggested_way + end + pp suggested_ways + wayID = ask("Enter selected way ID:", :string) + if suggested_ways.has_key?(wayID) + way = suggested_ways.fetch(wayID) + guess = ask_if("Is this a guess?") + puts "Location #{way["lat"]},#{way["lng"]} for #{null_point_name}" + begin + res = connbus.exec("UPDATE timing_point SET lat = #{way["lat"]*10000000}, lng = + #{way["lng"]*10000000},guess = #{guess} WHERE name = '#{name}'") + puts "Put '#{null_point_name}' into DB" + rescue PGError => e + puts "Error inserting '#{null_point_name}' to DB #{e}" + ask_if("Continue?") + #conn.close() if conn + end + else + puts "Uhh, there was no suggestion ID like that. Try again next time!" + end + end + if whatisit == "corner" + # Where there's a "Cnr" or a \/ or a &, look for 2 ways and find the intersections + + name = null_point_name.to_s.gsub(/\\/, '\&\&').gsub(/'/, "''") + search_name = ask("I need this to look like STREETNAME1/STREETNAME2, okay? Can you do that for me?", :string, :default => name) + search_pieces = search_name.split("/") + pp search_pieces + if search_pieces.length == 2 + begin + matching_ways = connosm.exec("SELECT w.way_id, latitude, longitude, w.node_id from (Select current_way_nodes.id as way_id, * from current_nodes inner join current_way_nodes on current_nodes.id=current_way_nodes.node_id inner join current_ways on current_way_nodes.id=current_ways.id) as w, (select node_id, count(node_id) from + (Select * FROM (SELECT * from current_way_nodes, (Select id as ctagid, v as name FROM current_way_tags WHERE k = 'name' AND v LIKE '%#{search_pieces[0]}%') as a where a.ctagid = current_way_nodes.id ) as ctags INNER JOIN current_nodes ON ctags.node_id=current_nodes.id where sequence_id = 1 union Select * FROM ( SELECT * from current_way_nodes, (Select id as ctagid, v as name FROM current_way_tags WHERE k = 'name' AND v LIKE '%#{search_pieces[0]}%') as a where a.ctagid = current_way_nodes.id ) as ctags INNER JOIN current_nodes ON ctags.node_id=current_nodes.id where sequence_id = (select max(sequence_id) from current_way_nodes cnodes where cnodes.id = ctags.id) union Select * FROM ( SELECT * from current_way_nodes, (Select id as ctagid, v as name FROM current_way_tags WHERE k = 'name' AND v LIKE '%#{search_pieces[1]}%') as a where a.ctagid = current_way_nodes.id ) as ctags INNER JOIN current_nodes ON ctags.node_id=current_nodes.id where sequence_id = 1 union Select * FROM ( SELECT * from current_way_nodes, (Select id as ctagid, v as name FROM current_way_tags WHERE k = 'name' AND v LIKE '%#{search_pieces[1]}%') as a where a.ctagid = current_way_nodes.id ) as ctags INNER JOIN current_nodes ON ctags.node_id=current_nodes.id where sequence_id = (select max(sequence_id) from current_way_nodes cnodes where cnodes.id = ctags.id) ) as t GROUP BY node_id HAVING ( COUNT(node_id) > 1 ) ) as s where s.node_id = w.node_id") + rescue PGError => e + puts "Error selecting matching bus stops from DB #{e}" + #conn.close() if conn + end + suggested_ways = Hash.new() + + matching_ways.each do |matching_way_row| + pp matching_way_row + # 0 = way_id + # 1 = lat*100000 + # 2 = lng*100000 + # 3 = node_id + suggested_way = suggested_ways.fetch(matching_way_row[3], {'lat' => Float(matching_way_row[1])/10000000, + 'lng' => Float(matching_way_row[2])/10000000}) + suggested_way['way_id'] = " " + matching_way_row[0] + suggested_way['node_id'] = matching_way_row[3] + suggested_ways[matching_way_row[3]] = suggested_way + end + pp suggested_ways + wayID = ask("Enter selected way ID:", :string) + if suggested_ways.has_key?(wayID) + way = suggested_ways.fetch(wayID) + guess = ask_if("Is this a guess?") + puts "Location #{way["lat"]},#{way["lng"]} for #{null_point_name}" + begin + res = connbus.exec("UPDATE timing_point SET lat = #{way["lat"]*10000000}, lng = + #{way["lng"]*10000000},osm_node = #{wayID} ,guess = #{guess} WHERE name + = '#{name}'") + puts "Put '#{null_point_name}' into DB" + rescue PGError => e + puts "Error inserting '#{null_point_name}' to DB #{e}" + ask_if("Continue?") + #conn.close() if conn + end + else + puts "Uhh, there was no suggestion ID like that. Try again next time!" + end + end + end end end if ask_if("Fill null Timing Points from geocoder?") @@ -111,6 +236,31 @@ null_points.each do |null_point_name| pp null_point_name + name = null_point_name.to_s.gsub(/\\/, '\&\&').gsub(/'/, "''") + results = cbr_geocode(null_point_name[0]) + if !results.empty? + results['features'].each_with_index { |feature,index| + print "#{index}: #{feature['properties']['name']} (#{feature['location']}) => #{feature['centroid']['coordinates']}\n" + } + nodeID = ask("Enter selected node ID:", :integer) + if results['features'].at(nodeID) != nil + node = results['features'][nodeID] + puts "Location #{node['centroid']['coordinates'][0]},#{node['centroid']['coordinates'][1]} for #{null_point_name}" + begin + res = connbus.exec("UPDATE timing_point SET lat = #{node['centroid']['coordinates'][0]*10000000}, lng = + #{node['centroid']['coordinates'][1]*10000000},guess = true WHERE name = '#{name}'") + puts "Put '#{null_point_name}' into DB" + rescue PGError => e + puts "Error inserting '#{null_point_name}' to DB #{e}" + ask_if("Continue?") + #conn.close() if conn + end + else + puts "Uhh, there was no suggestion ID like that. Try again next time!" + end + else + puts "Uhh, there were no geocoding results. Try again next time!" + end end end --- /dev/null +++ b/maxious-canberra-transit-feed/source-html/convertPDFtoPNG.sh @@ -1,1 +1,2 @@ +gs -q -sDEVICE=pngalpha -dBATCH -dNOPAUSE -dFirstPage=1 -dLastPage=1 -r600 -sOutputFile=test.png test.pdf --- a/maxious-canberra-transit-feed/source-html/get.sh +++ b/maxious-canberra-transit-feed/source-html/get.sh @@ -1,4 +1,5 @@ #wget -nd -np -r -I /routes_by_number.html,*25_May* --random-wait -c http://www.action.act.gov.au/routes_by_number.html +wget http://www.action.act.gov.au/interchange_maps.html grep "Page not found" *