Message Boards Message Boards

Create equal time maps for transit network (Isochrones)?

Posted 6 years ago

I am on a committee looking to redesign transit service in Sacramento and need to be able to make equal-time maps or "isochrones," like the attached. A prominent difference between transit isochrones and road isochrones is that each transfer has a temporal penalty. That is, it takes time to wait for the connecting bus. Also, that penalty is lower where the connecting routes are more frequent and higher where the connecting routes are less frequent. Also, some routes only serve stations, while others are considered to have a even distribution of stops along their routes.

(If you are interested in why I want to be able to generate isochrones: I am interested in a hybrid model between frequency and coverage that still creates a high-frequency grid between major traffic generators, but with routes that take different branches between the generators. This offers both frequency and coverage. Currently, the debate is binary, frequency or coverage.)

Thank you very much!!

a transit isochrone showing the amount of time required to reach different regions within the network

POSTED BY: Benjamin Etgen
3 Replies

Hi,

this is far from perfect for a million reasons (and is for road isochrones). I have more efficient code for this, but cannot find it right now.

Let's do this for Aberdeen. Here are the bounds:

bound = {GeoPosition[{57.180933336035885`, -2.033641228304261}, "ITRF00"], GeoPosition[{57.08609085736762, -2.187063761724743}, "ITRF00"]}

Next we make a grid from where we use the travel times to generate the isochrones (here a 20 by 20 grid):

M = 20.; 
grid = 
 Flatten[Table[GeoPosition[{x, y}], 
   Evaluate[
    Append[Prepend[Reverse@bound[[All, 1, 1]], x], 
     Abs[Differences[bound[[All, 1, 1]]]/M][[1]]]], 
   Evaluate[
    Append[Prepend[Reverse@bound[[All, 1, 2]], y], 
     Abs[Differences[bound[[All, 1, 2]]]/M][[1]]]]]];

The following code computes travelling times. It gives error messages because it does not find travel paths for each location.

travellingtimes = # -> 
     QuantityMagnitude[
      UnitConvert[
       TravelTime[
        GeoPosition[
         Entity["City", {"Aberdeen", "AberdeenCity", 
            "UnitedKingdom"}]["Coordinates"]], #], "Seconds"]] & /@ grid;

Let's plot this:

GeoRegionValuePlot[
 Select[travellingtimes, NumberQ[#[[2]]] && #[[2]] < 500 &], 
 ColorFunction -> "TemperatureMap"]

enter image description here

We can then also compute a ContourPlot of this and overlay it (crudely) to the map:

cplot = ListContourPlot[
  Flatten[{Reverse@#[[1, 1]], Min[#[[2]], 500]}] & /@ travellingtimes,
   InterpolationOrder -> 4, Contours -> 80, ContourStyle -> None, 
  ColorFunction -> "TemperatureMap", Frame -> None, 
  ImagePadding -> None, PlotRangeClipping -> None, 
  PlotRangePadding -> None, ImageSize -> Full];

ImageCompose[
 GeoGraphics[
  Polygon[Transpose[
    Reverse@{{57.08609085736762`, 
       57.180933336035885`}, {-2.187063761724743`, -2.033641228304261`}}]], ImageSize -> Full, 
  AspectRatio -> 1.], {cplot, 0.5}]

enter image description here

There are quite some problems here, e.g. over the water. I had two students who used a far superior way of calculating isochrones to optimise the ambulance service in Chicago and another group who used it for advanced geoprofiling taking the escape routes of criminals into consideration.

Cheers,

Marco

PS: This particular code is very inefficient. On can use TravelDirections in a much more efficient way, e.g. using the entire trajectories with all the time stars that are part of the dataset. I just wanted to show the principle, but could post something similar, but more efficient. I also think that the more detailed information might give a way to produce transit times, if for example the waiting times and transition points are known. If data on the transit network is given we might also just use MMA's graph theory tools, I guess. It would indeed be useful to have example data here.

PPS: I don't think that there are bus time table yet, i.e. travel directions would use waiting times for busses etc. There are however, "driving", "walking", "biking" as methods.

POSTED BY: Marco Thiel

A way to construct isochrones would interest me as well – but in my case for early modern postal networks.

enter image description here

POSTED BY: Arno Bosse

data for a small example problem and the expected result would help

POSTED BY: Frank Kampas
Reply to this discussion
Community posts can be styled and formatted using the Markdown syntax.
Reply Preview
Attachments
Remove
or Discard

Group Abstract Group Abstract