Add nearmap overlay
Add nearmap overlay

file:b/OpenStreetMap.js (new)
  /**
  * 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>
  */
  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>
  */
  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>
  */
  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>
  */
  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"
  });
 
<html xmlns="http://www.w3.org/1999/xhtml"> <html xmlns="http://www.w3.org/1999/xhtml">
<head> <head>
<script type="text/javascript" src="http://loki.com/plugin/files/loki.js"></script> <script type="text/javascript" src="http://loki.com/plugin/files/loki.js"></script>
<script src="openlayers/OpenLayers.js"></script> <script src="openlayers/OpenLayers.js"></script>
  <SCRIPT TYPE="text/javascript" SRC="OpenStreetMap.js"></SCRIPT>
<script type="text/javascript"> <script type="text/javascript">
var map, layer; var map, layer;
   
function aaa(a) function aaa(a)
{ {
var lonLat = new OpenLayers.LonLat(a.coords.longitude, a.coords.latitude).transform(new OpenLayers.Projection("EPSG:4326"), var lonLat = new OpenLayers.LonLat(a.coords.longitude, a.coords.latitude).transform(new OpenLayers.Projection("EPSG:4326"),
map.getProjectionObject()); map.getProjectionObject());
map.setCenter(lonLat, 13); map.setCenter(lonLat, 13);
   
} }
   
function handleError(a) function handleError(a)
{ {
alert("error in geoloc"); alert("error in geoloc");
} }
   
function init() function init()
{ {
var extent = new OpenLayers.Bounds(148.98, -35.48, 149.25, -35.15); var extent = new OpenLayers.Bounds(148.98, -35.48, 149.25, -35.15);
map = new OpenLayers.Map('map');  
layer = new OpenLayers.Layer.OSM("local", "http://10.0.1.153/tiles/${z}/${x}/${y}.png"); // set up the map options
  var options =
  {
  maxExtent: extent,
  numZoomLevels: 20,
  };
   
  // create the ol map object
  var map = new OpenLayers.Map('map', options);
   
  layer = new OpenLayers.Layer.OSM("local", "http://10.0.1.153/tiles/${z}/${x}/${y}.png");
map.addLayer(layer); map.addLayer(layer);
  map.addLayer(new OpenLayers.Layer.OSM.NearMap("NearMap"));
var lonLat = new OpenLayers.LonLat(149.11, -35.28).transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject()); var lonLat = new OpenLayers.LonLat(149.11, -35.28).transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject());
map.setCenter(lonLat, 13); map.setCenter(lonLat, 13);
map.addControl( new OpenLayers.Control.LayerSwitcher({'ascending':false})); map.addControl( new OpenLayers.Control.LayerSwitcher({'ascending':false}));
map.addControl(new OpenLayers.Control.MousePosition( map.addControl(new OpenLayers.Control.MousePosition(
{ {
displayProjection: new OpenLayers.Projection("EPSG:4326"), displayProjection: new OpenLayers.Projection("EPSG:4326"),
suffix: "__________________________________" suffix: "__________________________________"
})); }));
map.addControl(new OpenLayers.Control.MousePosition( map.addControl(new OpenLayers.Control.MousePosition(
{ {
displayProjection: new OpenLayers.Projection("EPSG:900913") displayProjection: new OpenLayers.Projection("EPSG:900913")
})); }));
if (navigator.geolocation) if (navigator.geolocation)
{ {
navigator.geolocation.getCurrentPosition(this.aaa, this.handleError); navigator.geolocation.getCurrentPosition(this.aaa, this.handleError);
} }
else else
{ {
var loki = LokiAPI(); var loki = LokiAPI();
loki.onSuccess = function (location) loki.onSuccess = function (location)
{ {
var lonLat = new OpenLayers.LonLat(location.longitude, location.latitude).transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject()); var lonLat = new OpenLayers.LonLat(location.longitude, location.latitude).transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject());
map.setCenter(lonLat, 13); map.setCenter(lonLat, 13);
} }
loki.onFailure = function (error) loki.onFailure = function (error)
{ {
loki.requestIPLocation(true, loki.NO_STREET_ADDRESS_LOOKUP) loki.requestIPLocation(true, loki.NO_STREET_ADDRESS_LOOKUP)
} }
loki.setKey('maxious.lambdacomplex.org'); loki.setKey('maxious.lambdacomplex.org');
loki.requestLocation(true, loki.NO_STREET_ADDRESS_LOOKUP); loki.requestLocation(true, loki.NO_STREET_ADDRESS_LOOKUP);
} }
map.addLayer(new OpenLayers.Layer.GML("KML", "displayroutes.kml.php", { map.addLayer(new OpenLayers.Layer.GML("KML", "displayroutes.kml.php", {
format: OpenLayers.Format.KML, format: OpenLayers.Format.KML,
formatOptions: { formatOptions: {
extractStyles: true, extractStyles: true,
extractAttributes: true, extractAttributes: true,
maxDepth: 2 maxDepth: 2
} }
})); }));
map.addLayer(new OpenLayers.Layer.Vector("KML", { map.addLayer(new OpenLayers.Layer.Vector("KML", {
projection: map.displayProjection, projection: map.displayProjection,
strategies: [new OpenLayers.Strategy.Fixed()], strategies: [new OpenLayers.Strategy.Fixed()],
protocol: new OpenLayers.Protocol.HTTP( protocol: new OpenLayers.Protocol.HTTP(
{ {
url: "displaystops.kml.php", url: "displaystops.kml.php",
format: new OpenLayers.Format.KML( format: new OpenLayers.Format.KML(
{ {
extractStyles: true, extractStyles: true,
extractAttributes: true extractAttributes: true
}) })
}) })
})); }));
} }
</script> </script>
   
</head> </head>
<body onload="init()"> <body onload="init()">
<div id="map" width="100%" height="100%" class="smallmap"></div> <div id="map" width="100%" height="100%" class="smallmap"></div>
</body> </body>
</html> </html>
   
   
  require 'rubygems'
  require 'nokogiri'
  require 'open-uri'
  require 'pp'
 
  def makeTimetable(table, period, short_name)
  timetable = {"stop_times" => [], "between_stops" => [], "short_name" => short_name}
  time_points = table.xpath('tr[1]//th').map do |tp|
  if tp.content != "\302\240" && tp.content != "" && tp.content != "<br/>"
  timing_point = tp.content.squeeze(" ").gsub("\r\n Platform"," - Platform").gsub(" - "," - ").gsub("\n","").gsub("\r","").gsub("\\"," / ").strip
  end
  end
  time_points.delete(nil)
  timetable["time_points"] = time_points
  timetable["long_name"] = "To " + time_points.last
  periodtimes = []
  table.css('tr').each do |row|
  times = row.css('td').map do |cell|
  #TODO convert to GTFS time ie. replace " AM" with a
  time = cell.content.squeeze(" ").strip
  end
  if not times.empty?
  if not (route = times.shift)
  raise("TODO: account for shifting route numbers eg. intertown/redex 62/162")
  end
  periodtimes << times
  end
  end
  if periodtimes.size < 1
  raise "No times for route " + short_name + " in period " + period
  end
  timetable["stop_times"] = { period => periodtimes }
  # pp timetable
  filename = timetable["short_name"] + "-" + timetable["long_name"].downcase.gsub(" ","-").gsub("/","") + "." + period + ".yml"
  puts "Saving " + filename
  File.open("#{File.dirname(__FILE__)}/output/"+filename, "w") do |f|
  f.write timetable.to_yaml
  end
  timetable
  end
 
  #TODO fix route 934
  Dir.glob("source-html/Route*.htm*") { |file|
  puts "Opened " + file
  doc = Nokogiri::HTML(open(file))
  # Search for nodes by css
  timetables = []
  short_name = "";
  doc.xpath('//title').each do |title|
  short_name = title.content.gsub("Route_","").gsub("Route ","").squeeze(" ").strip
  end
  if short_name == ""
  raise "Route number(s) not found in <title> tag"
  end
 
  doc.xpath('//table[preceding::text()="Weekdays"]').each do |table|
  timetables << makeTimetable(table, "weekday", short_name)
  end
 
  #weekends
  doc.xpath('//table[preceding::text()="Saturdays" and following::a]').each do |table|
  timetables << makeTimetable(table, "saturday", short_name)
  end
  doc.xpath('//table[preceding::text()="Sundays"]').each do |table|
  timetables << makeTimetable(table, "sunday", short_name)
  end
  #930/934 special cases
  doc.xpath('//table[preceding::text()="Saturday" and following::h2]').each do |table|
  timetables << makeTimetable(table, "saturday", short_name)
  end
  doc.xpath('//table[preceding::text()="Sunday"]').each do |table|
  timetables << makeTimetable(table, "sunday", short_name)
  end
  #route 81 = Weekdays - School Holidays Only
  doc.xpath('//table[preceding::text()="Weekdays - School Holidays Only "]').each do |table|
  timetable = makeTimetable(table, "weekday", short_name)
  #TODO set active date range to only be holidays
  timetables << timetable;
  end
 
 
  if timetables.size > 2
  puts "WARNING: " + file + " more than 2 timetables (weekend split?):" + timetables.size.to_s
  end
  if timetables.size < 2
  puts "WARNING: " + file + " less than 2 timetables (weekday loop service?):" + timetables.size.to_s
  elsif not (timetables[0]["time_points"] - timetables[1]["time_points"].reverse).empty?
  puts "WARNING: first pair of timetable timing points are not complementary for "+ file
  pp(timetables[0]["time_points"] - timetables[1]["time_points"].reverse)
  end
  if timetables.size < 1
  raise "No timetables extracted from " + file
  end
  }
 
  require 'rubygems'
  require 'pp'
  require 'yaml'
  Dir.chdir("output")
 
  def getTimePoints()
  $time_points = []
  $time_points_sources = Hash.new([])
  Dir.glob("*.yml") { |file|
  timetable = YAML::load_file(file)
  $time_points = $time_points | timetable["time_points"]
  timetable["time_points"].each do |timepoint|
  $time_points_sources[timepoint] = $time_points_sources[timepoint] | [ file ]
  end
  }
  end
 
  getTimePoints()
  pp $time_points.sort!
  #pp $time_points_sources.sort
 
  time_point_corrections = {"North Lynehamham" => "North Lyneham",
  "Lathlain St Platform 2" => "Lathlain St Bus Station - Platform 2",
  "Lathlain St Sation - Platform 5" => "Lathlain St Bus Station - Platform 5",
  "Lathlain Steet Station" => "Lathlain St Bus Station",
  "Lathlain St - Platform 3" => "Lathlain St Bus Station