├── LICENSE ├── README.md ├── aidstations.dbf ├── aidstations.prj ├── aidstations.shp ├── aidstations.shx ├── bashcommands.sh ├── index.md ├── loaddata.sh ├── loadresults.sql ├── preraceprep.sql ├── sht_dem25m.tif ├── sqlcommands.sql ├── superior.sql.gz ├── superior100.cpg ├── superior100.dbf ├── superior100.prj ├── superior100.shp ├── superior100.shx ├── superior100_points.cpg ├── superior100_points.dbf ├── superior100_points.prj ├── superior100_points.shp ├── superior100_points.shx ├── superiorresults.csv ├── testworkshop.txt └── workshop.sh /LICENSE: -------------------------------------------------------------------------------- 1 | This is free and unencumbered software released into the public domain. 2 | 3 | Anyone is free to copy, modify, publish, use, compile, sell, or 4 | distribute this software, either in source code form or as a compiled 5 | binary, for any purpose, commercial or non-commercial, and by any 6 | means. 7 | 8 | In jurisdictions that recognize copyright laws, the author or authors 9 | of this software dedicate any and all copyright interest in the 10 | software to the public domain. We make this dedication for the benefit 11 | of the public at large and to the detriment of our heirs and 12 | successors. We intend this dedication to be an overt act of 13 | relinquishment in perpetuity of all present and future rights to this 14 | software under copyright law. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 | IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 | OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | 24 | For more information, please refer to 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Breaking the 4th dimension: working with time in PostgreSQL and PostGIS 2 | ## Workshop Delivered at ![FOSS4G](http://2017.foss4g.org/images/square_color_100x100.png) 3 | ### David Bitner dbitner@boundlessgeo.com 4 | Senior Development Engineer - Boundless Spatial ![](https://boundlessgeo.com/wp-content/themes/boundlessgeo/assets/images/BoundlessLogoTag.svg) 5 | --- 6 | Workshop contents are available in index.md 7 | 8 | To auto run all the commands in the workshop 9 | 10 | ``` 11 | bash workshop.sh 12 | ``` 13 | 14 | Will extract all the bash scripts and run them followed by all the SQL. -------------------------------------------------------------------------------- /aidstations.dbf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitner/postgis_temporal_workshop/29f40051d577f1b2f3a1439b236245e890ca55df/aidstations.dbf -------------------------------------------------------------------------------- /aidstations.prj: -------------------------------------------------------------------------------- 1 | PROJCS["NAD_1983_UTM_Zone_15N",GEOGCS["GCS_North_American_1983",DATUM["D_North_American_1983",SPHEROID["GRS_1980",6378137,298.257222101]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-93],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["Meter",1]] -------------------------------------------------------------------------------- /aidstations.shp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitner/postgis_temporal_workshop/29f40051d577f1b2f3a1439b236245e890ca55df/aidstations.shp -------------------------------------------------------------------------------- /aidstations.shx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitner/postgis_temporal_workshop/29f40051d577f1b2f3a1439b236245e890ca55df/aidstations.shx -------------------------------------------------------------------------------- /bashcommands.sh: -------------------------------------------------------------------------------- 1 | createdb superior 2 | export PGDATABASE=superior 3 | psql -c "CREATE EXTENSION postgis;" superior 4 | psql -c "SELECT postgis_full_version();" superior 5 | shp2pgsql -I -s 26915 -D -t 2D superior100.shp superior100 | psql superior 6 | raster2pgsql -I -Y -C -s 26915 -t 100x100 sht_dem25m.tif dem | psql superior 7 | shp2pgsql -s 26915 -D -I aidstations.shp aidstations | psql superior 8 | psql -a -f loadresults.sql superior 9 | -------------------------------------------------------------------------------- /index.md: -------------------------------------------------------------------------------- 1 | # Breaking the 4th dimension: working with time in PostgreSQL and PostGIS 2 | --- 3 | 4 | --- 5 | ### David Bitner dbitner@boundlessgeo.com 6 | Senior Development Engineer - Boundless Spatial 7 |

8 | 9 | --- 10 | 11 | The goal of this workshop is to walk through several examples of how to use 3rd and 4th dimension data with PostgreSQL and PostGIS with a particular emphasis on using M values with points and linestrings. 12 | 13 | --- 14 | 15 | 16 | 17 | I have a bad habit of entering events where you go to really pretty places to run really far. In just a couple weeks I'll be making my first attempt to run 100 miles on the Superior Hiking Trail overlooking Lake Superior in Northern Minnesota. For the rest of this workshop, we'll use available data from previous years of this race to help setup a pace chart and create tools for my crew to help follow me during the event. 18 | 19 | --- 20 | # Agenda 21 | * Setup 22 | * Time Basics 23 | * Elevation, Points<->Lines 24 | * Tracks 25 | --- 26 | # Setup 27 | ```bash 28 | createdb superior 29 | export PGDATABASE=superior 30 | psql -c "CREATE EXTENSION postgis;" superior 31 | psql -c "SELECT postgis_full_version();" superior 32 | ``` 33 | --- 34 | ## PostgreSQL Date / Time Datatypes and Functions 35 | * https://www.postgresql.org/docs/9.6/static/datatype-datetime.html 36 | * https://www.postgresql.org/docs/9.6/static/functions-datetime.html 37 | * https://www.postgresql.org/docs/9.6/static/functions-formatting.html 38 | 39 | 40 | PostgreSQL has very extensive support for temporal data using the Timestamp, TimestampTZ, Date, Time, TimeTZ, and Interval data types. PostgreSQL is very forgiving as to how data can be input as plain text. 41 | 42 | It should be noted that in almost all cases it is better to use the Time Zone aware TimestampTZ and TimeTZ data types as the non timezone aware Timestamp and Time can be lossy and ambiguous in most circumstances. 43 | 44 | Further, while PostgreSQL is incredibly tolerant of text data input formats, ISO8601 should be the preferred method for communicating with dates and times. Day/month/year and month/day/year can be particularly problematic as they are each preferred in different parts of the world. 45 | 46 | 47 | --- 48 | 49 | --- 50 | ### Exercise: Convert different text formats into timestamps 51 | 52 | ```sql 53 | SELECT '2017-01-01 00:00-6'::timestamptz; 54 | 55 | SELECT '2017-01-01'::timestamptz; 56 | 57 | SELECT '4/5/2017'::timestamptz; 58 | ``` 59 | --- 60 | 61 | Day/month/year and month/day/year can be particularly problematic as they are each preferred in different parts of the world. 62 | 63 | 64 | ### Exercise: Use session settings to control Timestamp in/out 65 | 66 | ```sql 67 | SET datestyle to dmy; 68 | SELECT '4/5/2017'::timestamptz; 69 | 70 | SET datestyle TO DEFAULT; 71 | SELECT '4/5/2017'::timestamptz; 72 | ``` 73 | --- 74 | 75 | By using the TimestampTZ data type it becomes easy to view the data in whatever locality is necessary at the moment. 76 | 77 | 78 | ### Exercise: Use session settings to control Timezone in/out 79 | 80 | ```sql 81 | SELECT now(); 82 | 83 | SET TIME ZONE 'Europe/Rome'; 84 | SELECT now(); 85 | 86 | SET TIME ZONE 'UTC'; 87 | SELECT now(); 88 | 89 | SET TIME ZONE 'PST8PDT'; 90 | SELECT now(); 91 | 92 | SET TIME ZONE DEFAULT; 93 | SHOW TIME ZONE; 94 | SELECT now(); 95 | 96 | SELECT timezone('UTC', now()); 97 | 98 | SELECT now() AT TIME ZONE 'America/Chicago'; 99 | ``` 100 | --- 101 | 102 | PostgreSQL also has an interval type that can maintain periods of time 103 | 104 | 105 | ```sql 106 | SELECT '1 day'::interval; 107 | SELECT '2016-01-01'::timestamptz + '3 months'::interval; 108 | ``` 109 | --- 110 | 111 | When no proper Time Data Types are available, one convenient way of dealing with time is to use Unix Epoch time. This is the number of seconds since the start of the Unix Epoch (1979-01-01). We will see later that using Unix Epoch can be very handy when we start to look at PostGIS Linear Referencing. 112 | 113 | 114 | ## Exercise: Convert between Time Data Types and Epoch Seconds 115 | 116 | ```sql 117 | SELECT to_timestamp(0); 118 | 119 | SELECT timezone('UTC',to_timestamp(0)); 120 | 121 | SELECT extract(epoch from '2017-01-01'::timestamptz); 122 | 123 | SELECT extract(epoch from '1 hour'::interval); 124 | ``` 125 | --- 126 | 127 | For convenience sake if you are doing this conversion frequently, PostgreSQL makes creating your own functions very easy. Let's create custom functions for converting Intervals and TimestampTZ into Epochs. 128 | 129 | 130 | ## Exercise: Create custom functions for converting to Unix Epoch 131 | 132 | ```sql 133 | CREATE OR REPLACE FUNCTION to_epoch(IN timestamptz, OUT float8) AS $$ 134 | SELECT extract(epoch from $1); 135 | $$ LANGUAGE SQL; 136 | 137 | CREATE OR REPLACE FUNCTION to_epoch(IN interval, OUT float8) AS $$ 138 | SELECT extract(epoch from $1); 139 | $$ LANGUAGE SQL; 140 | 141 | SELECT to_epoch('2017-01-01'::timestamptz); 142 | SELECT to_epoch('1 hour'::interval); 143 | ``` 144 | --- 145 | 146 | It can be very convenient to also be able to "round" time. 147 | 148 | 149 | ## Exercise: Truncate timestamps. 150 | ```sql 151 | SELECT date_trunc('month', now()); 152 | SELECT date_trunc('month', now()) + '1 month'::interval; 153 | ``` 154 | 155 | --- 156 | ## Exercise: Load Superior 100 Race Course 157 | ```bash 158 | shp2pgsql -I -s 26915 -D -t 2D superior100.shp superior100 | psql superior 159 | ``` 160 | ```sql 161 | SELECT id, substring(st_asewkt(geom),0,100) FROM superior100; 162 | ``` 163 | --- 164 | Let's take a look at this track by blowing it up into the component points. [ST_DumpPoints](https://postgis.net/docs/ST_DumpPoints.html) is a Set Returning Function that returns a record data type. In order to access the columns in the record, you'll notice that we must wrap the column that contains the record in parentheses. 165 | 166 | ## Exercise: Show first 10 points of track 167 | ```sql 168 | SELECT st_dumppoints(geom) FROM superior100 limit 10; 169 | SELECT (st_dumppoints(geom)).* FROM superior100 limit 10; 170 | ``` 171 | --- 172 | ## Exercise: Now let's do that in a more useful way 173 | ```sql 174 | WITH t AS (SELECT st_dumppoints(geom) as dump FROM superior100) 175 | SELECT 176 | (dump).path[2], 177 | st_asewkt((dump).geom), 178 | st_x((dump).geom), 179 | st_y((dump).geom) 180 | FROM t 181 | LIMIT 10; 182 | ``` 183 | --- 184 | ## Exercise Create a table with all the points from the track 185 | ```sql 186 | CREATE TABLE superior100_points AS 187 | WITH t AS (SELECT st_dumppoints(geom) as dump FROM superior100) 188 | SELECT 189 | (dump).path[2], 190 | (dump).geom, 191 | st_x((dump).geom) as x, 192 | st_y((dump).geom) as y 193 | FROM t; 194 | ``` 195 | --- 196 | ## Exercise Add an elevation to our table of track points 197 | Load a dem into PostGIS Raster 198 | ```bash 199 | raster2pgsql -I -Y -C -s 26915 -t 100x100 sht_dem25m.tif dem | psql superior 200 | ``` 201 | Use [st_value](https://postgis.net/docs/RT_ST_Value.html) to assign the elevation for each point. 202 | ```sql 203 | ALTER TABLE superior100_points ADD COLUMN z float8; 204 | 205 | UPDATE superior100_points 206 | SET 207 | z=st_value(rast,geom) 208 | FROM dem 209 | WHERE st_intersects(dem.rast,geom); 210 | ``` 211 | --- 212 | 213 | In that exercise we just add the value to a z column, now we need to actually add that to the point. We can do that using the [st_makepoint](https://postgis.net/docs/ST_MakePoint.html) function. Note that this function returns a point without projection information which we need to add using [st_setsrid](https://postgis.net/docs/ST_SetSRID.html). 214 | 215 | ## Exercise: Add this new dimension to our point geometries 216 | ```sql 217 | SELECT st_asewkt(geom), x, y, z FROM superior100_points LIMIT 10; 218 | 219 | UPDATE superior100_points 220 | SET geom = st_setsrid(st_makepoint(x,y,z), 26915); 221 | 222 | SELECT st_asewkt(geom) FROM superior100_points LIMIT 10; 223 | ``` 224 | --- 225 | 226 | Now that we have added the third dimension to our points, we want to be able to convert that back into a line. 227 | We can do that using the [st_makeline](https://postgis.net/docs/ST_MakeLine.html) function which can act as an aggregate for a set of points. 228 | 229 | ## Exercise: Reassemble points into a line. 230 | ```sql 231 | WITH t AS (SELECT * FROM superior100_points ORDER BY PATH) 232 | SELECT substring(st_asewkt(st_makeline(geom)),1,100) FROM t; 233 | ``` 234 | --- 235 | ## Exercise: Let's save the 3d line into a new table 236 | ```sql 237 | CREATE TABLE superior1003d AS 238 | WITH t AS (SELECT * FROM superior100_points ORDER BY PATH) 239 | SELECT st_makeline(geom) as geom FROM t; 240 | ``` 241 | --- 242 | 243 | Now that we have our data as a set of ordered points, using [Window Functions](https://www.postgresql.org/docs/9.6/static/tutorial-window.html) we can start to have fun and extract useful information about what is happening along our track. In trail running, it is very useful to understand what the terrain is like by understanding what the elevation gain and loss is. We'll use the elevation data that we created to figure out how much climbing and descending there is along this trail. 244 | 245 | ## Exercise: Look at the elevation change between each segment 246 | ```sql 247 | SELECT path, x, y, z, z-lag(z) OVER (ORDER BY PATH) 248 | FROM superior100_points LIMIT 20; 249 | ``` 250 | --- 251 | ## Exercise: Add this elevation change to our table 252 | ```sql 253 | ALTER TABLE superior100_points ADD COLUMN elchange float8; 254 | 255 | WITH t AS (SELECT path, x, y, z, 256 | round((z-lag(z) OVER (ORDER BY PATH))::numeric,1) elchange 257 | FROM superior100_points) 258 | UPDATE superior100_points p SET elchange=t.elchange 259 | FROM t WHERE p.path=t.path; 260 | 261 | SELECT x, y, z, elchange FROM superior100_points limit 10; 262 | ``` 263 | --- 264 | 265 | Now that we have the change per segment we can see how much total climbing and descending there is. 266 | 267 | ## Exercise: Calculate overall elevation change 268 | ```sql 269 | SELECT 270 | 3.28 * sum(elchange) FILTER (WHERE elchange>0) as gain, 271 | 3.28 * sum(elchange) FILTER (WHERE elchange<0) as descent 272 | FROM superior100_points; 273 | ``` 274 | --- 275 | 276 | We can also do interesting things like calculate the direction between points using [st_azimuth](http://www.postgis.org/docs/ST_Azimuth.html). This can be especially useful if you are trying to create animations that show things like a plane icon pointing in the right direction. Note this function returns the direction in radians that we have to convert to degrees. 277 | 278 | ## Exercise: Calculate the direction of each segment 279 | ```sql 280 | SELECT path, x, y, z, 281 | degrees(st_azimuth(lag(geom) OVER (ORDER BY path), geom)) 282 | FROM superior100_points LIMIT 20; 283 | ``` 284 | --- 285 | 286 | PostGIS has the ability to calculate lengths and distances taking into account our third dimension, let's take a look at the differences between a 2d length calculation and one that takes into account the elevation changes using the explicit [st_3dlength](https://postgis.net/docs/ST_3DLength.html). 287 | 288 | ## Exercise: Compare 2d and 3d length 289 | ```sql 290 | SELECT st_length(geom)/1609 FROM superior1003d; 291 | SELECT st_3dlength(geom)/1609 FROM superior1003d; 292 | ``` 293 | --- 294 | # [Linear Referencing](https://postgis.net/docs/reference.html#Linear_Referencing) 295 | 296 | PostGIS comes with a great set of tools for doing interpolation along tracks. These tools either use the ration along the track (from 0-1) or they use a 4th ordinate as a measure, referred to as the M ordinate. 297 | 298 | --- 299 | ## Exercise: Use [st_lineinterpolatepoint](https://postgis.net/docs/ST_LineInterpolatePoint.html) to calculate the halfway point and the point 50 miles along our track. 300 | 301 | These will both be using just the 2d distance. 302 | 303 | 304 | ```sql 305 | SELECT st_asewkt(st_lineinterpolatepoint(geom,.5)) 306 | FROM superior1003d; 307 | 308 | SELECT st_asewkt(st_lineinterpolatepoint(geom,50*1609/st_length(geom))) 309 | FROM superior1003d; 310 | ``` 311 | --- 312 | 313 | Geographic data collection is not always entirely precise (shocker). The official distance for this race is 103.2 miles and all the aid stations have mileages given to them that do not entirely match the track that we have. For planning purposes and to match all the signage on the course, it is more important for us to match with those published distances than with the distances that we have along our track. Let's take a look at what those differences mean for our course. We can use [st_linelocatepoint](https://postgis.net/docs/ST_LineLocatePoint.html) to find the point on the track nearest a given point (in this case our aid station). 314 | 315 | --- 316 | ## Exercise: Load aid station locations 317 | ```bash 318 | shp2pgsql -s 26915 -D -I aidstations.shp aidstations | psql superior 319 | ``` 320 | --- 321 | ## Exercise: Look at aid station locations as ratios along the track by using both the mileage along as a ratio of total distance and by the aid station location 322 | ```sql 323 | SELECT 324 | a.aidstation, 325 | a.miles, 326 | a.miles/st_length(s.geom)*1609 as along_track, 327 | a.miles/103.2 along_total_distance, 328 | st_linelocatepoint(s.geom,a.geom) at_nearest_point 329 | FROM 330 | aidstations a, 331 | superior1003d s 332 | ORDER BY a.miles 333 | ; 334 | ``` 335 | --- 336 | 337 | Using the aid stations, we can separate our track into sections that we know what the distance should be between each section. We'll use our window functions again to calculate the distance between each aid station and to locate the aidstations as ratios along our track. We can then extract each section using another linear referencing function [st_linesubstring](https://postgis.net/docs/ST_LineSubstring.html) which works very similar to a string substring function splitting out the section of the track using these ratios. 338 | 339 | ## Exercise: Split track into segments between aid stations 340 | ```sql 341 | CREATE TABLE sections AS 342 | SELECT 343 | aidstation, 344 | miles, 345 | st_addmeasure( 346 | st_linesubstring( 347 | s.geom, 348 | st_linelocatepoint(s.geom, 349 | lag(a.geom) OVER (ORDER BY miles)), 350 | st_linelocatepoint(s.geom,a.geom) 351 | ), 352 | lag(a.miles) OVER (ORDER BY miles), 353 | a.miles 354 | ) as geom 355 | FROM 356 | aidstations a, 357 | superior1003d s 358 | ORDER BY a.miles 359 | ; 360 | 361 | SELECT aidstation, miles, substring(st_asewkt(geom),0,100) FROM sections; 362 | ``` 363 | --- 364 | 365 | Now that we have measures calculated per section, we can recombine those sections to create a single track with our corrected distance measures along the entire track. 366 | 367 | ## Exercise: Merge the line segments together 368 | ```sql 369 | CREATE TABLE superior1003dm AS 370 | SELECT st_linemerge(st_collect(geom)) AS geom FROM sections; 371 | 372 | SELECT substring(st_asewkt(geom),0,100) FROM superior1003dm; 373 | ``` 374 | 375 | UH OH! Notice that in this result, our measure value (the 4th ordinate) is missing! Not all functions in PostGIS maintain the 4th dimension! 376 | 377 | --- 378 | 379 | We're not done yet, remember we can still blow our tracks into individual points and sew them back together 380 | 381 | ## Exercise: Merge the line segments together take 2 382 | ```sql 383 | DROP TABLE superior1003dm; 384 | CREATE TABLE superior1003dm AS 385 | WITH 386 | p1 AS 387 | (SELECT (st_dumppoints(geom)).* FROM sections), 388 | p2 AS 389 | (SELECT DISTINCT ON (st_m(geom)) geom, st_m(geom) 390 | FROM p1 ORDER BY st_m(geom)) 391 | SELECT st_makeline(geom) as geom FROM p2; 392 | 393 | SELECT substring(st_asewkt(geom),0,100) FROM superior1003dm; 394 | ``` 395 | 396 | Why did we have to use the "DISTINCT ON"? For each segment when we constructed the segment the endpoint of on is the startpoint of the next and we don't want to double those points 397 | 398 | --- 399 | 400 | We've now learned how to use our M ordinate to store information about distance information, but we all came here to learn how we can work with time and PostGIS. I've found the last three years splits for the race for each aid station. We can use this data to start to develop a pace chart for where I can hope to run. Let's load this split data (to save time we are just going to use a sql script to load and format the data for us to use) 401 | 402 | ```bash 403 | psql -a -f loadresults.sql superior 404 | ``` 405 | --- 406 | ## Exercise: Explore our splits data 407 | ```sql 408 | SELECT * FROM superiorsplits ORDER BY runnerid, aidstation LIMIT 20; 409 | 410 | SELECT aidstation, min(split), avg(split), max(split) 411 | FROM superiorsplits GROUP BY aidstation ORDER BY min(split); 412 | ``` 413 | --- 414 | 415 | I'm slow. 416 | Probably not best to try to calculate my splits from all the results, let's limit it to folks who finished in the time range that I hope to finish in. 417 | 418 | ## Exercise: Find average times to get to each aid station to finish in around 36 hours 419 | ```sql 420 | SELECT aidstation, min(split), avg(split), max(split) 421 | FROM superiorsplits 422 | WHERE finish BETWEEN '35 hours'::interval AND '37 hours'::interval 423 | GROUP BY aidstation ORDER BY min(split); 424 | ``` 425 | --- 426 | 427 | Once we have the splits we can create a pace chart for when I should get to each aid station. 428 | 429 | ## Exercise: Create pace chart for a 36 hour goal 430 | ```sql 431 | CREATE TABLE bitner_goal AS 432 | WITH 433 | goalsplits AS ( 434 | SELECT aidstation, avg(split) as goal 435 | FROM superiorsplits 436 | WHERE finish BETWEEN '35 hours'::interval AND '37 hours'::interval 437 | GROUP BY aidstation ORDER BY min(split) 438 | ) 439 | SELECT 440 | aidstation, 441 | miles as miles, 442 | miles - coalesce(lag(miles) OVER (ORDER BY miles),0) AS miles_section, 443 | coalesce(lag(goal) OVER (ORDER BY miles),'0 hours'::interval) as goal_from, 444 | goal as goal_to, 445 | goal - 446 | coalesce(lag(goal) OVER (ORDER BY miles),'0 hours'::interval) 447 | AS goal_section, 448 | '2017-09-08 08:00:00 CDT'::timestamptz + goal AS goal_time, 449 | (goal - coalesce(lag(goal) OVER (ORDER BY miles),'0 hours'::interval)) 450 | / 451 | (miles - coalesce(lag(miles) OVER (ORDER BY miles),0)) 452 | as pace_section 453 | FROM 454 | sections JOIN goalsplits USING (aidstation) 455 | ; 456 | ``` 457 | --- 458 | ## Exercise: Take a gander at our pace chart 459 | ```sql 460 | SELECT * FROM bitner_goal; 461 | ``` 462 | --- 463 | 464 | Now that we know what time we want to get to each aid station, we can also create a track similar to what we did for our distance measure along only using time for our measure rather than distance. Now we can't use an interval or timestamptz as our M value, so instead we are going to use the Unix Epoch or a number of seconds. We can use either the actual timestamptz or we can use time along the course. We're going to use the latter. 465 | 466 | ## Exercise: Create a track that contains our time along measure for our goals 467 | ```sql 468 | CREATE TABLE bitner_goal_track AS 469 | WITH 470 | t1 AS ( 471 | SELECT 472 | st_addmeasure(geom, to_epoch(goal_from), to_epoch(goal_to)) 473 | AS geom 474 | FROM 475 | sections JOIN bitner_goal USING (aidstation) 476 | ), 477 | p1 AS 478 | (SELECT (st_dumppoints(geom)).* FROM t1), 479 | p2 AS 480 | (SELECT DISTINCT ON (st_m(geom)) geom, st_m(geom) 481 | FROM p1 ORDER BY st_m(geom)) 482 | SELECT st_makeline(geom) as geom FROM p2; 483 | 484 | SELECT substring(st_asewkt(geom),0,100) FROM bitner_goal_track; 485 | ``` 486 | --- 487 | 488 | I have a satellite tracker that I carry with on these races that every ten minutes let's my crew (the people who meet me at the aid stations to help me out) know where I am. Now I can pass in a point from that tracker anywher along the track and my crew can tell how far ahead or behind of my planned pace I am. Similarly for any given point or distance along the track they could tell when I am hoping to get there (if you are moving through these exercises really fast you can take that on as a challenge exercise). 489 | 490 | ## Exercise: Find where I should be at given a location 491 | ```sql 492 | WITH point AS 493 | (SELECT st_geometryn(st_locatealong(geom,60),1) as point FROM superior1003dm) 494 | SELECT 495 | (st_m( 496 | st_lineinterpolatepoint( 497 | geom, 498 | st_linelocatepoint(geom,point.point) 499 | ) 500 | )::text || ' seconds')::interval 501 | FROM bitner_goal_track, point; 502 | ``` 503 | --- 504 | 505 | We can to the same as we've done with my target times to create tracks from the previous runners 506 | 507 | ```sql 508 | SELECT * FROM superiorsplits 509 | WHERE aidstation='finish' AND finish BETWEEN '35.5 hours'::interval AND '36.5 hours'::interval LIMIT 20; 510 | ``` 511 | --- 512 | # Challenge: Try to create a track using the split times for a previous finisher running near 36 hours and create a time measured track. Try not to cheat and use the solution below!!! 513 | ```sql 514 | CREATE TABLE target_goal AS 515 | WITH 516 | goalsplits AS ( 517 | SELECT aidstation, split as goal 518 | FROM superiorsplits 519 | WHERE runnerid = 93 520 | ) 521 | SELECT 522 | aidstation, 523 | miles AS miles, 524 | miles - coalesce(lag(miles) OVER (ORDER BY miles),0) 525 | AS miles_section, 526 | coalesce(lag(goal) OVER (ORDER BY miles),'0 hours'::interval) 527 | AS goal_from, 528 | goal AS goal_to, 529 | goal - 530 | coalesce(lag(goal) OVER (ORDER BY miles),'0 hours'::interval) 531 | AS goal_section, 532 | '2017-09-08 08:00:00 CDT'::timestamptz + goal AS goal_time, 533 | (goal - coalesce(lag(goal) OVER (ORDER BY miles),'0 hours'::interval)) 534 | / 535 | (miles - coalesce(lag(miles) OVER (ORDER BY miles),0)) 536 | as pace_section 537 | FROM 538 | sections JOIN goalsplits USING (aidstation) 539 | ; 540 | 541 | SELECT * FROM target_goal; 542 | ``` 543 | --- 544 | ```sql 545 | CREATE TABLE target_goal_track AS 546 | WITH 547 | t1 AS ( 548 | SELECT 549 | st_addmeasure(geom, to_epoch(goal_from), 550 | to_epoch(goal_to)) AS geom 551 | FROM 552 | sections JOIN target_goal USING (aidstation) 553 | ), 554 | p1 AS 555 | (SELECT (st_dumppoints(geom)).* FROM t1), 556 | p2 AS 557 | (SELECT DISTINCT ON (st_m(geom)) geom, st_m(geom) 558 | FROM p1 ORDER BY st_m(geom)) 559 | SELECT st_makeline(geom) as geom FROM p2; 560 | 561 | SELECT substring(st_asewkt(geom),0,100) FROM target_goal_track; 562 | ``` 563 | --- 564 | 565 | When we are adding an M value, PostGIS will allow us to add any value that we want. In order to be a "proper measure" those values should be continuously increasing along the path. PostGIS has a function [st_isvalidtrajectory](https://postgis.net/docs/ST_IsValidTrajectory.html) that will check for this. 566 | 567 | ## Exercise: Check our two tracks for good measures 568 | ```sql 569 | SELECT st_isvalidtrajectory(geom) FROM bitner_goal_track; 570 | SELECT st_isvalidtrajectory(geom) FROM target_goal_track; 571 | ``` 572 | --- 573 | 574 | Once we have valid trajectories, we can use the closest point of approach functions [st_closestpointofapproach](https://postgis.net/docs/ST_ClosestPointOfApproach.html) and [st_distancecpa](https://postgis.net/docs/ST_DistanceCPA.html) to find out if two trajectories met and when (or the closest they got). We'll just look at the last half of the tracks as everyone was together at the start. 575 | 576 | ## Exercise: Determine how close my goal track and the track created from a previous runner got 577 | ```sql 578 | SELECT (st_closestpointofapproach( 579 | (SELECT st_linesubstring(geom,.5,1) FROM bitner_goal_track), 580 | (SELECT st_linesubstring(geom,.5,1) FROM target_goal_track) 581 | )::text || ' seconds')::interval; 582 | 583 | SELECT st_distancecpa( 584 | (SELECT st_linesubstring(geom,.5,1) FROM bitner_goal_track), 585 | (SELECT st_linesubstring(geom,.5,1) FROM target_goal_track) 586 | ); 587 | ``` 588 | --- 589 | ## Bonus Exercises #1 590 | Using previous race times, if I get to an aid station at a given time, use the other finishers who got to that aid station near that time to predict when I will get to all the following aid stations with some indicator of margin or error. 591 | --- 592 | 593 | ## Bonus Exercise #2 594 | Using previous race times, given a location/time that I am at any point in the race, predict when I will get to the following aid stations. 595 | -------------------------------------------------------------------------------- /loaddata.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | dropdb superior 3 | createdb superior 4 | export PGDATABASE=superior 5 | psql -c "create extension postgis;" 6 | psql -a -f 00_loadresults.sql 7 | shp2pgsql -s 26915 -D -S -t 2D -I superior100.shp superior100 | psql 8 | shp2pgsql -s 26915 -D -S -t 2D -I aidstations.shp aidstations | psql 9 | raster2pgsql -I -Y -C -s 26915 -t 100x100 sht_dem25m.tif dem | psql 10 | psql -a -f 01_dumppoints.sql -------------------------------------------------------------------------------- /loadresults.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE superiorresults ( 2 | year int4, 3 | bib int4, 4 | first text, 5 | last text, 6 | sex text, 7 | age int4, 8 | city text, 9 | state text, 10 | country text, 11 | splitrock interval, 12 | beaverbay interval, 13 | silverbay interval, 14 | tettegouche interval, 15 | cr6 interval, 16 | finland interval, 17 | crosby interval, 18 | sugarloaf interval, 19 | cramer interval, 20 | temperance interval, 21 | sawbill interval, 22 | oberg interval, 23 | finish interval 24 | ); 25 | \copy superiorresults from 'superiorresults.csv' with csv header; 26 | 27 | create sequence superiorresults_id_seq; 28 | 29 | alter table superiorresults add column id int8 primary key default nextval('superiorresults_id_seq'::regclass); 30 | 31 | CREATE TABLE superiorsplits AS 32 | WITH allsplits AS 33 | (SELECT id as runnerid, splitrock as split, 'splitrock' as aidstation FROM superiorresults WHERE splitrock < beaverbay 34 | UNION ALL 35 | SELECT id, beaverbay, 'beaverbay' FROM superiorresults WHERE beaverbay BETWEEN splitrock AND silverbay 36 | UNION ALL 37 | SELECT id, silverbay, 'silverbay' FROM superiorresults WHERE silverbay BETWEEN beaverbay AND tettegouche 38 | UNION ALL 39 | SELECT id, tettegouche, 'tettegouche' FROM superiorresults WHERE tettegouche BETWEEN silverbay and cr6 40 | UNION ALL 41 | SELECT id, cr6, 'cr6' FROM superiorresults WHERE cr6 BETWEEN tettegouche AND finland 42 | UNION ALL 43 | SELECT id, finland, 'finland' FROM superiorresults WHERE finland BETWEEN cr6 AND crosby 44 | UNION ALL 45 | SELECT id, crosby, 'crosby' FROM superiorresults WHERE crosby BETWEEN finland AND sugarloaf 46 | UNION ALL 47 | SELECT id, sugarloaf, 'sugarloaf' FROM superiorresults WHERE sugarloaf BETWEEN crosby AND cramer 48 | UNION ALL 49 | SELECT id, cramer, 'cramer' FROM superiorresults WHERE cramer BETWEEN sugarloaf AND temperance 50 | UNION ALL 51 | SELECT id, temperance, 'temperance' FROM superiorresults WHERE temperance BETWEEN cramer AND sawbill 52 | UNION ALL 53 | SELECT id, sawbill, 'sawbill' FROM superiorresults WHERE sawbill BETWEEN temperance AND oberg 54 | UNION ALL 55 | SELECT id, oberg, 'oberg' FROM superiorresults WHERE oberg BETWEEN sawbill AND finish 56 | UNION ALL 57 | SELECT id, finish, 'finish' FROM superiorresults WHERE finish > oberg 58 | ) 59 | SELECT *, (SELECT finish FROM superiorresults WHERE id=allsplits.runnerid) as finish from allsplits WHERE split IS NOT NULL 60 | ; 61 | -------------------------------------------------------------------------------- /preraceprep.sql: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE function racertrack (IN runnerid bigint, OUT track geometry) AS $$ 2 | WITH 3 | goalsplits AS ( 4 | SELECT aidstation, split as goal 5 | FROM superiorsplits 6 | WHERE runnerid = $1 7 | ), 8 | target_goal AS ( 9 | SELECT 10 | aidstation, 11 | miles AS miles, 12 | miles - coalesce(lag(miles) OVER (ORDER BY miles),0) 13 | AS miles_section, 14 | coalesce(lag(goal) OVER (ORDER BY miles),'0 hours'::interval) 15 | AS goal_from, 16 | goal AS goal_to, 17 | goal - 18 | coalesce(lag(goal) OVER (ORDER BY miles),'0 hours'::interval) 19 | AS goal_section, 20 | '2017-09-08 08:00:00 CDT'::timestamptz + goal AS goal_time, 21 | (goal - coalesce(lag(goal) OVER (ORDER BY miles),'0 hours'::interval)) 22 | / 23 | (miles - coalesce(lag(miles) OVER (ORDER BY miles),0)) 24 | as pace_section 25 | FROM 26 | sections JOIN goalsplits USING (aidstation) 27 | ), 28 | t1 AS ( 29 | SELECT 30 | st_addmeasure(geom, to_epoch(goal_from), 31 | to_epoch(goal_to)) AS geom 32 | FROM 33 | sections JOIN target_goal USING (aidstation) 34 | ), 35 | p1 AS 36 | (SELECT (st_dumppoints(geom)).* FROM t1), 37 | p2 AS 38 | (SELECT DISTINCT ON (st_m(geom)) geom, st_m(geom) 39 | FROM p1 ORDER BY st_m(geom)) 40 | SELECT st_makeline(geom) as geom FROM p2; 41 | ; 42 | 43 | 44 | $$ LANGUAGE SQL; 45 | 46 | DROP TABLE IF EXISTS runners; 47 | DROP TABLE IF EXISTS runnertracks; 48 | create table runners as select runnerid, finish from superiorsplits group by runnerid, finish having count(*)=13; 49 | CREATE TABLE runnertracks as select runnerid, finish, racertrack(runnerid) as geom from runners; 50 | 51 | select runnerid, finish, 52 | st_asewkt( 53 | st_lineinterpolatepoint( 54 | geom, 55 | st_linelocatepoint( 56 | geom, 57 | (select geom from aidstations where aidstation='finland') 58 | ) 59 | ) 60 | ) 61 | FROM runnertracks; -------------------------------------------------------------------------------- /sht_dem25m.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitner/postgis_temporal_workshop/29f40051d577f1b2f3a1439b236245e890ca55df/sht_dem25m.tif -------------------------------------------------------------------------------- /sqlcommands.sql: -------------------------------------------------------------------------------- 1 | SELECT '2017-01-01 00:00-6'::timestamptz; 2 | 3 | SELECT '2017-01-01'::timestamptz; 4 | 5 | SELECT '4/5/2017'::timestamptz; 6 | SET datestyle to dmy; 7 | SELECT '4/5/2017'::timestamptz; 8 | 9 | SET datestyle TO DEFAULT; 10 | SELECT '4/5/2017'::timestamptz; 11 | SELECT now(); 12 | 13 | SET TIME ZONE 'Europe/Rome'; 14 | SELECT now(); 15 | 16 | SET TIME ZONE 'UTC'; 17 | SELECT now(); 18 | 19 | SET TIME ZONE 'PST8PDT'; 20 | SELECT now(); 21 | 22 | SET TIME ZONE DEFAULT; 23 | SHOW TIME ZONE; 24 | SELECT now(); 25 | 26 | SELECT timezone('UTC', now()); 27 | 28 | SELECT now() AT TIME ZONE 'America/Chicago'; 29 | SELECT '1 day'::interval; 30 | SELECT '2016-01-01'::timestamptz + '3 months'::interval; 31 | SELECT to_timestamp(0); 32 | 33 | SELECT timezone('UTC',to_timestamp(0)); 34 | 35 | SELECT extract(epoch from '2017-01-01'::timestamptz); 36 | 37 | SELECT extract(epoch from '1 hour'::interval); 38 | CREATE OR REPLACE FUNCTION to_epoch(IN timestamptz, OUT float8) AS $$ 39 | SELECT extract(epoch from $1); 40 | $$ LANGUAGE SQL; 41 | 42 | CREATE OR REPLACE FUNCTION to_epoch(IN interval, OUT float8) AS $$ 43 | SELECT extract(epoch from $1); 44 | $$ LANGUAGE SQL; 45 | 46 | SELECT to_epoch('2017-01-01'::timestamptz); 47 | SELECT to_epoch('1 hour'::interval); 48 | SELECT date_trunc('month', now()); 49 | SELECT date_trunc('month', now()) + '1 month'::interval; 50 | SELECT id, substring(st_asewkt(geom),0,100) FROM superior100; 51 | SELECT st_dumppoints(geom) FROM superior100 limit 10; 52 | SELECT (st_dumppoints(geom)).* FROM superior100 limit 10; 53 | WITH t AS (SELECT st_dumppoints(geom) as dump FROM superior100) 54 | SELECT 55 | (dump).path[2], 56 | st_asewkt((dump).geom), 57 | st_x((dump).geom), 58 | st_y((dump).geom) 59 | FROM t 60 | LIMIT 10; 61 | CREATE TABLE superior100_points AS 62 | WITH t AS (SELECT st_dumppoints(geom) as dump FROM superior100) 63 | SELECT 64 | (dump).path[2], 65 | (dump).geom, 66 | st_x((dump).geom) as x, 67 | st_y((dump).geom) as y 68 | FROM t; 69 | ALTER TABLE superior100_points ADD COLUMN z float8; 70 | 71 | UPDATE superior100_points 72 | SET 73 | z=st_value(rast,geom) 74 | FROM dem 75 | WHERE st_intersects(dem.rast,geom); 76 | SELECT st_asewkt(geom), x, y, z FROM superior100_points LIMIT 10; 77 | 78 | UPDATE superior100_points 79 | SET geom = st_setsrid(st_makepoint(x,y,z), 26915); 80 | 81 | SELECT st_asewkt(geom) FROM superior100_points LIMIT 10; 82 | WITH t AS (SELECT * FROM superior100_points ORDER BY PATH) 83 | SELECT substring(st_asewkt(st_makeline(geom)),1,100) FROM t; 84 | CREATE TABLE superior1003d AS 85 | WITH t AS (SELECT * FROM superior100_points ORDER BY PATH) 86 | SELECT st_makeline(geom) as geom FROM t; 87 | SELECT path, x, y, z, z-lag(z) OVER (ORDER BY PATH) 88 | FROM superior100_points LIMIT 20; 89 | ALTER TABLE superior100_points ADD COLUMN elchange float8; 90 | 91 | WITH t AS (SELECT path, x, y, z, 92 | round((z-lag(z) OVER (ORDER BY PATH))::numeric,1) elchange 93 | FROM superior100_points) 94 | UPDATE superior100_points p SET elchange=t.elchange 95 | FROM t WHERE p.path=t.path; 96 | 97 | SELECT x, y, z, elchange FROM superior100_points limit 10; 98 | SELECT 99 | 3.28 * sum(elchange) FILTER (WHERE elchange>0) as gain, 100 | 3.28 * sum(elchange) FILTER (WHERE elchange<0) as descent 101 | FROM superior100_points; 102 | SELECT path, x, y, z, 103 | degrees(st_azimuth(lag(geom) OVER (ORDER BY path), geom)) 104 | FROM superior100_points LIMIT 20; 105 | SELECT st_length(geom)/1609 FROM superior1003d; 106 | SELECT st_3dlength(geom)/1609 FROM superior1003d; 107 | SELECT st_asewkt(st_lineinterpolatepoint(geom,.5)) 108 | FROM superior1003d; 109 | 110 | SELECT st_asewkt(st_lineinterpolatepoint(geom,50*1609/st_length(geom))) 111 | FROM superior1003d; 112 | SELECT 113 | a.aidstation, 114 | a.miles, 115 | a.miles/st_length(s.geom)*1609 as along_track, 116 | a.miles/103.2 along_total_distance, 117 | st_linelocatepoint(s.geom,a.geom) at_nearest_point 118 | FROM 119 | aidstations a, 120 | superior1003d s 121 | ORDER BY a.miles 122 | ; 123 | CREATE TABLE sections AS 124 | SELECT 125 | aidstation, 126 | miles, 127 | st_addmeasure( 128 | st_linesubstring( 129 | s.geom, 130 | st_linelocatepoint(s.geom, 131 | lag(a.geom) OVER (ORDER BY miles)), 132 | st_linelocatepoint(s.geom,a.geom) 133 | ), 134 | lag(a.miles) OVER (ORDER BY miles), 135 | a.miles 136 | ) as geom 137 | FROM 138 | aidstations a, 139 | superior1003d s 140 | ORDER BY a.miles 141 | ; 142 | 143 | SELECT aidstation, miles, substring(st_asewkt(geom),0,100) FROM sections; 144 | CREATE TABLE superior1003dm AS 145 | SELECT st_linemerge(st_collect(geom)) AS geom FROM sections; 146 | 147 | SELECT substring(st_asewkt(geom),0,100) FROM superior1003dm; 148 | DROP TABLE superior1003dm; 149 | CREATE TABLE superior1003dm AS 150 | WITH 151 | p1 AS 152 | (SELECT (st_dumppoints(geom)).* FROM sections), 153 | p2 AS 154 | (SELECT DISTINCT ON (st_m(geom)) geom, st_m(geom) 155 | FROM p1 ORDER BY st_m(geom)) 156 | SELECT st_makeline(geom) as geom FROM p2; 157 | 158 | SELECT substring(st_asewkt(geom),0,100) FROM superior1003dm; 159 | SELECT * FROM superiorsplits ORDER BY runnerid, aidstation LIMIT 20; 160 | 161 | SELECT aidstation, min(split), avg(split), max(split) 162 | FROM superiorsplits GROUP BY aidstation ORDER BY min(split); 163 | SELECT aidstation, min(split), avg(split), max(split) 164 | FROM superiorsplits 165 | WHERE finish BETWEEN '35 hours'::interval AND '37 hours'::interval 166 | GROUP BY aidstation ORDER BY min(split); 167 | CREATE TABLE bitner_goal AS 168 | WITH 169 | goalsplits AS ( 170 | SELECT aidstation, avg(split) as goal 171 | FROM superiorsplits 172 | WHERE finish BETWEEN '35 hours'::interval AND '37 hours'::interval 173 | GROUP BY aidstation ORDER BY min(split) 174 | ) 175 | SELECT 176 | aidstation, 177 | miles as miles, 178 | miles - coalesce(lag(miles) OVER (ORDER BY miles),0) AS miles_section, 179 | coalesce(lag(goal) OVER (ORDER BY miles),'0 hours'::interval) as goal_from, 180 | goal as goal_to, 181 | goal - 182 | coalesce(lag(goal) OVER (ORDER BY miles),'0 hours'::interval) 183 | AS goal_section, 184 | '2017-09-08 08:00:00 CDT'::timestamptz + goal AS goal_time, 185 | (goal - coalesce(lag(goal) OVER (ORDER BY miles),'0 hours'::interval)) 186 | / 187 | (miles - coalesce(lag(miles) OVER (ORDER BY miles),0)) 188 | as pace_section 189 | FROM 190 | sections JOIN goalsplits USING (aidstation) 191 | ; 192 | SELECT * FROM bitner_goal; 193 | CREATE TABLE bitner_goal_track AS 194 | WITH 195 | t1 AS ( 196 | SELECT 197 | st_addmeasure(geom, to_epoch(goal_from), to_epoch(goal_to)) 198 | AS geom 199 | FROM 200 | sections JOIN bitner_goal USING (aidstation) 201 | ), 202 | p1 AS 203 | (SELECT (st_dumppoints(geom)).* FROM t1), 204 | p2 AS 205 | (SELECT DISTINCT ON (st_m(geom)) geom, st_m(geom) 206 | FROM p1 ORDER BY st_m(geom)) 207 | SELECT st_makeline(geom) as geom FROM p2; 208 | 209 | SELECT substring(st_asewkt(geom),0,100) FROM bitner_goal_track; 210 | WITH point AS 211 | (SELECT st_geometryn(st_locatealong(geom,60),1) as point FROM superior1003dm) 212 | SELECT 213 | (st_m( 214 | st_lineinterpolatepoint( 215 | geom, 216 | st_linelocatepoint(geom,point.point) 217 | ) 218 | )::text || ' seconds')::interval 219 | FROM bitner_goal_track, point; 220 | SELECT * FROM superiorsplits 221 | WHERE aidstation='finish' AND finish BETWEEN '35.5 hours'::interval AND '36.5 hours'::interval LIMIT 20; 222 | CREATE TABLE target_goal AS 223 | WITH 224 | goalsplits AS ( 225 | SELECT aidstation, split as goal 226 | FROM superiorsplits 227 | WHERE runnerid = 93 228 | ) 229 | SELECT 230 | aidstation, 231 | miles AS miles, 232 | miles - coalesce(lag(miles) OVER (ORDER BY miles),0) 233 | AS miles_section, 234 | coalesce(lag(goal) OVER (ORDER BY miles),'0 hours'::interval) 235 | AS goal_from, 236 | goal AS goal_to, 237 | goal - 238 | coalesce(lag(goal) OVER (ORDER BY miles),'0 hours'::interval) 239 | AS goal_section, 240 | '2017-09-08 08:00:00 CDT'::timestamptz + goal AS goal_time, 241 | (goal - coalesce(lag(goal) OVER (ORDER BY miles),'0 hours'::interval)) 242 | / 243 | (miles - coalesce(lag(miles) OVER (ORDER BY miles),0)) 244 | as pace_section 245 | FROM 246 | sections JOIN goalsplits USING (aidstation) 247 | ; 248 | 249 | SELECT * FROM target_goal; 250 | CREATE TABLE target_goal_track AS 251 | WITH 252 | t1 AS ( 253 | SELECT 254 | st_addmeasure(geom, to_epoch(goal_from), 255 | to_epoch(goal_to)) AS geom 256 | FROM 257 | sections JOIN target_goal USING (aidstation) 258 | ), 259 | p1 AS 260 | (SELECT (st_dumppoints(geom)).* FROM t1), 261 | p2 AS 262 | (SELECT DISTINCT ON (st_m(geom)) geom, st_m(geom) 263 | FROM p1 ORDER BY st_m(geom)) 264 | SELECT st_makeline(geom) as geom FROM p2; 265 | 266 | SELECT substring(st_asewkt(geom),0,100) FROM target_goal_track; 267 | SELECT st_isvalidtrajectory(geom) FROM bitner_goal_track; 268 | SELECT st_isvalidtrajectory(geom) FROM target_goal_track; 269 | SELECT (st_closestpointofapproach( 270 | (SELECT st_linesubstring(geom,.5,1) FROM bitner_goal_track), 271 | (SELECT st_linesubstring(geom,.5,1) FROM target_goal_track) 272 | )::text || ' seconds')::interval; 273 | 274 | SELECT st_distancecpa( 275 | (SELECT st_linesubstring(geom,.5,1) FROM bitner_goal_track), 276 | (SELECT st_linesubstring(geom,.5,1) FROM target_goal_track) 277 | ); 278 | -------------------------------------------------------------------------------- /superior.sql.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitner/postgis_temporal_workshop/29f40051d577f1b2f3a1439b236245e890ca55df/superior.sql.gz -------------------------------------------------------------------------------- /superior100.cpg: -------------------------------------------------------------------------------- 1 | UTF-8 -------------------------------------------------------------------------------- /superior100.dbf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitner/postgis_temporal_workshop/29f40051d577f1b2f3a1439b236245e890ca55df/superior100.dbf -------------------------------------------------------------------------------- /superior100.prj: -------------------------------------------------------------------------------- 1 | PROJCS["NAD83 / UTM zone 15N",GEOGCS["NAD83",DATUM["North_American_Datum_1983",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6269"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4269"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-93],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","26915"]] -------------------------------------------------------------------------------- /superior100.shp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitner/postgis_temporal_workshop/29f40051d577f1b2f3a1439b236245e890ca55df/superior100.shp -------------------------------------------------------------------------------- /superior100.shx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitner/postgis_temporal_workshop/29f40051d577f1b2f3a1439b236245e890ca55df/superior100.shx -------------------------------------------------------------------------------- /superior100_points.cpg: -------------------------------------------------------------------------------- 1 | UTF-8 -------------------------------------------------------------------------------- /superior100_points.dbf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitner/postgis_temporal_workshop/29f40051d577f1b2f3a1439b236245e890ca55df/superior100_points.dbf -------------------------------------------------------------------------------- /superior100_points.prj: -------------------------------------------------------------------------------- 1 | PROJCS["NAD83 / UTM zone 15N",GEOGCS["NAD83",DATUM["North_American_Datum_1983",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6269"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4269"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-93],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","26915"]] -------------------------------------------------------------------------------- /superior100_points.shp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitner/postgis_temporal_workshop/29f40051d577f1b2f3a1439b236245e890ca55df/superior100_points.shp -------------------------------------------------------------------------------- /superior100_points.shx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitner/postgis_temporal_workshop/29f40051d577f1b2f3a1439b236245e890ca55df/superior100_points.shx -------------------------------------------------------------------------------- /superiorresults.csv: -------------------------------------------------------------------------------- 1 | year,bib,first,last,sex,age,city,state,country,splitrock,beaverbay,silverbay,tettegouche,cr6,finland,crosby,sugarloaf,cramer,temperance,sawbill,oberg,finish 2 | 2014,184,Adam,Schwartz-Lowe,M,41,Duluth,MN,USA,1:36:00,3:22:00,4:18:00,6:12:00,8:10:00,9:44:00,12:17:00,14:47:00,16:12:00,17:56:00,19:06:00,20:20:00,21:58:32 3 | 2014,21,Michael,Borst,M,21,La Crosse,WI,USA,1:33:00,3:14:00,4:06:00,6:03:00,7:58:00,9:32:00,12:11:00,14:42:00,16:10:00,17:57:00,19:30:00,21:09:00,22:52:28 4 | 2014,225,Nathan,Leehman,M,40,Charlotte,NC,USA,1:39:00,3:23:00,4:20:00,6:27:00,8:34:00,10:20:00,12:47:00,15:07:00,16:30:00,18:15:00,19:55:00,21:34:00,23:26:47 5 | 2014,32,John,Cameron,M,25,Coon Rapids,MN,USA,1:48:00,3:44:00,4:41:00,6:37:00,8:34:00,10:13:00,13:06:00,15:50:00,17:10:00,19:10:00,20:35:00,22:07:00,23:51:48 6 | 2014,122,Jacob,Lawrence,M,33,St. Paul,MN,USA,1:42:00,3:34:00,4:35:00,6:37:00,8:34:00,10:13:00,13:06:00,15:50:00,17:27:00,19:35:00,21:17:00,23:04:00,24:54:59 7 | 2014,96,John,Horns,M,52,Edina,MN,USA,1:33:00,3:17:00,4:18:00,6:32:00,8:38:00,10:20:00,13:25:00,16:30:00,18:04:00,20:11:00,21:53:00,23:36:00,25:36:03 8 | 2014,226,Grant,Maughan,M,50,"Dudley, NSW",Other,Australia,1:48:00,3:50:00,4:58:00,7:03:00,9:10:00,11:00:00,14:15:00,17:22:00,18:59:00,21:13:00,22:40:00,24:00:00,25:42:49 9 | 2014,170,Chris,Robbins,M,29,Albert Lea,MN,USA,1:52:00,3:51:00,4:49:00,6:51:00,8:50:00,10:42:00,13:59:00,16:55:00,18:54:00,21:11:00,22:45:00,24:09:00,25:58:58 10 | 2014,12,Steven,Bailey,M,35,Afton,MN,USA,2:09:00,4:11:00,5:16:00,7:16:00,9:27:00,11:09:00,13:59:00,16:55:00,18:27:00,20:38:00,22:20:00,24:00:00,26:04:19 11 | 2014,55,Mike,Dietz,M,40,Wauconda,IL,USA,1:42:00,3:34:00,4:35:00,6:31:00,8:29:00,10:08:00,13:06:00,16:03:00,18:02:00,20:46:00,22:40:00,24:17:00,26:21:39 12 | 2014,113,Brian,Klug,M,35,Alexandria,MN,USA,1:42:00,3:44:00,4:49:00,6:54:00,8:50:00,10:36:00,13:25:00,16:20:00,18:22:00,20:30:00,22:45:00,24:24:00,26:27:12 13 | 2014,62,Robert,Edman,M,33,St. Paul,MN,USA,1:52:00,3:55:00,5:16:00,7:32:00,9:46:00,11:32:00,14:45:00,17:35:00,19:20:00,21:11:00,22:50:00,24:37:00,26:49:53 14 | 2014,81,Steven,Graupner,M,25,St. Malo,MB,Canada,2:01:00,4:07:00,5:16:00,7:32:00,9:46:00,11:42:00,14:45:00,17:35:00,19:20:00,21:15:00,23:35:00,25:30:00,27:31:15 15 | 2014,168,Mallory,Richard,F,29,Winnipeg,MB,Canada,2:15:00,4:24:00,5:33:00,7:39:00,10:05:00,11:54:00,15:41:00,18:30:00,20:05:00,22:22:00,24:00:00,25:36:00,27:32:27 16 | 2014,195,Eric,Tadt,M,27,Minneapolis,MN,USA,1:42:00,3:38:00,5:57:00,6:51:00,8:58:00,10:56:00,14:15:00,17:53:00,19:45:00,22:13:00,24:00:00,25:57:00,27:44:05 17 | 2014,51,Lee,Dalgety,M,43,Middleton,WI,USA,1:52:00,3:55:00,5:05:00,7:22:00,9:46:00,11:32:00,14:45:00,17:53:00,19:45:00,22:08:00,23:45:00,25:30:00,27:45:04 18 | 2014,109,Kent,Keeler,M,36,Niagara Falls,ON,Canada,1:52:00,3:51:00,4:49:00,6:57:00,9:10:00,10:56:00,14:15:00,17:35:00,19:20:00,21:50:00,23:41:00,25:30:00,28:00:29 19 | 2014,67,Jared,Fetterolf,M,25,Austin,TX,USA,1:39:00,3:31:00,4:35:00,6:39:00,8:43:00,10:24:00,13:48:00,16:55:00,19:05:00,23:15:00,24:45:00,26:29:00,28:41:44 20 | 2014,140,David,Mentjes,M,45,West Allis,WI,USA,2:09:00,4:16:00,5:28:00,7:39:00,10:24:00,12:27:00,16:07:00,19:14:00,21:04:00,23:37:00,25:05:00,26:48:00,28:49:51 21 | 2014,208,Ryan,Wagner,M,36,Grand Forks,ND,USA,1:48:00,3:51:00,4:58:00,7:12:00,,11:42:00,15:41:00,19:14:00,20:57:00,23:25:00,25:05:00,26:48:00,28:51:12 22 | 2014,33,Kevin,Cannaday,M,35,Oconomowoc,WI,USA,1:48:00,3:55:00,4:58:00,7:22:00,,11:42:00,15:09:00,18:30:00,20:05:00,22:52:00,25:00:00,26:31:00,28:51:38 23 | 2014,131,John,Maas,M,53,Sleepy Eye,MN,USA,2:01:00,4:16:00,5:28:00,8:08:00,10:40:00,12:34:00,16:25:00,19:36:00,21:23:00,23:42:00,25:20:00,26:59:00,29:00:17 24 | 2014,218,Brandon,Yonke,M,21,Allendale,MI,USA,2:19:00,4:35:00,5:40:00,8:08:00,10:24:00,12:27:00,15:57:00,19:26:00,21:23:00,23:52:00,25:40:00,27:38:00,29:24:55 25 | 2014,105,Tj,Jeannette,M,39,North Mankato,MN,USA,2:13:00,4:30:00,5:40:00,8:08:00,10:24:00,12:27:00,15:41:00,19:14:00,20:57:00,23:25:00,25:20:00,27:08:00,29:31:16 26 | 2014,116,Pete,Kostelnick,M,26,Lincoln,NE,USA,1:56:00,4:01:00,5:05:00,7:16:00,9:46:00,11:32:00,15:41:00,18:50:00,20:48:00,23:16:00,25:05:00,27:15:00,29:31:27 27 | 2014,204,Trevor,Uhlir,M,29,Grand Forks,ND,USA,2:20:00,4:40:00,5:57:00,8:47:00,11:05:00,13:27:00,17:10:00,20:38:00,22:27:00,24:45:00,26:20:00,27:53:00,29:47:27 28 | 2014,14,Frayah,Bartuska,F,29,Madison,WI,USA,2:13:00,4:30:00,5:44:00,8:08:00,10:24:00,12:27:00,16:00:00,19:26:00,21:23:00,23:50:00,26:00:00,27:57:00,29:56:58 29 | 2014,24,Cody,Braford,M,38,Silverton,CO,USA,1:36:00,4:14:00,5:21:00,,10:16:00,12:34:00,16:25:00,20:10:00,22:07:00,24:33:00,26:20:00,28:04:00,30:03:23 30 | 2014,88,Chris,Hanson,M,43,Nisswa,MN,USA,2:19:00,4:30:00,5:40:00,8:08:00,10:40:00,12:50:00,17:01:00,20:57:00,22:45:00,25:09:00,26:45:00,28:27:00,30:26:43 31 | 2014,132,Cory,Mahlke,M,38,Minneapolis,MN,USA,1:52:00,3:56:00,5:05:00,7:39:00,10:05:00,12:10:00,15:57:00,19:26:00,21:23:00,23:52:00,26:00:00,28:03:00,30:41:22 32 | 2014,76,Greg,Geiger,M,35,Mendota Heights,MN,USA,1:52:00,4:02:00,5:28:00,7:39:00,10:05:00,12:50:00,17:18:00,20:57:00,22:45:00,25:15:00,26:40:00,28:32:00,30:43:23 33 | 2014,139,Travis,Mccathie,M,33,Richfield,MN,USA,1:52:00,3:55:00,4:58:00,7:11:00,9:27:00,11:32:00,15:41:00,18:50:00,20:50:00,23:52:00,25:40:00,28:03:00,31:03:52 34 | 2014,217,Johanna,Ylanen,F,32,Pirkkala,Other,Finland,2:15:00,4:24:00,5:33:00,8:08:00,10:40:00,13:00:00,17:10:00,21:14:00,23:13:00,25:38:00,27:05:00,28:55:00,31:08:10 35 | 2014,160,Tony,Pierce,M,36,Grand Rapids,MN,USA,2:13:00,4:34:00,5:54:00,8:47:00,11:15:00,13:35:00,17:23:00,20:57:00,23:05:00,26:01:00,27:50:00,29:18:00,31:15:42 36 | 2014,185,Leslie,Semler,F,33,Hermantown,MN,USA,2:09:00,4:16:00,5:28:00,8:03:00,10:24:00,12:34:00,16:07:00,19:14:00,21:04:00,23:30:00,25:30:00,28:03:00,31:28:28 37 | 2014,190,Steve,Sorenson,M,49,Blair,NE,USA,1:59:00,4:14:00,5:21:00,7:39:00,10:16:00,12:34:00,16:30:00,20:18:00,22:19:00,24:45:00,26:45:00,28:44:00,31:31:51 38 | 2014,66,Sean,Faulk,M,41,Bloomington,MN,USA,2:10:00,4:22:00,5:33:00,9:25:00,10:50:00,13:19:00,17:18:00,20:57:00,23:05:00,25:52:00,27:30:00,29:18:00,31:34:58 39 | 2014,119,Kevin,Langton,M,44,Mankato,MN,USA,2:15:00,4:34:00,5:54:00,8:35:00,11:15:00,13:58:00,17:59:00,21:42:00,23:25:00,26:01:00,,29:14:00,31:36:09 40 | 2014,211,Nicholas,Whitbread,M,33,"Shuniah, P7A 0R4",ON,Canada,2:20:00,4:45:00,6:04:00,8:47:00,11:35:00,13:58:00,17:59:00,22:15:00,23:50:00,26:07:00,,29:29:00,31:48:20 41 | 2014,222,Jerry,Frost,M,58,St. Louis,MO,USA,2:36:00,5:05:00,6:27:00,9:15:00,11:58:00,14:19:00,,22:15:00,23:56:00,26:01:00,,29:35:00,31:51:04 42 | 2014,196,Marcus,Taintor,M,32,Duluth,MN,USA,2:09:00,4:11:00,5:21:00,7:39:00,10:24:00,12:50:00,17:01:00,20:38:00,22:33:00,25:38:00,27:25:00,29:29:00,32:06:29 43 | 2014,70,Terry,Fletcher,M,22,West Allis,WI,USA,1:59:00,4:11:00,5:33:00,8:17:00,10:50:00,13:00:00,17:18:00,21:26:00,23:25:00,25:53:00,,29:35:00,32:08:08 44 | 2014,65,Erik,Elmstrand,M,25,Duluth,MN,USA,2:10:00,4:24:00,5:44:00,8:08:00,10:50:00,13:00:00,17:01:00,20:38:00,22:45:00,25:28:00,27:25:00,29:14:00,32:17:40 45 | 2014,151,Nick,Nygaard,M,24,Otsego,MN,USA,2:10:00,4:24:00,5:44:00,8:08:00,10:50:00,13:00:00,17:01:00,20:38:00,22:45:00,25:28:00,27:15:00,29:14:00,32:17:41 46 | 2014,54,David,Dickey,M,24,Duluth,MN,USA,2:10:00,4:24:00,5:44:00,8:08:00,10:50:00,13:00:00,17:01:00,20:38:00,22:45:00,25:28:00,27:25:00,29:14:00,32:17:42 47 | 2014,172,Raymond,Rolling,M,25,Center City,MN,USA,2:09:00,4:24:00,5:44:00,8:08:00,,13:00:00,17:01:00,20:38:00,22:45:00,25:28:00,27:05:00,28:55:00,32:17:42 48 | 2014,169,Will,Richter,M,33,Grand Rapids,MN,USA,2:13:00,4:39:00,5:57:00,8:47:00,11:15:00,13:35:00,17:52:00,21:26:00,23:25:00,26:07:00,27:50:00,29:35:00,32:20:38 49 | 2014,99,Scott,Huston,M,50,Minneapolis,MN,USA,2:17:00,4:40:00,5:57:00,8:47:00,11:15:00,13:58:00,18:36:00,22:28:00,24:18:00,26:48:00,28:25:00,30:16:00,32:21:59 50 | 2014,129,Tim,Lupfer,M,33,Minneapolis,MN,USA,2:13:00,4:34:00,5:54:00,8:30:00,11:15:00,13:58:00,18:55:00,22:51:00,24:35:00,26:50:00,28:15:00,29:50:00,32:28:40 51 | 2014,26,Jim,Brown,M,56,Cedar Grove,WI,USA,2:19:00,4:45:00,6:04:00,8:53:00,11:55:00,14:19:00,18:36:00,22:28:00,24:10:00,26:45:00,28:25:00,30:16:00,32:39:53 52 | 2014,104,Kathy,Jambor,F,48,Eagan,MN,USA,2:01:00,4:29:00,5:49:00,8:30:00,11:05:00,13:14:00,17:18:00,21:26:00,23:25:00,26:01:00,27:50:00,29:52:00,32:41:48 53 | 2014,156,Blake,Paulson,M,41,Louisville,KY,USA,1:52:00,4:07:00,5:21:00,8:03:00,10:24:00,12:50:00,17:27:00,21:42:00,23:25:00,26:15:00,27:59:00,30:10:00,32:51:18 54 | 2014,167,Jason,Rezac,M,41,St. Louis Park,MN,USA,2:19:00,4:45:00,5:57:00,8:47:00,11:15:00,13:58:00,18:21:00,22:51:00,24:35:00,27:23:00,29:00:00,31:08:00,32:56:24 55 | 2014,28,Michael,Bunda,M,33,Minneapolis,MN,USA,2:17:00,4:34:00,5:54:00,8:30:00,11:05:00,13:19:00,17:18:00,21:26:00,23:25:00,26:07:00,28:09:00,30:25:00,33:02:03 56 | 2014,148,Peter,Newton,M,33,Ann Arbor,MI,USA,2:19:00,4:35:00,5:40:00,8:17:00,11:05:00,13:35:00,18:21:00,22:28:00,24:18:00,26:52:00,28:30:00,30:45:00,33:03:17 57 | 2014,163,Richard,Plezia,M,56,Morton Grove,IL,USA,2:40:00,5:10:00,6:27:00,9:25:00,12:05:00,14:44:00,19:15:00,23:11:00,25:00:00,27:33:00,29:30:00,31:09:00,33:13:25 58 | 2014,9,Michael,Arnold,M,31,Minneapolis,MN,USA,1:59:00,4:11:00,5:21:00,8:03:00,10:40:00,12:50:00,17:10:00,20:57:00,23:25:00,26:15:00,28:09:00,30:31:00,33:22:32 59 | 2014,189,Mark,Smith,M,35,Coon Rapids,MN,USA,1:56:00,4:11:00,5:21:00,7:39:00,10:05:00,12:27:00,16:25:00,20:10:00,22:33:00,25:10:00,27:15:00,30:05:00,33:30:05 60 | 2014,215,Brian,Woods,M,49,Saint Cloud,MN,USA,2:20:00,,6:25:00,9:15:00,11:58:00,14:44:00,18:36:00,22:35:00,24:35:00,27:03:00,28:45:00,30:45:00,33:30:11 61 | 2014,5,Steven,Andersson,M,38,Stillwater,MN,USA,1:59:00,4:16:00,5:44:00,8:30:00,11:05:00,13:27:00,17:52:00,21:26:00,23:25:00,26:45:00,28:25:00,30:45:00,33:42:33 62 | 2014,56,Susan,Donnelly,F,51,Oak Ridge,TN,USA,2:36:00,5:05:00,6:25:00,9:15:00,11:55:00,14:09:00,18:21:00,22:15:00,24:10:00,26:45:00,28:55:00,31:08:00,33:45:41 63 | 2014,31,Gregory,Byrd,M,44,Minneapolis,MN,USA,2:15:00,4:40:00,5:57:00,8:53:00,11:55:00,14:19:00,18:36:00,22:35:00,24:35:00,27:10:00,29:00:00,31:08:00,33:53:52 64 | 2014,201,Liam,Thier,M,38,Juneau,AK,USA,1:56:00,4:14:00,5:33:00,8:17:00,10:40:00,13:14:00,19:23:00,23:40:00,25:35:00,28:05:00,,31:52:00,33:57:20 65 | 2014,182,Dave,Schuneman,M,36,Duluth,MN,USA,1:48:00,3:59:00,5:16:00,8:08:00,11:05:00,13:44:00,18:21:00,22:35:00,24:35:00,27:52:00,29:35:00,,34:09:09 66 | 2014,64,Terry,Eldien,M,43,Fergus Falls,MN,USA,2:40:00,5:05:00,6:30:00,9:25:00,12:25:00,14:54:00,19:40:00,23:24:00,25:20:00,28:05:00,29:50:00,31:52:00,34:09:21 67 | 2014,206,Jared,Vanderhook,M,30,Minneapolis,MN,USA,2:17:00,4:34:00,5:54:00,8:30:00,11:15:00,13:44:00,18:21:00,22:15:00,24:10:00,27:27:00,29:20:00,31:32:00,34:13:17 68 | 2014,71,Ryan,Flynn,M,34,Esko,MN,USA,1:52:00,4:07:00,5:28:00,8:08:00,10:40:00,12:50:00,17:18:00,21:42:00,24:42:00,,29:20:00,31:34:00,34:16:41 69 | 2014,187,Eric,Skocaj,M,28,Pekin,IL,USA,2:33:00,5:10:00,6:36:00,9:30:00,12:33:00,15:30:00,20:17:00,24:22:00,26:35:00,29:06:00,30:40:00,32:38:00,34:26:25 70 | 2014,120,Jeff,Lanners,M,31,South Saint Paul,MN,USA,1:52:00,4:00:00,5:16:00,7:39:00,10:40:00,12:50:00,17:52:00,21:42:00,23:25:00,26:16:00,28:45:00,31:08:00,34:28:54 71 | 2014,47,Tom,Cotter,M,42,Green Bay,WI,USA,2:35:00,5:17:00,6:43:00,9:47:00,12:33:00,15:11:00,19:23:00,23:11:00,25:00:00,27:42:00,29:30:00,31:39:00,34:29:16 72 | 2014,136,Scott,Mark,M,43,Roseville,MN,USA,2:42:00,5:17:00,6:43:00,9:30:00,12:25:00,14:54:00,19:15:00,23:11:00,25:00:00,27:43:00,29:40:00,31:52:00,34:32:49 73 | 2014,18,Mike,Birkenheier,M,27,Plainfield,IL,USA,2:33:00,5:10:00,6:36:00,9:30:00,12:33:00,15:30:00,20:41:00,24:22:00,26:35:00,28:51:00,30:40:00,32:38:00,34:34:39 74 | 2014,133,Rob,Mann,M,42,Prunedale,CA,USA,2:42:00,5:38:00,7:07:00,10:30:00,13:35:00,16:20:00,21:24:00,25:03:00,26:56:00,29:18:00,31:00:00,32:38:00,34:47:14 75 | 2014,79,Mike,Gorski,M,40,Des Moines,IA,USA,2:19:00,4:30:00,5:49:00,8:35:00,11:35:00,14:09:00,18:55:00,22:35:00,24:35:00,27:47:00,29:55:00,32:03:00,34:48:02 76 | 2014,203,David,Uhlir,M,45,Grand Forks,ND,USA,2:20:00,4:40:00,5:57:00,8:35:00,11:05:00,13:27:00,17:52:00,22:51:00,25:12:00,27:57:00,29:55:00,32:03:00,34:51:02 77 | 2014,197,John W,Taylor,M,52,Minneapolis,MN,USA,2:33:00,5:00:00,6:25:00,9:15:00,11:55:00,14:44:00,19:15:00,23:11:00,25:12:00,27:56:00,29:55:00,32:03:00,34:51:06 78 | 2014,177,Daryl,Saari,M,51,Rochester,MN,USA,2:20:00,5:05:00,6:43:00,9:58:00,13:12:00,15:44:00,19:54:00,23:24:00,25:35:00,27:56:00,,32:03:00,34:51:07 79 | 2014,153,Paul,Olson,M,40,Blaine,MN,USA,2:19:00,4:40:00,5:57:00,9:02:00,11:58:00,14:44:00,19:15:00,23:11:00,25:35:00,28:13:00,,32:06:00,34:52:22 80 | 2014,181,Peter,Schnorbach,M,51,Edina,MN,USA,2:20:00,4:50:00,6:16:00,9:15:00,11:58:00,14:44:00,19:15:00,23:11:00,25:04:00,27:47:00,,32:03:00,34:53:09 81 | 2014,186,Shawn,Severson,F,41,Alexandria,MN,USA,2:19:00,4:39:00,5:57:00,8:47:00,11:15:00,,18:55:00,23:11:00,25:00:00,27:50:00,30:10:00,32:31:00,34:53:22 82 | 2014,202,Jack,Tinucci,M,25,Woodbury,MN,USA,2:20:00,4:45:00,,8:47:00,11:35:00,14:19:00,20:41:00,24:57:00,26:25:00,29:14:00,31:00:00,32:51:00,34:56:45 83 | 2014,87,Aaron,Hansen,M,33,Minneapolis,MN,USA,2:13:00,4:30:00,5:44:00,8:08:00,10:24:00,12:34:00,17:01:00,21:14:00,23:25:00,26:45:00,28:50:00,31:20:00,34:59:52 84 | 2014,22,Veronique,Boucher,F,45,Toronto,ON,Canada,2:33:00,5:05:00,6:30:00,9:30:00,12:25:00,15:11:00,19:40:00,23:40:00,25:45:00,28:46:00,30:35:00,32:38:00,35:00:43 85 | 2014,90,Benjamin,Hawes,M,28,Dorset,OH,USA,2:19:00,4:40:00,5:57:00,8:53:00,11:55:00,14:44:00,19:15:00,23:11:00,25:04:00,27:59:00,29:55:00,32:31:00,35:03:22 86 | 2014,110,Aaron,Kennedy,M,35,Minneapolis,MN,USA,2:13:00,4:40:00,6:04:00,8:53:00,11:58:00,15:11:00,19:40:00,23:24:00,25:20:00,27:51:00,29:55:00,32:03:00,35:05:43 87 | 2014,57,Kurt,Drengler,M,32,Duluth,MN,USA,2:54:00,5:46:00,7:07:00,9:58:00,13:12:00,16:01:00,21:07:00,27:00:00,,29:37:00,31:15:00,33:18:00,35:09:39 88 | 2014,173,Wesley,Rolnick,M,26,Saratoga Springs,NY,USA,2:19:00,4:53:00,6:25:00,9:02:00,11:55:00,14:44:00,19:15:00,23:11:00,25:04:00,27:56:00,,32:03:00,35:13:51 89 | 2014,20,Greg,Bores,M,50,Prior Lake,MN,USA,2:19:00,5:00:00,6:30:00,9:47:00,12:45:00,15:44:00,20:17:00,24:22:00,26:00:00,28:45:00,30:40:00,32:38:00,35:13:58 90 | 2014,27,Kurt,Brown,M,47,Lacrosse,WI,USA,2:34:00,5:17:00,6:43:00,9:30:00,12:33:00,15:11:00,19:40:00,23:24:00,25:12:00,28:11:00,30:15:00,32:31:00,35:25:30 91 | 2014,46,J.D.,Coolidge,M,40,Braham,MN,USA,2:20:00,4:50:00,6:25:00,9:15:00,12:05:00,15:00:00,19:40:00,23:40:00,25:45:00,28:45:00,30:30:00,32:31:00,35:25:44 92 | 2014,58,Terry,Dreves,F,50,Houghton,MI,USA,,5:10:00,6:36:00,9:30:00,12:25:00,15:00:00,19:40:00,23:40:00,25:45:00,28:32:00,30:35:00,32:51:00,35:34:01 93 | 2014,137,Roberto,Marron,M,39,St. Paul,MN,USA,2:24:00,4:45:00,6:07:00,9:02:00,11:58:00,15:00:00,19:40:00,23:49:00,26:25:00,29:12:00,31:10:00,33:18:00,35:38:16 94 | 2014,101,David,Infante,M,50,Albuquerque,NM,USA,2:19:00,4:39:00,5:57:00,8:47:00,11:55:00,14:44:00,19:15:00,23:11:00,25:35:00,28:29:00,30:20:00,32:31:00,35:41:20 95 | 2014,149,Kamie,Nicholls,F,36,Coon Rapids,MN,USA,2:36:00,5:17:00,6:43:00,9:47:00,12:45:00,15:20:00,20:17:00,23:49:00,26:00:00,29:00:00,31:00:00,33:18:00,35:44:56 96 | 2014,144,Geoff,Moffat,M,36,Crystal Lake,IL,USA,2:17:00,4:45:00,6:04:00,9:15:00,12:45:00,15:30:00,20:17:00,24:22:00,26:10:00,28:58:00,30:55:00,33:08:00,35:50:24 97 | 2014,134,Jenny,Marietta,F,37,River Falls,WI,USA,2:20:00,4:53:00,6:16:00,9:15:00,11:58:00,14:19:00,18:55:00,23:40:00,25:45:00,28:39:00,,32:51:00,35:55:25 98 | 2014,86,Jeffrey,Hainlen,M,31,Bloomington,MN,USA,2:20:00,,6:07:00,9:02:00,12:05:00,14:54:00,20:17:00,24:07:00,26:25:00,29:11:00,31:15:00,33:18:00,35:58:07 99 | 2014,165,Christopher,Reed,M,31,Astoria,NY,USA,2:20:00,4:50:00,6:16:00,9:02:00,12:05:00,14:54:00,20:17:00,24:07:00,26:25:00,29:20:00,31:20:00,33:18:00,35:58:07 100 | 2014,159,Josh,Phillips,M,33,Milwaukee,WI,USA,2:35:00,5:03:00,6:25:00,9:15:00,12:05:00,14:47:00,19:15:00,23:49:00,26:00:00,28:46:00,31:10:00,33:18:00,36:00:57 101 | 2014,50,Harold,Curioz,M,29,Bloomington,MN,USA,2:24:00,,6:27:00,9:30:00,12:25:00,15:30:00,20:41:00,25:03:00,27:10:00,29:40:00,32:00:00,34:01:00,36:02:11 102 | 2014,194,Todd,Sullivan,M,40,Fort Wayne,IN,USA,2:33:00,5:03:00,6:27:00,9:30:00,12:33:00,15:44:00,20:41:00,24:22:00,26:35:00,29:18:00,31:10:00,33:08:00,36:02:12 103 | 2014,118,Zachary,Lamb,M,38,Lakewood,CO,USA,2:34:00,5:10:00,6:30:00,9:25:00,12:25:00,15:30:00,20:41:00,24:22:00,26:35:00,29:17:00,31:10:00,33:08:00,36:02:14 104 | 2014,171,Jeff,Rock,M,42,Cloquet,MN,USA,2:20:00,5:05:00,6:43:00,9:58:00,13:12:00,16:10:00,21:07:00,25:03:00,27:10:00,30:04:00,31:50:00,33:30:00,36:05:35 105 | 2014,192,Nicholas,Stoneman,M,54,Faribault,MN,USA,2:36:00,5:17:00,6:43:00,9:30:00,12:33:00,15:20:00,20:41:00,25:03:00,27:10:00,30:00:00,32:00:00,33:48:00,36:08:41 106 | 2014,124,Kate,Leis,F,37,Delano,MN,USA,2:35:00,5:17:00,6:43:00,9:47:00,12:45:00,15:20:00,20:17:00,24:07:00,26:25:00,29:17:00,31:20:00,33:23:00,36:14:30 107 | 2014,212,Mike,Witt,M,51,Glidden,WI,USA,2:20:00,4:45:00,6:07:00,9:02:00,11:58:00,14:47:00,19:54:00,24:07:00,26:10:00,29:04:00,31:10:00,33:23:00,36:15:33 108 | 2014,176,Kathleen,Rytman,F,46,Cudahy,WI,USA,2:20:00,4:45:00,6:07:00,9:02:00,11:58:00,14:47:00,19:54:00,24:07:00,26:10:00,28:57:00,31:10:00,33:23:00,36:15:35 109 | 2014,126,Jeremy,Lindquist,M,27,Stillwater,MN,USA,2:24:00,5:00:00,6:27:00,9:25:00,12:25:00,14:54:00,20:17:00,25:14:00,26:56:00,29:32:00,31:45:00,33:48:00,36:18:15 110 | 2014,128,Matt,Long,M,39,Red Lake,ON,Canada,,4:30:00,5:57:00,8:47:00,11:55:00,14:27:00,19:23:00,23:40:00,26:00:00,29:23:00,31:50:00,34:09:00,36:19:55 111 | 2014,230,Michael,Gruber,M,30,Sanford,NC,USA,2:42:00,5:38:00,7:07:00,10:36:00,13:35:00,16:34:00,22:32:00,25:29:00,27:28:00,30:15:00,32:00:00,33:48:00,36:28:02 112 | 2014,158,Josh,Peterson,M,31,Minneapolis,MN,USA,2:42:00,5:28:00,7:07:00,10:30:00,13:12:00,16:34:00,22:32:00,25:29:00,27:28:00,30:15:00,31:50:00,33:48:00,36:28:24 113 | 2014,68,Troy,Feustel,M,39,Apple Valley,MN,USA,2:40:00,5:28:00,6:59:00,10:30:00,13:47:00,16:34:00,22:32:00,25:46:00,27:40:00,30:34:00,32:15:00,34:01:00,36:33:31 114 | 2014,59,Gary,Dudney,M,61,Salinas,CA,USA,2:42:00,5:28:00,7:07:00,10:36:00,13:35:00,16:20:00,21:24:00,25:03:00,27:10:00,30:08:00,31:55:00,34:01:00,36:41:45 115 | 2014,94,Carole,Holley,F,39,Anchorage,AK,USA,2:24:00,5:03:00,6:30:00,,13:12:00,15:30:00,20:41:00,25:03:00,27:10:00,29:40:00,32:00:00,34:01:00,36:53:43 116 | 2014,69,Matthew,Fisher,M,35,Austin,TX,USA,2:15:00,4:40:00,6:04:00,8:53:00,11:58:00,15:11:00,20:17:00,25:03:00,27:12:00,30:12:00,32:15:00,34:09:00,36:56:10 117 | 2014,188,Shane,Skowron,M,26,Woodside,NY,USA,2:20:00,4:50:00,6:16:00,9:15:00,12:05:00,15:20:00,20:41:00,24:57:00,27:10:00,30:02:00,31:50:00,34:01:00,36:56:28 118 | 2014,98,Peter,Hulbert,M,35,Edina,MN,USA,2:42:00,5:28:00,6:59:00,9:58:00,13:12:00,16:20:00,22:32:00,25:29:00,27:28:00,30:18:00,32:15:00,34:17:00,36:58:52 119 | 2014,13,Maria,Barton,F,48,Apple Valley,MN,USA,2:17:00,4:50:00,6:16:00,9:15:00,11:58:00,14:54:00,19:54:00,24:22:00,26:44:00,29:44:00,31:40:00,34:01:00,36:59:06 120 | 2014,223,John,Gaich,M,58,Des Moines,IA,USA,2:20:00,5:00:00,6:27:00,9:25:00,12:25:00,15:30:00,20:41:00,25:03:00,27:10:00,29:40:00,31:50:00,34:01:00,37:02:50 121 | 2014,38,Justin,Chapman,M,35,Rochester,MN,USA,2:35:00,5:10:00,6:30:00,9:47:00,12:45:00,17:20:00,21:07:00,25:14:00,27:28:00,30:17:00,32:00:00,34:09:00,37:03:54 122 | 2014,39,Katie,Chapman,F,31,Rochester,MN,USA,2:35:00,5:10:00,6:30:00,9:47:00,12:45:00,16:01:00,21:07:00,25:14:00,27:28:00,30:17:00,32:00:00,34:09:00,37:03:54 123 | 2014,72,John,Focke,M,34,Minneapolis,MN,USA,2:20:00,4:40:00,5:57:00,8:53:00,11:55:00,14:19:00,19:15:00,23:40:00,25:35:00,28:44:00,31:00:00,33:30:00,37:08:10 124 | 2014,37,Tony,Cesario,M,50,Frankfort,IL,USA,2:19:00,4:34:00,5:54:00,8:47:00,11:55:00,14:44:00,20:17:00,24:57:00,27:10:00,30:15:00,32:15:00,34:09:00,37:10:33 125 | 2014,213,Michael,Wolkowicz,M,28,New Lenox,IL,USA,2:20:00,4:40:00,5:57:00,8:47:00,11:55:00,14:27:00,20:17:00,24:57:00,27:10:00,30:28:00,32:50:00,34:17:00,37:10:33 126 | 2014,164,Nicholas,Prebeg,M,35,San Diego,CA,USA,1:48:00,3:51:00,5:05:00,7:39:00,10:40:00,13:19:00,18:36:00,23:40:00,25:20:00,27:59:00,,32:31:00,37:10:46 127 | 2014,210,Joe,Weise,M,34,Ely,MN,USA,2:34:00,5:03:00,6:36:00,9:47:00,13:12:00,16:01:00,21:07:00,25:03:00,27:12:00,30:14:00,31:50:00,33:48:00,37:17:44 128 | 2014,138,Dan,Mattimiro,M,52,Hastings,MN,USA,2:40:00,5:17:00,6:43:00,9:47:00,12:45:00,16:01:00,22:32:00,26:00:00,28:05:00,30:50:00,32:50:00,34:42:00,37:23:09 129 | 2014,53,Tracy,Denbleyker,F,43,Fennville,MI,USA,2:19:00,4:45:00,6:07:00,9:15:00,11:58:00,14:44:00,19:40:00,24:07:00,,30:04:00,32:50:00,34:42:00,37:23:44 130 | 2014,200,Travis,Thiede,M,40,Apple Valley,MN,USA,2:36:00,5:10:00,6:43:00,9:58:00,13:12:00,16:10:00,22:32:00,26:00:00,28:05:00,30:50:00,32:50:00,34:43:00,37:27:55 131 | 2014,97,Jon,Howard,M,34,Osseo,MN,USA,2:36:00,5:10:00,6:43:00,9:58:00,12:45:00,15:30:00,20:17:00,24:22:00,26:25:00,29:25:00,31:40:00,34:01:00,37:30:34 132 | 2014,8,Anjanette,Arnold,F,38,Little Canada,MN,USA,2:33:00,5:22:00,6:43:00,9:58:00,12:45:00,16:01:00,21:07:00,25:14:00,27:40:00,31:02:00,33:00:00,34:47:00,37:32:45 133 | 2014,16,Julie,Berg,F,49,Big Lake,MN,USA,2:33:00,5:10:00,6:43:00,9:58:00,13:12:00,16:20:00,22:32:00,25:46:00,28:05:00,30:50:00,33:00:00,34:50:00,37:39:10 134 | 2014,108,Stuart,Johnson,M,55,Shawnee,KS,USA,2:40:00,5:28:00,6:52:00,9:58:00,13:12:00,15:30:00,20:17:00,24:22:00,27:49:00,29:34:00,31:55:00,34:17:00,37:39:34 135 | 2014,40,Kevin,Clark,M,23,Trevor,WI,USA,1:59:00,4:06:00,5:16:00,8:03:00,10:50:00,13:27:00,18:55:00,23:24:00,26:10:00,29:34:00,31:55:00,34:17:00,37:40:47 136 | 2014,142,Matt,Miller,M,31,Minneapolis,MN,USA,2:20:00,4:40:00,6:04:00,8:53:00,11:55:00,14:44:00,19:15:00,22:51:00,25:04:00,28:33:00,30:35:00,33:23:00,37:42:34 137 | 2014,180,Jordan,Schmidt,M,20,Ramsey,MN,USA,2:24:00,5:05:00,6:30:00,9:25:00,12:05:00,14:54:00,19:40:00,24:07:00,26:25:00,29:40:00,31:45:00,34:09:00,37:54:38 138 | 2014,95,Allan,Holtz,M,64,Oakdale,MN,USA,2:54:00,5:55:00,7:40:00,10:36:00,13:35:00,16:10:00,21:07:00,25:29:00,27:40:00,30:40:00,33:05:00,35:09:00, 139 | 2014,121,Aaron,Larson,M,36,Slayton,MN,USA,2:24:00,5:05:00,6:43:00,9:58:00,13:12:00,16:20:00,22:32:00,25:46:00,28:05:00,31:13:00,33:05:00,35:30:00, 140 | 2014,198,Peter,Taylor,M,37,Duluth,MN,USA,2:36:00,5:22:00,6:43:00,9:58:00,13:12:00,16:01:00,21:07:00,25:14:00,,30:50:00,,35:30:00, 141 | 2014,115,Seth,Korhonen,M,20,Brule,WI,USA,2:20:00,4:40:00,6:04:00,8:53:00,11:35:00,13:44:00,17:52:00,21:26:00,23:25:00,26:45:00,4:30:00,, 142 | 2014,6,April,Anselmo (Cole),F,29,Hammond,WI,USA,1:52:00,3:55:00,4:58:00,7:11:00,9:21:00,11:08:00,14:15:00,17:22:00,19:05:00,21:39:00,24:00:00,, 143 | 2014,229,Mikhail,Titov,M,32,Saint Paul,MN,USA,,5:03:00,6:30:00,9:47:00,12:45:00,15:30:00,22:32:00,27:00:00,29:09:00,31:55:00,33:40:00,, 144 | 2014,174,Kris,Rosenbush,F,43,Stewartville,MN,USA,2:20:00,5:22:00,6:43:00,9:47:00,12:33:00,15:20:00,19:40:00,23:49:00,26:25:00,29:47:00,35:00:00,, 145 | 2014,3,Greg,Allen,M,49,Bloomington,MN,USA,2:42:00,5:46:00,7:40:00,10:36:00,13:55:00,,23:07:00,26:41:00,29:00:00,32:07:00,35:00:00,, 146 | 2014,166,Aaron,Reeves,M,40,Rochester,MN,USA,2:19:00,4:45:00,6:04:00,9:02:00,11:55:00,14:27:00,19:23:00,23:24:00,25:35:00,28:53:00,,, 147 | 2014,25,Jocelyn,Briggs,F,38,Whitby,ON,Canada,2:40:00,5:10:00,6:43:00,9:30:00,12:33:00,15:44:00,20:41:00,24:57:00,27:40:00,31:41:00,,, 148 | 2014,183,Bastiaan,Schuttevaer,M,43,Linden,NJ,USA,2:17:00,4:50:00,6:16:00,9:15:00,12:05:00,15:20:00,20:41:00,25:29:00,27:40:00,31:41:00,,, 149 | 2014,216,Pam,Wright,F,42,Hudson,WI,USA,2:17:00,4:40:00,6:07:00,8:53:00,11:35:00,14:44:00,19:23:00,24:57:00,28:05:00,32:41:00,,, 150 | 2014,30,Joel,Button,M,46,Stillwater,MN,USA,2:40:00,5:22:00,6:52:00,9:58:00,13:12:00,16:20:00,21:24:00,25:46:00,4:21:00,,,, 151 | 2014,220,John,Zalewski,M,49,Chicago,IL,USA,2:15:00,4:35:00,5:57:00,8:47:00,11:35:00,14:09:00,18:55:00,23:24:00,26:10:00,,,, 152 | 2014,42,Terry,Coffey,M,53,Inver Grove Heights,MN,USA,2:17:00,4:40:00,6:07:00,8:53:00,11:35:00,14:44:00,19:23:00,24:22:00,26:25:00,,,, 153 | 2014,43,Guy,Comer,M,43,Middleton,WI,USA,2:20:00,5:00:00,6:27:00,9:30:00,12:25:00,15:30:00,21:24:00,26:00:00,29:24:00,,,, 154 | 2014,52,Gary,Davis,M,51,Des Moines,IA,USA,2:24:00,5:28:00,7:12:00,10:49:00,14:25:00,,22:32:00,25:46:00,30:46:00,,,, 155 | 2014,135,Paul,Marietta,M,37,River Falls,WI,USA,2:19:00,4:50:00,6:16:00,9:15:00,11:55:00,14:19:00,18:55:00,23:40:00,,,,, 156 | 2014,152,Terence,O'Brien,M,47,St. Paul,MN,USA,1:48:00,4:02:00,5:21:00,8:08:00,10:50:00,13:27:00,18:55:00,23:49:00,,,,, 157 | 2014,209,Mike,Wargo,M,26,Lakewood,OH,USA,2:24:00,5:03:00,6:25:00,9:25:00,12:25:00,15:20:00,19:54:00,25:00:00,,,,, 158 | 2014,45,Shelley,Cook,F,39,Waukegan,IL,USA,2:15:00,,6:07:00,9:02:00,12:05:00,15:20:00,20:51:00,25:46:00,,,,, 159 | 2014,15,Alec,Bath,M,44,Waukegan,IL,USA,2:15:00,4:40:00,6:07:00,9:02:00,12:05:00,15:20:00,20:51:00,25:46:00,,,,, 160 | 2014,82,Mark,Gregware,M,34,Minneapolis,MN,USA,2:40:00,5:22:00,6:52:00,9:58:00,13:25:00,16:10:00,20:51:00,27:10:00,,,,, 161 | 2014,147,Dan,Nelsen,M,50,Knapp,WI,USA,2:36:00,5:22:00,6:59:00,10:32:00,13:25:00,16:34:00,23:07:00,27:40:00,,,,, 162 | 2014,19,Joseph,Boler,M,34,Hastings,MN,USA,1:39:00,3:34:00,4:41:00,6:51:00,8:58:00,10:42:00,13:48:00,,,,,, 163 | 2014,7,Dylan,Armajani,M,29,New York,NY,USA,1:39:00,3:30:00,4:35:00,6:37:00,8:38:00,10:24:00,14:22:00,,,,,, 164 | 2014,125,Alex,Lietzan,M,30,Valparaiso,IN,USA,1:56:00,4:00:00,5:05:00,7:16:00,9:46:00,11:52:00,16:30:00,,,,,, 165 | 2014,63,Aaron,Ehlers,M,26,St. Paul,MN,USA,2:01:00,4:11:00,5:21:00,7:39:00,10:05:00,11:52:00,18:00:00,,,,,, 166 | 2014,130,Matt,Lutz,M,29,Brooklyn Park,MN,USA,2:10:00,4:30:00,5:40:00,8:35:00,11:15:00,13:58:00,19:25:00,,,,,, 167 | 2014,4,Tim,Altmann,M,43,Eden Prairie,MN,USA,2:42:00,5:22:00,6:43:00,9:47:00,12:45:00,15:30:00,20:40:00,,,,,, 168 | 2014,193,Katie,Strong,F,32,Anchorage,AK,USA,2:17:00,4:30:00,5:49:00,8:30:00,11:05:00,13:14:00,21:00:00,,,,,, 169 | 2014,60,Allan,Duffy,M,44,Columbus,MN,USA,2:20:00,5:00:00,6:25:00,,12:33:00,15:30:00,21:24:00,,,,,, 170 | 2014,106,Ross,Jilk,M,49,River Falls,WI,USA,2:20:00,5:00:00,6:25:00,9:25:00,12:33:00,15:44:00,21:24:00,,,,,, 171 | 2014,107,Andrew,Johnson,M,53,St. Paul,MN,USA,2:36:00,5:22:00,7:07:00,10:30:00,13:55:00,17:00:00,23:15:00,,,,,, 172 | 2014,102,Adam,Iverson,M,35,Minneapolis,MN,USA,2:40:00,5:28:00,7:12:00,10:36:00,14:06:00,17:00:00,23:35:00,,,,,, 173 | 2014,154,Meredith,Oneill,F,28,Richfield,MN,USA,2:54:00,5:46:00,7:22:00,10:49:00,14:25:00,17:35:00,23:35:00,,,,,, 174 | 2014,74,John,Freemore,M,39,Rochester,MN,USA,2:19:00,4:45:00,6:07:00,9:15:00,12:25:00,15:30:00,,,,,,, 175 | 2014,77,Matt,Goens,M,22,Clear Lake,SD,USA,2:19:00,4:45:00,6:07:00,9:15:00,12:25:00,15:30:00,,,,,,, 176 | 2014,84,Eric,Hadtrath,M,33,Cold Spring,MN,USA,2:15:00,4:34:00,5:54:00,8:47:00,11:15:00,13:58:00,,,,,,, 177 | 2014,191,Amie,Spieth,F,24,Minneapolis,MN,USA,1:56:00,4:14:00,5:33:00,8:17:00,10:40:00,13:14:00,,,,,,, 178 | 2014,162,Kyle,Pietari,M,28,Edgewater,CO,USA,1:33:00,3:14:00,4:06:00,6:03:00,7:58:00,11:50:00,,,,,,, 179 | 2014,41,Eric,Clifton,M,56,Winchester,CA,USA,1:33:00,3:30:00,4:49:00,7:39:00,10:50:00,13:35:00,,,,,,, 180 | 2014,75,Geoffrey,Fuller,M,28,Minneapolis,MN,USA,2:13:00,4:30:00,5:44:00,8:08:00,10:50:00,14:50:00,,,,,,, 181 | 2014,127,Christopher,Lofgren,M,30,St. Paul,MN,USA,2:15:00,,5:40:00,8:08:00,11:05:00,16:00:00,,,,,,, 182 | 2014,89,Janet,Hausken,F,49,Stillwater,MN,USA,2:20:00,5:00:00,6:27:00,9:47:00,12:45:00,16:00:00,,,,,,, 183 | 2014,224,Bill,Pomerenke,M,52,Apple Valley,MN,USA,2:34:00,5:10:00,6:43:00,9:30:00,12:33:00,16:34:00,,,,,,, 184 | 2014,178,Lynn,Saari,F,48,Rochester,MN,USA,2:42:00,5:28:00,7:12:00,10:36:00,13:47:00,17:30:00,,,,,,, 185 | 2014,100,Jason,Husveth,M,42,Marine On St. Croix,MN,USA,2:40:00,5:28:00,7:12:00,10:36:00,13:55:00,17:30:00,,,,,,, 186 | 2014,103,Nathan,Jackson,M,41,Green Bay,WI,USA,2:54:00,5:55:00,7:22:00,10:36:00,13:55:00,17:30:00,,,,,,, 187 | 2014,157,Timothy,Pearson,M,32,St. Paul,MN,USA,2:17:00,4:35:00,5:57:00,9:02:00,12:05:00,18:00:00,,,,,,, 188 | 2014,91,Maudie,Hegman,F,24,Edina,MN,USA,2:24:00,5:10:00,6:43:00,10:30:00,13:47:00,18:00:00,,,,,,, 189 | 2014,207,Joli,Vollers,F,50,Ames,IA,USA,2:36:00,5:17:00,6:52:00,9:58:00,13:35:00,18:23:00,,,,,,, 190 | 2014,78,John,Gonzalez,M,46,Sreamwood,IL,USA,1:52:00,3:56:00,5:16:00,7:39:00,10:40:00,,,,,,,, 191 | 2014,155,Thom,Patterson,M,52,Madison,WI,USA,2:01:00,4:19:00,5:33:00,8:03:00,10:50:00,,,,,,,, 192 | 2014,92,Ron,Hendrickson,M,48,Esko,MN,USA,2:13:00,4:40:00,5:57:00,9:02:00,12:05:00,,,,,,,, 193 | 2014,112,Peter,Klaas,M,53,Martofte,Other,Denmark EU,2:34:00,5:28:00,6:59:00,10:36:00,,,,,,,,, 194 | 2014,114,Jeff,Kolehmainen,M,41,Eagan,MN,USA,2:33:00,5:28:00,7:07:00,10:49:00,,,,,,,,, 195 | 2014,221,Katie,Zopf,F,35,Farmington,MI,USA,2:42:00,6:03:00,7:40:00,10:49:00,,,,,,,,, 196 | 2014,83,Andy,Gunsaullus,M,39,Alexandria,MN,USA,2:24:00,,7:40:00,10:49:00,,,,,,,,, 197 | 2014,29,Craig,Bunk,M,44,Muskego,WI,USA,2:35:00,4:14:00,5:49:00,,,,,,,,,, 198 | 2014,227,William,Barthen,M,38,La Crosse,WI,USA,1:52:00,3:59:00,6:04:00,,,,,,,,,, 199 | 2014,179,Dwayne,Sandall,M,47,Winnipeg,MB,Canada,2:17:00,4:26:00,6:04:00,,,,,,,,,, 200 | 2014,48,Shannon,Cousino,F,41,Duluth,MN,USA,3:00:00,6:24:00,8:17:00,,,,,,,,,, 201 | 2014,175,Lars,Ryberg Vikkelsoe,M,41,Kongens Lyngby,"DK, EU",Denmark EU,2:35:00,,9:44:00,,,,,,,,,, 202 | 2014,228,Nathan,Rylander,M,25,St. Paul,MN,USA,2:19:00,5:28:00,,,,,,,,,,, 203 | 2014,143,Peter,Mitchell,M,39,Belcourt,ND,USA,2:24:00,5:28:00,,,,,,,,,,, 204 | 2014,117,Scott,Kummer,M,42,Chicago,IL,USA,2:35:00,5:55:00,,,,,,,,,,, 205 | 2014,36,Jimmy,Cavezza,M,39,Wisconsin Dells,WI,USA,2:35:00,6:04:00,,,,,,,,,,, 206 | 2015,84,Jake,Hegge,M,24,Onalaska,WI,USA,1:18:00,2:53:00,3:40:00,5:30:00,7:20:00,8:39:00,10:56:00,13:00:00,14:07:00,,16:45:00,18:00:00,19:30:37 207 | 2015,14,Michael,Borst,M,22,La Crosse,WI,USA,1:18:00,2:53:00,3:40:00,5:30:00,7:20:00,8:39:00,10:58:00,13:14:00,14:31:00,,17:40:00,19:19:00,21:04:09 208 | 2015,117,Brian,Klug,M,36,Alexandria,MN,USA,1:38:00,3:23:00,4:37:00,6:32:00,8:27:00,10:12:00,13:08:00,16:42:00,17:23:00,,19:53:00,21:14:00,23:07:59 209 | 2015,233,Jeff,Vander Kooi,M,40,Zeeland,MI,USA,1:33:00,3:23:00,4:21:00,6:26:00,8:27:00,10:12:00,13:33:00,16:42:00,17:54:00,,21:11:00,22:48:00,24:26:59 210 | 2015,21,Brett,Busacker,M,30,Minnetonka,MN,USA,1:29:00,3:17:00,4:10:00,6:07:00,8:05:00,9:44:00,12:31:00,15:21:00,17:23:00,,21:35:00,23:06:00,24:51:10 211 | 2015,107,Darrin,Johnson,M,49,South Range,WI,USA,1:40:00,3:33:00,4:37:00,6:33:00,8:35:00,10:28:00,13:44:00,16:42:00,18:03:00,,21:35:00,23:06:00,24:55:35 212 | 2015,42,David,Dickey,M,25,Duluth,MN,USA,1:29:00,,4:10:00,6:11:00,8:20:00,9:52:00,12:50:00,16:42:00,17:23:00,,21:42:00,23:38:00,25:04:23 213 | 2015,243,Jeff,Williams,M,40,Fernie,BC,USA,1:38:00,3:33:00,4:45:00,6:59:00,9:13:00,11:08:00,14:16:00,17:02:00,19:19:00,,22:47:00,23:38:00,25:15:06 214 | 2015,228,Mark,Thompson,M,37,Iowa City,IA,USA,1:44:00,3:52:00,4:51:00,6:59:00,8:57:00,10:38:00,13:18:00,16:42:00,17:54:00,,22:04:00,23:38:00,25:32:47 215 | 2015,188,Mallory,Richard,F,30,Winnipeg,MB,USA,1:40:00,3:33:00,4:37:00,6:47:00,8:57:00,10:44:00,13:44:00,16:42:00,18:21:00,,22:04:00,23:38:00,25:36:47 216 | 2015,104,Tj,Jeannette,M,40,North Mankato,MN,USA,1:54:00,3:58:00,5:01:00,7:25:00,9:45:00,11:35:00,14:45:00,17:47:00,19:19:00,,22:47:00,24:16:00,25:55:56 217 | 2015,134,Alex,Lietzan,M,31,Duluth,MN,USA,1:42:00,3:33:00,4:37:00,6:43:00,8:57:00,10:55:00,14:30:00,18:05:00,20:47:00,,23:02:00,24:16:00,25:56:08 218 | 2015,5,Dylan,Armajani,M,30,New York,NY,USA,1:29:00,3:02:00,3:53:00,5:56:00,8:05:00,9:34:00,12:42:00,16:42:00,17:23:00,,22:04:00,23:42:00,26:20:05 219 | 2015,147,Travis,Mccathie,M,34,Richfield,MN,USA,1:42:00,3:33:00,4:37:00,6:46:00,8:57:00,10:38:00,13:44:00,16:42:00,19:19:00,,22:47:00,24:16:00,26:22:05 220 | 2015,201,Kurt,Schilling,M,34,St. Louis,MO,USA,1:38:00,3:38:00,4:45:00,6:59:00,9:08:00,10:38:00,13:18:00,16:42:00,17:54:00,,23:02:00,24:37:00,26:43:27 221 | 2015,149,Jeff,Miller,M,50,Albert Lea,MN,USA,1:38:00,3:33:00,4:37:00,6:59:00,9:13:00,11:08:00,14:16:00,17:32:00,19:19:00,,23:02:00,24:37:00,26:49:40 222 | 2015,195,Adam,Rood,M,35,Omaha,NE,USA,1:49:00,3:52:00,4:58:00,7:25:00,9:45:00,11:35:00,14:57:00,18:05:00,20:47:00,,23:37:00,25:06:00,26:53:47 223 | 2015,249,Nate,Ziemski,M,37,Blaine,MN,USA,1:49:00,3:57:00,5:09:00,7:38:00,9:55:00,11:58:00,15:25:00,18:20:00,20:47:00,,23:37:00,25:06:00,26:54:25 224 | 2015,110,Tina,Johnson,F,36,Greenfield,WI,USA,1:49:00,3:58:00,5:09:00,7:38:00,9:55:00,11:58:00,15:25:00,18:20:00,20:47:00,22:13:00,23:55:00,25:16:00,27:09:04 225 | 2015,232,Benjamin,Trok,M,40,Duluth,MN,USA,1:44:00,3:52:00,4:58:00,7:51:00,,11:58:00,15:25:00,18:20:00,20:47:00,,23:55:00,25:25:00,27:22:25 226 | 2015,135,Anthony,Lounsbery,M,37,Edmond,OK,USA,1:40:00,3:33:00,4:45:00,6:59:00,9:29:00,11:08:00,14:45:00,17:47:00,20:47:00,,23:55:00,25:42:00,27:37:02 227 | 2015,95,Peter,Hubbard,M,34,Wheaton,IL,USA,1:33:00,3:23:00,4:25:00,6:36:00,8:57:00,10:55:00,14:16:00,17:32:00,19:19:00,,23:37:00,25:25:00,27:43:58 228 | 2015,20,Gretchen,Brugman,F,41,Truckee,CA,USA,1:42:00,3:38:00,4:45:00,6:59:00,9:29:00,11:12:00,14:45:00,18:05:00,20:47:00,22:13:00,23:55:00,25:42:00,27:45:08 229 | 2015,193,Dan,Rogers,M,39,Frederick,MD,USA,1:38:00,3:38:00,4:51:00,7:25:00,9:55:00,11:58:00,15:25:00,19:19:00,20:47:00,22:56:00,24:41:00,26:27:00,28:24:52 230 | 2015,169,Blake,Paulson,M,42,Louisville,KY,USA,1:54:00,4:02:00,5:15:00,7:51:00,10:07:00,12:12:00,16:42:00,19:56:00,21:33:00,23:42:00,25:24:00,26:52:00,28:40:55 231 | 2015,163,Nicholas,Olson,M,35,Superior,WI,USA,2:21:00,4:18:00,5:35:00,8:12:00,10:39:00,12:49:00,16:42:00,19:56:00,21:21:00,23:20:00,24:58:00,26:27:00,28:47:25 232 | 2015,120,Seth,Korhonen,M,21,Brule,WI,USA,2:21:00,4:38:00,5:34:00,8:22:00,10:52:00,12:49:00,16:42:00,19:56:00,,23:20:00,24:58:00,26:27:00,28:47:26 233 | 2015,186,Joe,Reiter,M,32,Waterloo,IA,USA,1:33:00,3:23:00,4:25:00,6:43:00,8:35:00,10:22:00,13:44:00,17:02:00,20:47:00,22:47:00,24:41:00,26:05:00,28:50:43 234 | 2015,39,Thomas,Dehaan,M,53,Kingston,NY,USA,1:42:00,3:38:00,4:51:00,7:25:00,9:45:00,11:58:00,16:42:00,19:19:00,20:47:00,23:55:00,24:58:00,26:45:00,28:58:08 235 | 2015,78,Christopher,Hanson,M,44,Nisswa,MN,USA,2:16:00,4:35:00,5:35:00,8:12:00,10:18:00,12:22:00,16:42:00,19:56:00,21:44:00,24:09:00,25:35:00,26:59:00,28:59:35 236 | 2015,222,Fred,Tassinari,M,44,Toronto,ON,USA,2:06:00,5:26:00,,8:12:00,10:39:00,12:49:00,17:04:00,20:48:00,22:10:00,24:11:00,25:55:00,27:17:00,29:11:40 237 | 2015,112,Samuel,Jurek,M,28,Oak Bluffs,MA,USA,1:18:00,2:53:00,3:40:00,5:31:00,7:33:00,9:15:00,12:16:00,16:42:00,17:54:00,24:20:00,26:14:00,27:33:00,29:12:42 238 | 2015,65,Daniel,Goeckermann,M,34,Stevens Point,WI,USA,1:49:00,4:02:00,5:15:00,7:51:00,10:07:00,12:12:00,16:42:00,19:56:00,21:33:00,23:58:00,25:35:00,27:12:00,29:14:56 239 | 2015,56,Wilson,Frazier,M,42,Louisville,KY,USA,2:05:00,4:02:00,5:09:00,7:25:00,9:45:00,11:35:00,15:10:00,18:20:00,20:47:00,23:20:00,24:41:00,26:27:00,29:15:27 240 | 2015,237,David,Walch,M,37,St. Peters,MO,USA,1:54:00,3:58:00,5:15:00,7:51:00,10:07:00,12:22:00,16:42:00,20:48:00,22:10:00,24:15:00,25:55:00,27:12:00,29:15:49 241 | 2015,87,Robert,Henderson,M,31,Minneapolis,MN,USA,2:05:00,4:14:00,5:26:00,8:12:00,10:52:00,13:21:00,17:30:00,20:48:00,22:23:00,24:24:00,26:08:00,27:27:00,29:22:12 242 | 2015,180,Curtis,Pote,M,39,Ankeny,IA,USA,1:33:00,3:38:00,4:51:00,7:25:00,10:07:00,12:22:00,16:42:00,19:56:00,21:44:00,23:58:00,25:40:00,27:17:00,29:25:40 243 | 2015,127,Kevin,Langton,M,45,Mankato,MN,USA,1:49:00,3:57:00,5:01:00,7:25:00,9:45:00,11:58:00,16:42:00,19:56:00,21:44:00,23:58:00,25:40:00,27:27:00,29:34:44 244 | 2015,51,Alex,Eichman,F,29,Baldwin,WI,USA,2:16:00,4:38:00,5:40:00,8:12:00,10:39:00,12:38:00,16:42:00,19:19:00,21:13:00,23:20:00,25:24:00,27:27:00,29:45:50 245 | 2015,114,Nicholas,Keller,M,36,Saint Paul,MN,USA,1:52:00,4:08:00,5:26:00,7:51:00,10:39:00,13:21:00,16:42:00,20:48:00,22:10:00,24:14:00,26:08:00,27:42:00,29:53:51 246 | 2015,113,Kent,Keeler,M,37,Niagara Falls,ON,USA,2:06:00,4:14:00,5:26:00,7:51:00,9:55:00,12:12:00,16:42:00,,21:33:00,23:58:00,25:55:00,27:33:00,29:55:55 247 | 2015,173,Tony,Pierce,M,37,Grand Rapids,MN,USA,2:06:00,,5:34:00,8:32:00,11:21:00,13:45:00,17:30:00,21:12:00,22:56:00,25:07:00,26:44:00,28:12:00,30:16:21 248 | 2015,9,Conrado,Bermudez,M,42,Jersey City,NJ,USA,1:44:00,,5:01:00,7:38:00,10:18:00,,16:42:00,19:56:00,22:10:00,24:09:00,25:55:00,27:49:00,30:19:30 249 | 2015,61,Bill,Gengler,M,61,Saint Paul,MN,USA,2:21:00,4:38:00,5:40:00,8:12:00,10:18:00,,16:42:00,20:48:00,22:23:00,24:50:00,26:44:00,28:24:00,30:20:47 250 | 2015,62,Bob,Gerenz,M,47,Coon Rapids,MN,USA,1:33:00,3:23:00,4:21:00,6:43:00,8:57:00,10:48:00,14:16:00,17:47:00,20:47:00,23:34:00,25:35:00,27:33:00,30:21:41 251 | 2015,79,Dan,Harke,M,31,Rochester,MN,USA,1:52:00,4:02:00,5:09:00,7:38:00,10:07:00,12:12:00,16:42:00,19:19:00,21:33:00,23:42:00,25:35:00,27:42:00,30:24:14 252 | 2015,29,Anthony,Chavez,M,41,Sacramento,CA,USA,1:54:00,4:08:00,5:15:00,7:51:00,10:30:00,12:38:00,16:42:00,20:48:00,22:23:00,24:48:00,26:32:00,28:12:00,30:26:00 253 | 2015,53,Troy,Feustel,M,40,Apple Valley,MN,USA,2:16:00,4:42:00,6:00:00,8:46:00,11:28:00,13:45:00,17:41:00,21:12:00,23:11:00,25:25:00,27:06:00,28:50:00,30:26:45 254 | 2015,7,Annie,Behrend,F,29,Rochester,MN,USA,1:54:00,4:18:00,5:40:00,8:20:00,10:52:00,13:21:00,17:30:00,21:12:00,22:56:00,24:59:00,26:44:00,28:24:00,30:32:27 255 | 2015,90,Stephanie,Hoff,F,35,Somerset,WI,USA,2:06:00,4:14:00,5:26:00,8:12:00,10:39:00,13:21:00,17:30:00,21:12:00,23:11:00,25:07:00,27:06:00,28:31:00,30:47:02 256 | 2015,99,Daniel,Ihnat,M,49,Edina,MN,USA,1:40:00,3:33:00,4:37:00,6:59:00,9:13:00,11:08:00,15:10:00,19:19:00,21:33:00,24:16:00,26:32:00,28:24:00,31:08:04 257 | 2015,148,Michael,Mcduffie,M,31,Somerville,MA,USA,1:54:00,3:58:00,5:09:00,7:51:00,10:18:00,12:38:00,16:42:00,20:48:00,22:56:00,24:45:00,26:32:00,28:31:00,31:14:05 258 | 2015,82,Janet,Hausken,F,50,Stillwater,MN,USA,1:54:00,4:18:00,5:35:00,8:12:00,10:30:00,12:49:00,17:04:00,,22:56:00,25:21:00,27:25:00,28:52:00,31:15:09 259 | 2015,141,John,Maas,M,54,Sleepy Eye,MN,USA,2:23:00,5:11:00,6:18:00,9:09:00,11:46:00,14:22:00,18:05:00,21:40:00,23:41:00,25:45:00,27:25:00,29:15:00,31:33:57 260 | 2015,18,Kurt,Brown,M,48,Lacrosse,WI,USA,1:52:00,4:14:00,5:26:00,8:12:00,10:30:00,12:38:00,16:42:00,20:48:00,22:41:00,25:02:00,27:06:00,28:50:00,31:34:49 261 | 2015,89,Scott,Hoberg,M,37,Duluth,MN,USA,1:44:00,3:57:00,5:09:00,7:38:00,10:18:00,12:38:00,16:42:00,20:48:00,22:41:00,25:20:00,27:06:00,29:07:00,31:37:21 262 | 2015,176,Richard,Plezia,M,57,Morton Grove,IL,USA,2:23:00,4:56:00,6:02:00,8:32:00,11:17:00,13:57:00,,21:52:00,24:16:00,26:10:00,27:57:00,29:39:00,31:37:22 263 | 2015,217,Patrick,Susnik,M,50,Duluth,MN,USA,2:21:00,4:38:00,5:48:00,8:32:00,11:17:00,13:45:00,,21:40:00,,25:38:00,27:25:00,29:07:00,31:38:30 264 | 2015,230,Jason,Tintes,M,47,Coon Rapids,MN,USA,1:40:00,3:38:00,4:51:00,7:38:00,10:07:00,12:22:00,16:42:00,20:48:00,22:56:00,25:30:00,27:25:00,29:39:00,32:09:45 265 | 2015,208,Tim,Sieh,M,55,Duluth,MN,USA,1:44:00,3:46:00,4:51:00,7:38:00,9:55:00,11:58:00,16:42:00,20:48:00,22:41:00,25:12:00,27:20:00,,32:11:50 266 | 2015,211,Carl,Skustad,M,40,Ely,MN,USA,2:06:00,4:14:00,5:26:00,8:12:00,10:30:00,12:49:00,17:04:00,20:48:00,23:11:00,25:51:00,27:25:00,29:39:00,32:17:18 267 | 2015,247,Brian,Woods,M,50,Saint Cloud,MN,USA,2:21:00,,6:00:00,8:46:00,11:39:00,13:57:00,18:13:00,22:08:00,23:41:00,26:08:00,27:57:00,29:50:00,32:23:04 268 | 2015,164,Paul,Olson,M,41,Blaine,MN,USA,2:13:00,4:18:00,5:40:00,8:22:00,11:17:00,13:45:00,18:05:00,22:08:00,24:16:00,26:33:00,28:30:00,29:58:00,32:24:25 269 | 2015,132,Kate,Leis,F,38,Delano,MN,USA,2:13:00,,5:34:00,8:20:00,11:02:00,13:35:00,17:48:00,21:52:00,23:41:00,26:12:00,28:07:00,29:58:00,32:29:23 270 | 2015,125,Randy,Lackman,M,45,Wausau,WI,USA,1:33:00,3:23:00,4:25:00,6:43:00,9:08:00,11:12:00,15:10:00,19:56:00,22:23:00,24:50:00,27:25:00,29:07:00,32:35:29 271 | 2015,71,Seth,Grotzke,M,31,Baxter,MN,USA,2:16:00,4:38:00,5:34:00,8:20:00,11:02:00,13:45:00,19:19:00,22:50:00,25:05:00,27:50:00,29:35:00,31:10:00,32:50:53 272 | 2015,182,Joe,Pulver,M,56,Mason,MI,USA,2:13:00,4:38:00,5:40:00,8:22:00,11:17:00,13:35:00,,21:52:00,24:16:00,26:26:00,28:30:00,30:23:00,32:51:26 273 | 2015,140,Matt,Lutz,M,30,Brooklyn Park,MN,USA,2:05:00,4:14:00,6:02:00,8:12:00,10:52:00,13:21:00,17:30:00,21:12:00,23:41:00,25:45:00,27:57:00,29:50:00,32:51:56 274 | 2015,253,Shawn,Severson,F,42,Alexandria,MN,USA,1:42:00,3:46:00,4:58:00,7:38:00,9:55:00,12:12:00,17:04:00,21:12:00,24:16:00,26:20:00,28:30:00,30:23:00,32:57:38 275 | 2015,55,Ryan,Flynn,M,35,Esko,MN,USA,1:38:00,3:33:00,4:37:00,6:47:00,9:13:00,11:12:00,15:10:00,,21:44:00,25:26:00,27:25:00,29:50:00,32:57:59 276 | 2015,139,Connie,Lutkevich,F,47,Kalaheo,HI,USA,2:06:00,4:35:00,5:34:00,8:32:00,11:21:00,13:57:00,,21:52:00,,26:26:00,28:30:00,30:23:00,33:00:31 277 | 2015,37,Robby,Davies,M,31,Mounds View,MN,USA,2:23:00,4:56:00,6:18:00,9:01:00,11:28:00,13:57:00,19:18:00,22:43:00,24:50:00,27:10:00,28:55:00,30:43:00,33:01:35 278 | 2015,223,John,Taylor,M,53,Minneapolis,MN,USA,2:05:00,4:33:00,5:34:00,8:22:00,11:17:00,13:57:00,,21:52:00,24:16:00,26:13:00,28:07:00,30:36:00,33:02:20 279 | 2015,45,Susan,Donnelly,F,52,Oak Ridge,TN,USA,2:21:00,4:48:00,6:02:00,8:52:00,11:28:00,13:57:00,18:13:00,21:52:00,24:16:00,26:36:00,28:30:00,30:36:00,33:03:04 280 | 2015,30,Katerina,Claiborne,F,42,Downers Grove,IL,USA,2:21:00,4:42:00,6:00:00,8:52:00,11:39:00,14:22:00,19:18:00,22:28:00,24:16:00,26:45:00,28:30:00,30:36:00,33:03:05 281 | 2015,108,Deb,Johnson,F,55,Shawnee,KS,USA,2:21:00,4:56:00,6:18:00,9:18:00,12:07:00,,19:18:00,22:43:00,24:30:00,26:56:00,29:07:00,30:43:00,33:03:06 282 | 2015,75,Paul,Hagan,M,32,Petoskey,MI,USA,1:29:00,3:23:00,4:25:00,6:43:00,9:08:00,11:12:00,16:42:00,19:56:00,22:10:00,25:10:00,27:25:00,29:50:00,33:07:47 283 | 2015,100,David,Infante,M,51,Albuquerque,NM,USA,1:49:00,3:57:00,5:01:00,7:38:00,10:52:00,13:21:00,21:10:00,22:43:00,24:40:00,27:10:00,29:07:00,30:43:00,33:10:30 284 | 2015,81,Jake,Haugen,M,28,Boulder,CO,USA,2:23:00,4:42:00,6:00:00,8:52:00,11:46:00,14:39:00,19:19:00,23:31:00,25:25:00,27:45:00,29:23:00,31:10:00,33:11:00 285 | 2015,19,Todd,Brown,M,46,Skokie,IL,USA,2:05:00,4:18:00,5:34:00,8:32:00,11:21:00,13:57:00,19:19:00,22:43:00,24:40:00,27:10:00,29:07:00,30:54:00,33:13:53 286 | 2015,204,Mike,Schmitt,M,38,Rochester,MN,USA,1:54:00,4:18:00,5:40:00,8:20:00,11:02:00,13:21:00,17:48:00,22:43:00,24:30:00,27:10:00,29:16:00,31:10:00,33:14:28 287 | 2015,48,Kurt,Drengler,M,33,Duluth,MN,USA,2:16:00,4:38:00,5:48:00,8:46:00,11:39:00,14:39:00,19:19:00,23:31:00,26:00:00,28:48:00,30:18:00,31:45:00,33:14:44 288 | 2015,245,Jay,Wnuk,M,47,Galesville,WI,USA,1:54:00,4:14:00,5:35:00,8:20:00,11:17:00,13:45:00,18:13:00,22:28:00,24:30:00,26:55:00,28:46:00,30:54:00,33:15:06 289 | 2015,214,Alex,Stephens,M,37,Savage,MN,USA,2:21:00,4:42:00,6:00:00,8:52:00,11:46:00,14:39:00,19:19:00,22:50:00,24:50:00,27:27:00,29:16:00,31:10:00,33:16:15 290 | 2015,244,Matthew,Wilson,M,40,Shakopee,MN,USA,2:13:00,4:18:00,5:34:00,8:32:00,11:21:00,13:57:00,19:19:00,22:28:00,24:30:00,27:10:00,28:55:00,30:54:00,33:30:58 291 | 2015,17,Scott,Breimhorst,M,42,Chaska,MN,USA,2:13:00,4:18:00,5:34:00,8:32:00,11:21:00,13:57:00,19:19:00,22:28:00,24:16:00,27:02:00,28:55:00,30:54:00,33:30:59 292 | 2015,97,Jason,Husveth,M,43,Marine On St. Croix,MN,USA,,4:33:00,5:45:00,8:22:00,11:28:00,14:22:00,19:19:00,22:08:00,24:16:00,26:59:00,28:46:00,31:01:00,33:33:20 293 | 2015,146,Alex,Martinelli,M,26,Madison,WI,USA,2:13:00,4:18:00,5:34:00,8:22:00,11:02:00,13:35:00,18:13:00,22:28:00,24:40:00,27:00:00,28:55:00,31:01:00,33:35:47 294 | 2015,225,Ryan,Teegarden,M,39,Saint Paul,MN,USA,2:13:00,4:33:00,5:34:00,8:32:00,11:21:00,14:05:00,19:18:00,23:31:00,25:42:00,27:36:00,29:16:00,31:10:00,33:40:47 295 | 2015,172,Josh,Peterson,M,32,Minneapolis,MN,USA,2:21:00,4:42:00,6:00:00,8:52:00,11:28:00,14:05:00,19:19:00,22:28:00,24:16:00,27:27:00,29:23:00,31:10:00,33:43:00 296 | 2015,177,Reid,Plumbo,F,31,Vadnais Heights,MN,USA,2:21:00,4:42:00,6:00:00,8:46:00,11:28:00,13:57:00,18:13:00,22:08:00,24:16:00,26:59:00,28:55:00,30:54:00,33:43:54 297 | 2015,189,Will,Richter,M,34,Grand Rapids,MN,USA,2:06:00,4:18:00,5:34:00,8:32:00,11:17:00,13:45:00,18:05:00,22:08:00,24:16:00,26:49:00,28:46:00,,33:44:49 298 | 2015,34,Tom,Cotter,M,43,Green Bay,WI,USA,2:23:00,4:48:00,6:02:00,9:09:00,12:17:00,15:17:00,19:19:00,22:43:00,24:30:00,27:10:00,29:07:00,31:01:00,33:48:48 299 | 2015,248,John,Zalewski,M,50,Chicago,IL,USA,2:16:00,4:35:00,5:40:00,8:32:00,11:28:00,14:05:00,19:18:00,22:43:00,24:30:00,27:10:00,29:23:00,31:21:00,33:57:07 300 | 2015,219,John,Sylvester,M,48,Spraggs,PA,USA,2:16:00,4:41:00,5:48:00,8:46:00,11:39:00,14:22:00,19:18:00,22:50:00,24:50:00,27:27:00,29:16:00,31:19:00,34:00:47 301 | 2015,220,Michael,Sylvester,M,44,Grenada,MS,USA,2:16:00,4:41:00,5:48:00,8:46:00,11:39:00,14:22:00,19:18:00,22:50:00,24:50:00,27:27:00,29:16:00,31:19:00,34:00:48 302 | 2015,238,Ed,Walch,M,39,Lake St. Louis,MO,USA,2:21:00,4:41:00,5:45:00,8:46:00,11:28:00,14:22:00,19:19:00,22:43:00,24:40:00,27:10:00,28:55:00,31:10:00,34:01:01 303 | 2015,215,Eric,Stoll,M,49,Silverwood,MI,USA,1:52:00,4:08:00,5:26:00,8:20:00,11:02:00,13:45:00,19:18:00,23:15:00,,27:45:00,29:35:00,31:45:00,34:03:15 304 | 2015,44,Trevor,Distad,M,48,Pine Island,MN,USA,2:13:00,4:35:00,,8:32:00,11:17:00,13:45:00,18:13:00,22:08:00,24:30:00,27:10:00,29:23:00,31:21:00,34:09:24 305 | 2015,40,Tracy,Denbleyker,F,44,Fennville,MI,USA,2:21:00,4:48:00,,9:01:00,11:39:00,14:22:00,19:18:00,23:15:00,25:05:00,27:45:00,29:53:00,31:45:00,34:09:34 306 | 2015,70,Andrew,Grosvenor,M,37,Marquette,MI,USA,2:21:00,4:48:00,6:18:00,9:09:00,12:07:00,14:52:00,19:19:00,24:17:00,26:12:00,28:35:00,30:25:00,32:15:00,34:16:21 307 | 2015,124,Timothy,Kruse,M,42,Woodstock,IL,USA,2:21:00,4:42:00,6:00:00,9:09:00,12:07:00,14:39:00,19:18:00,22:28:00,24:50:00,27:36:00,29:35:00,31:45:00,34:18:00 308 | 2015,133,Jeffrey,Lenard,M,49,Mchenry,IL,USA,2:21:00,4:42:00,6:00:00,9:09:00,12:07:00,14:39:00,19:18:00,22:28:00,24:50:00,27:36:00,29:35:00,31:45:00,34:18:01 309 | 2015,63,Kari,Gibbons,F,36,Minneapolis,MN,USA,2:21:00,4:42:00,6:00:00,8:52:00,11:39:00,14:05:00,19:18:00,22:50:00,25:25:00,27:50:00,29:55:00,31:45:00,34:19:16 310 | 2015,181,Jack,Prentice,M,44,Eagan,MN,USA,2:13:00,5:21:00,5:48:00,9:01:00,12:00:00,14:39:00,19:18:00,23:15:00,25:05:00,27:50:00,29:56:00,31:58:00,34:19:59 311 | 2015,66,Jeff,Goldstein,M,58,Maple Grove,MN,USA,2:23:00,5:11:00,6:40:00,10:00:00,13:06:00,16:42:00,20:47:00,24:33:00,26:31:00,28:48:00,30:36:00,32:15:00,34:23:50 312 | 2015,152,Geoff,Moffat,M,37,Crystal Lake,IL,USA,2:21:00,4:42:00,6:00:00,9:01:00,11:46:00,14:22:00,19:19:00,23:15:00,25:42:00,28:35:00,30:18:00,31:58:00,34:32:13 313 | 2015,137,Craig,Lunaas,M,57,Milton,WI,USA,2:21:00,4:42:00,5:48:00,8:46:00,11:21:00,14:05:00,19:18:00,22:43:00,24:40:00,27:36:00,29:16:00,31:19:00,34:37:06 314 | 2015,31,Guy,Comer,M,45,Middleton,WI,USA,2:21:00,4:56:00,6:26:00,9:13:00,12:07:00,15:02:00,19:57:00,24:03:00,25:42:00,28:00:00,29:53:00,31:45:00,34:37:06 315 | 2015,154,Allan,Mottram,M,44,Middleton,WI,USA,2:23:00,4:56:00,6:18:00,9:13:00,12:07:00,15:02:00,19:57:00,24:17:00,26:31:00,29:01:00,30:36:00,32:24:00,34:37:07 316 | 2015,57,Jerry,Frost,M,60,St. Louis,MO,USA,2:23:00,5:21:00,6:47:00,10:00:00,12:52:00,16:42:00,,24:17:00,26:12:00,28:41:00,30:25:00,32:15:00,34:45:15 317 | 2015,246,Ted,Wollnik Jr,M,45,Batavia,IL,USA,2:23:00,4:56:00,6:18:00,9:18:00,12:17:00,15:02:00,19:19:00,23:31:00,25:42:00,28:35:00,30:43:00,32:37:00,34:55:53 318 | 2015,239,Joe,Weise,M,35,Ely,MN,USA,2:16:00,4:35:00,5:48:00,8:22:00,11:17:00,13:45:00,19:18:00,23:15:00,25:25:00,28:35:00,30:18:00,32:31:00,35:00:55 319 | 2015,242,Brad,Whitson,M,51,Winnipeg,MB,USA,,4:38:00,5:48:00,8:46:00,11:28:00,14:39:00,19:57:00,23:48:00,26:00:00,28:46:00,,32:37:00,35:05:16 320 | 2015,168,Matthew,Patten,M,44,Ham Lake,MN,USA,2:23:00,5:02:00,6:26:00,9:18:00,13:06:00,15:35:00,21:10:00,24:17:00,26:12:00,28:47:00,30:43:00,32:50:00,35:09:14 321 | 2015,12,Brenda,Bland,F,55,Waunakee,WI,USA,2:21:00,4:56:00,6:18:00,9:13:00,12:17:00,15:02:00,19:57:00,24:03:00,26:12:00,28:43:00,30:39:00,32:37:00,35:14:05 322 | 2015,35,Harold,Curioz,M,30,Bloomington,MN,USA,2:21:00,4:56:00,6:18:00,9:13:00,12:17:00,15:02:00,19:57:00,24:03:00,26:12:00,28:46:00,30:39:00,32:37:00,35:14:07 323 | 2015,138,Zac,Lundgren,M,25,Minneapolis,MN,USA,2:13:00,4:33:00,5:34:00,8:20:00,11:17:00,13:45:00,19:18:00,23:31:00,25:42:00,28:35:00,30:18:00,32:24:00,35:14:26 324 | 2015,115,Bradley,King,M,38,Rockford,IL,USA,2:06:00,4:38:00,5:34:00,8:32:00,11:21:00,14:05:00,19:18:00,23:31:00,25:25:00,28:00:00,29:57:00,31:58:00,35:16:18 325 | 2015,156,Dale,Nesbitt,M,36,Winnipeg,MB,USA,2:21:00,4:48:00,6:09:00,9:09:00,12:00:00,14:22:00,19:19:00,23:15:00,25:25:00,28:35:00,30:39:00,32:31:00,35:18:12 326 | 2015,123,Gary,Krienitz,M,43,Plainfield,IL,USA,2:23:00,4:56:00,6:18:00,9:18:00,12:17:00,15:02:00,19:19:00,23:31:00,25:42:00,28:35:00,30:43:00,32:50:00,35:19:06 327 | 2015,32,J.D.,Coolidge,M,41,Braham,MN,USA,2:13:00,4:42:00,6:18:00,9:23:00,12:28:00,15:35:00,20:47:00,24:17:00,26:31:00,29:01:00,30:43:00,32:31:00,35:19:40 328 | 2015,6,Murray,Arnason,M,52,Wpg,MB,USA,2:16:00,4:38:00,5:48:00,8:46:00,11:28:00,14:39:00,19:57:00,23:48:00,26:00:00,28:47:00,30:39:00,32:37:00,35:19:44 329 | 2015,155,Jason,Mullenbach,M,42,Owatonna,MN,USA,2:13:00,4:33:00,5:34:00,8:52:00,12:00:00,14:52:00,19:57:00,24:03:00,26:00:00,28:41:00,30:43:00,32:50:00,35:21:30 330 | 2015,178,Scott,Poling,M,48,Oswego,IL,USA,2:23:00,5:11:00,6:26:00,9:23:00,12:00:00,14:39:00,19:19:00,23:15:00,25:42:00,28:19:00,30:36:00,32:24:00,35:23:17 331 | 2015,240,Pete,White,M,52,Blue Ash,OH,USA,2:21:00,4:38:00,5:48:00,8:46:00,11:28:00,14:05:00,19:18:00,23:15:00,25:25:00,28:17:00,30:25:00,32:31:00,35:27:22 332 | 2015,126,Brian,Landstrom,M,64,Duluth,MN,USA,2:23:00,5:11:00,6:40:00,10:00:00,13:06:00,16:42:00,20:47:00,24:52:00,27:11:00,29:30:00,31:23:00,33:16:00,35:29:56 333 | 2015,191,Jeff,Rock,M,43,Cloquet,MN,USA,2:21:00,4:48:00,6:18:00,9:23:00,12:28:00,15:17:00,19:57:00,23:31:00,25:25:00,28:22:00,30:25:00,32:31:00,35:30:15 334 | 2015,28,Katie,Chapman,F,32,Rochester,MN,USA,2:16:00,4:42:00,6:00:00,8:52:00,11:39:00,14:22:00,19:19:00,23:31:00,25:42:00,28:35:00,30:36:00,32:31:00,35:34:44 335 | 2015,27,Justin,Chapman,M,36,Rochester,MN,USA,2:16:00,4:42:00,6:00:00,8:52:00,11:39:00,14:22:00,19:19:00,23:31:00,25:42:00,28:35:00,30:36:00,32:31:00,35:34:44 336 | 2015,109,Stuart,Johnson,M,56,Shawnee,KS,USA,2:21:00,4:56:00,6:18:00,9:18:00,12:17:00,15:02:00,19:19:00,23:48:00,26:00:00,28:41:00,30:43:00,32:37:00,35:34:48 337 | 2015,101,Adam,Isovitsch,M,44,Prospect,PA,USA,2:16:00,4:42:00,5:48:00,8:52:00,12:39:00,16:42:00,21:10:00,24:52:00,26:54:00,29:24:00,31:23:00,33:16:00,35:40:17 338 | 2015,52,Kristina,Elfering,F,38,North Oaks,MN,USA,2:16:00,4:48:00,6:09:00,9:13:00,12:17:00,15:02:00,19:57:00,24:17:00,26:54:00,29:35:00,31:14:00,33:16:00,35:46:42 339 | 2015,184,Chris,Reed,M,32,Astoria,NY,USA,2:21:00,4:42:00,6:00:00,9:13:00,12:28:00,15:17:00,20:47:00,25:26:00,27:42:00,30:12:00,31:14:00,33:16:00,35:47:40 340 | 2015,199,Jesse,Rueckert,M,35,Sauk Rapids,MN,USA,2:13:00,4:33:00,5:45:00,9:01:00,12:00:00,14:52:00,19:57:00,23:38:00,26:00:00,29:01:00,30:57:00,32:50:00,35:53:17 341 | 2015,198,Daniel,Rueckert,M,29,Saint Cloud,MN,USA,2:13:00,4:33:00,5:45:00,9:01:00,12:00:00,14:52:00,19:57:00,23:48:00,26:00:00,29:01:00,30:57:00,32:50:00,35:53:20 342 | 2015,85,Craig,Hegrenes,M,44,Grand Rapids,MN,USA,2:21:00,4:48:00,6:09:00,9:13:00,12:00:00,14:52:00,19:57:00,23:31:00,25:42:00,28:35:00,30:39:00,32:50:00,35:55:38 343 | 2015,122,Alex,Kretchmer,M,38,Minneapolis,MN,USA,2:21:00,4:48:00,6:18:00,8:52:00,11:39:00,14:39:00,19:57:00,23:48:00,26:00:00,28:42:00,30:43:00,33:16:00,36:07:34 344 | 2015,227,Kevin,Terry,M,30,Janesville,WI,USA,1:54:00,4:14:00,5:40:00,8:22:00,11:17:00,13:45:00,19:19:00,22:43:00,25:05:00,28:00:00,29:57:00,32:31:00,36:10:07 345 | 2015,64,Jeri,Ginsburg,F,56,San Diego,CA,USA,2:16:00,4:48:00,6:18:00,9:23:00,12:39:00,15:35:00,20:47:00,24:17:00,26:31:00,28:55:00,30:57:00,33:16:00,36:11:11 346 | 2015,251,Dan,LaPlante,M,31,Minneapolis,MN,USA,1:49:00,4:08:00,5:26:00,8:12:00,11:17:00,14:05:00,19:19:00,23:48:00,26:12:00,29:10:00,31:23:00,33:23:00,36:17:22 347 | 2015,22,Joel,Button,M,47,Stillwater,MN,USA,2:23:00,4:56:00,6:18:00,9:18:00,12:39:00,16:42:00,,25:09:00,27:11:00,,31:35:00,33:48:00,36:28:51 348 | 2015,166,Kyle,Palmer,M,37,Stillwater,MN,USA,2:23:00,4:56:00,6:19:00,9:18:00,12:39:00,16:42:00,21:14:00,25:09:00,27:11:00,30:09:00,31:35:00,33:48:00,36:28:51 349 | 2015,129,Aaron,Larson,M,37,Slayton,MN,USA,2:16:00,4:38:00,5:48:00,8:52:00,12:00:00,14:52:00,19:57:00,23:48:00,26:00:00,28:55:00,30:57:00,33:16:00,36:30:20 350 | 2015,11,Cris,Bitker,M,44,Bemidji,MN,USA,2:23:00,5:02:00,6:26:00,10:00:00,12:52:00,15:35:00,21:10:00,25:26:00,27:11:00,29:35:00,31:23:00,33:23:00,36:33:14 351 | 2015,24,Samantha,Carlson,F,32,Duluth,MN,USA,2:16:00,4:38:00,5:48:00,8:46:00,11:46:00,14:52:00,19:57:00,24:03:00,26:12:00,29:01:00,31:23:00,33:23:00,36:34:17 352 | 2015,224,Peter,Taylor,M,38,Duluth,MN,USA,2:16:00,4:18:00,5:35:00,8:32:00,11:21:00,14:05:00,19:18:00,22:43:00,24:40:00,27:36:00,29:57:00,32:24:00,36:34:41 353 | 2015,200,Daryl,Saari,M,52,Rochester,MN,USA,2:23:00,5:21:00,6:40:00,10:03:00,13:14:00,16:42:00,21:10:00,25:09:00,27:11:00,29:45:00,31:14:00,33:23:00,36:39:09 354 | 2015,73,Andy,Gunsaullus,M,40,Alexandria,MN,USA,2:23:00,4:56:00,6:18:00,9:18:00,12:07:00,15:17:00,21:14:00,25:09:00,27:24:00,30:00:00,31:35:00,33:48:00,36:51:39 355 | 2015,47,Jason,Doyle,M,31,Austin,TX,USA,2:05:00,4:18:00,5:40:00,8:46:00,12:00:00,14:39:00,19:57:00,24:52:00,27:42:00,30:12:00,32:19:00,34:27:00,37:22:05 356 | 2015,194,Wesley,Rolnick,M,27,Saratoga Springs,NY,USA,2:13:00,4:35:00,5:45:00,8:32:00,11:28:00,14:22:00,19:19:00,25:26:00,27:24:00,30:09:00,32:36:00,34:27:00,37:22:52 357 | 2015,118,Jeremy,Knaus,M,42,Green Bay,WI,USA,2:23:00,4:48:00,6:02:00,9:09:00,12:17:00,15:17:00,20:47:00,24:33:00,26:54:00,30:01:00,32:19:00,34:27:00,37:23:44 358 | 2015,41,Craig,Desjarlais,M,45,Winnipeg,MB,USA,2:16:00,4:42:00,5:48:00,9:01:00,12:52:00,16:42:00,21:51:00,25:51:00,27:57:00,30:50:00,32:55:00,34:36:00,37:29:15 359 | 2015,206,Sherri,Schummer,F,34,St. Paul,MN,USA,2:23:00,5:02:00,6:40:00,10:03:00,13:31:00,16:42:00,21:51:00,25:51:00,27:57:00,,32:55:00,34:36:00,37:29:16 360 | 2015,160,Victoria,Nill,F,41,Blaine,MN,USA,2:16:00,4:48:00,6:09:00,9:13:00,12:17:00,15:02:00,19:57:00,24:17:00,26:54:00,29:45:00,31:35:00,34:01:00,37:31:32 361 | 2015,165,Meredith,O'neill,F,29,Richfield,MN,USA,2:23:00,4:56:00,6:18:00,9:13:00,12:28:00,15:02:00,19:57:00,24:33:00,26:54:00,29:35:00,31:35:00,34:27:00,37:37:33 362 | 2015,196,Todd,Rowe,M,59,Excelsior,MN,USA,2:21:00,4:56:00,6:40:00,10:00:00,13:14:00,16:42:00,20:47:00,25:26:00,27:57:00,30:35:00,32:36:00,34:36:00,37:43:03 363 | 2015,116,Peter,Klaas,M,54,Martofte,DNK,USA,2:21:00,4:56:00,6:09:00,9:23:00,12:39:00,15:35:00,20:47:00,24:52:00,26:57:00,30:05:00,32:19:00,34:36:00,37:44:52 364 | 2015,212,Harry,Sloan,M,67,Superior,WI,USA,2:23:00,5:11:00,6:40:00,10:00:00,13:06:00,16:42:00,20:47:00,24:52:00,27:11:00,30:04:00,32:36:00,34:36:00,37:58:38 365 | 2015,93,Allan,Holtz,M,65,Oakdale,MN,USA,2:23:00,5:11:00,6:40:00,10:03:00,13:14:00,16:42:00,21:10:00,25:26:00,27:24:00,30:12:00,32:36:00,34:36:00,38:15:38 366 | 2015,10,Benjamin,Bestland,M,42,Staples,MN,USA,2:23:00,5:11:00,6:40:00,10:23:00,14:02:00,16:42:00,,25:09:00,27:24:00,29:58:00,32:19:00,34:27:00,38:26:38 367 | 2015,68,Steven,Graupner,M,26,St. Malo,MB,USA,1:49:00,3:46:00,4:45:00,6:59:00,9:08:00,11:08:00,14:57:00,19:56:00,,,,, 368 | 2015,190,Chris,Robbins,M,30,Eagan,MN,USA,1:40:00,3:33:00,4:37:00,6:46:00,8:57:00,11:23:00,,,,,,, 369 | 2015,50,Robert,Edman,M,34,Saint Paul,MN,USA,1:33:00,3:33:00,4:37:00,6:46:00,9:08:00,11:23:00,,,,,,, 370 | 2015,161,Eric,Nordgren,M,31,Duluth,MN,USA,1:29:00,3:17:00,4:21:00,6:46:00,9:29:00,11:35:00,16:42:00,19:56:00,23:11:00,,,, 371 | 2015,36,Lee,Dalgety,M,44,Middleton,WI,USA,1:42:00,3:23:00,4:25:00,6:43:00,9:08:00,11:58:00,,,,,,, 372 | 2015,4,Joseph,Altendahl,M,33,St Paul,MN,USA,1:52:00,4:08:00,5:26:00,7:51:00,10:18:00,12:12:00,16:42:00,,,,,, 373 | 2015,183,George,Rebecca,F,32,Pillager,MN,USA,1:52:00,4:14:00,5:26:00,7:51:00,10:18:00,12:12:00,17:04:00,,,,,, 374 | 2015,23,Kevin,Cannaday,M,36,Oconomowoc,WI,USA,1:44:00,3:52:00,4:58:00,7:25:00,10:07:00,12:49:00,17:41:00,,,,,, 375 | 2015,171,Jeremy,Peterson,M,37,Detroit Lakes,MN,USA,2:16:00,4:42:00,6:00:00,8:32:00,11:02:00,13:21:00,19:19:00,,,,,, 376 | 2015,216,Dan,Strain,M,45,Rochester,MN,USA,2:13:00,4:38:00,5:48:00,8:32:00,11:17:00,13:35:00,18:13:00,22:08:00,25:05:00,,,, 377 | 2015,131,Lindsay,Leclair,F,36,Mayville,ND,USA,2:16:00,4:38:00,5:45:00,8:22:00,11:02:00,13:35:00,19:57:00,,,,,, 378 | 2015,162,Terence,O'brien,M,48,St. Paul,MN,USA,1:42:00,3:52:00,5:09:00,7:51:00,10:39:00,13:35:00,,,,,,, 379 | 2015,213,Jamie,Solberg,F,27,Waupaca,WI,USA,2:05:00,4:14:00,5:26:00,8:12:00,10:52:00,13:45:00,19:19:00,24:17:00,,,,, 380 | 2015,197,Chris,Rozoff,M,38,Madison,WI,USA,2:21:00,4:42:00,5:48:00,8:32:00,11:28:00,13:57:00,19:19:00,24:17:00,,,,, 381 | 2015,96,Holly,Huston,F,35,Minneapolis,MN,USA,2:16:00,4:35:00,,8:32:00,11:17:00,13:57:00,19:19:00,24:33:00,,,,, 382 | 2015,74,Eric,Hadtrath,M,34,Cold Spring,MN,USA,1:44:00,3:52:00,5:09:00,8:20:00,11:17:00,13:57:00,21:10:00,,,,,, 383 | 2015,221,Marcus,Taintor,M,33,Duluth,MN,USA,1:54:00,4:08:00,5:26:00,8:12:00,11:02:00,13:57:00,,,,,,, 384 | 2015,158,Nicholas,New,M,54,Brooklyn Park,MN,USA,2:05:00,4:38:00,5:40:00,8:20:00,11:17:00,13:57:00,,,,,,, 385 | 2015,86,Brandon,Heimark,M,37,Carver,MN,USA,2:21:00,4:38:00,5:34:00,8:22:00,11:17:00,14:05:00,19:18:00,23:38:00,,,,, 386 | 2015,94,Jon,Howard,M,35,Osseo,MN,USA,2:06:00,4:18:00,5:48:00,8:52:00,12:00:00,14:39:00,19:19:00,23:38:00,,,,, 387 | 2015,145,Scott,Mark,M,44,Roseville,MN,USA,2:21:00,4:48:00,6:09:00,9:01:00,11:46:00,14:39:00,19:57:00,,,,,, 388 | 2015,234,Alberto,Vazquez,M,46,Baltimore,MD,USA,2:21:00,4:38:00,5:48:00,9:01:00,11:46:00,15:07:00,,,,,,, 389 | 2015,231,Andy,Torzewski,M,38,Stillwater,MN,USA,2:23:00,5:02:00,,9:18:00,12:07:00,15:22:00,,,,,,, 390 | 2015,58,Mitch,Frost,M,29,Saint Louis,MO,USA,2:23:00,5:21:00,6:47:00,10:00:00,12:52:00,16:42:00,21:14:00,,,,,, 391 | 2015,187,Kate,Rice,F,46,Ofallon,MO,USA,2:23:00,,6:40:00,10:00:00,13:06:00,16:42:00,21:51:00,25:51:00,28:14:00,31:29:00,,, 392 | 2015,102,Carol,Izadi,F,56,Fenton,MO,USA,2:23:00,,6:47:00,10:00:00,13:06:00,16:42:00,21:51:00,26:26:00,28:14:00,31:16:00,33:30:00,36:25:00, 393 | 2015,235,John,Wagner,M,43,Fort Mill,SC,USA,2:23:00,5:21:00,6:47:00,,13:31:00,16:42:00,22:39:00,26:26:00,28:14:00,32:20:00,,, 394 | 2015,69,Mark,Gregware,M,35,Minneapolis,MN,USA,2:23:00,5:02:00,6:40:00,10:03:00,13:48:00,16:42:00,22:40:00,,,,,, 395 | 2015,209,Dallas,Sigurdur,M,44,Winnipeg,MB,USA,2:21:00,4:41:00,5:48:00,8:46:00,11:46:00,16:42:00,,,,,,, 396 | 2015,54,Mark,Fine,M,50,Atlanta,GA,USA,2:13:00,4:48:00,6:18:00,10:00:00,13:48:00,17:31:00,,,,,,, 397 | 2015,2,Greg,Allen,M,50,Bloomington,MN,USA,2:23:00,5:21:00,6:59:00,10:23:00,14:02:00,17:31:00,,,,,,, 398 | 2015,210,Jared,Simpson,M,27,Minneapolis,MN,USA,2:23:00,5:11:00,6:40:00,10:00:00,13:06:00,17:42:00,,,,,,, 399 | 2015,236,Scott,Wagner,M,49,Andover,MN,USA,2:23:00,5:11:00,6:47:00,10:03:00,13:31:00,17:42:00,,,,,,, 400 | 2015,26,Tony,Cesario,M,51,Frankfort,IL,USA,1:49:00,4:08:00,5:35:00,9:01:00,12:52:00,17:54:00,,,,,,, 401 | 2015,159,Kamie,Nicholls,F,37,Coon Rapids,MN,USA,2:13:00,4:42:00,6:09:00,9:23:00,13:06:00,18:00:00,,,,,,, 402 | 2015,175,Jill,Plamondon,F,42,Suttons Bay,MI,USA,2:23:00,5:11:00,6:40:00,10:11:00,13:48:00,18:04:00,,,,,,, 403 | 2015,179,Bill,Pomerenke,M,53,Apple Valley,MN,USA,2:21:00,4:42:00,6:00:00,9:09:00,13:06:00,18:05:00,,,,,,, 404 | 2015,43,Mike,Dietz,M,42,Wauconda,IL,USA,1:29:00,3:17:00,4:10:00,6:07:00,8:27:00,,,,,,,, 405 | 2015,13,Joseph,Boler,M,35,Eagan,MN,USA,1:40:00,3:33:00,4:37:00,6:59:00,9:13:00,,,,,,,, 406 | 2015,218,Jay,Sykes,M,36,Duluth,MN,USA,1:44:00,3:52:00,4:58:00,8:12:00,,,,,,,,, 407 | 2015,143,Cory,Mahlke,M,39,Minneapolis,MN,USA,1:49:00,3:57:00,5:01:00,7:38:00,10:30:00,,,,,,,, 408 | 2015,151,Rich,Minns,M,40,Massapequa Park,NY,USA,1:44:00,3:57:00,5:09:00,8:20:00,12:52:00,,,,,,,, 409 | 2015,77,Jeff,Hainlen,M,32,Minneapolis,MN,USA,2:21:00,4:42:00,6:00:00,9:13:00,13:31:00,,,,,,,, 410 | 2015,38,Gary,Davis,M,52,Des Moines,IA,USA,2:21:00,4:48:00,6:18:00,10:00:00,14:13:00,,,,,,,, 411 | 2015,83,John,Heemstra,M,39,Zeeland,MI,USA,2:16:00,4:48:00,6:18:00,10:11:00,,,,,,,,, 412 | 2015,226,Richard,Templin,M,36,Mankato,MN,USA,2:23:00,5:11:00,6:26:00,9:23:00,12:28:00,,,,,,,, 413 | 2015,72,Paul,Gucinski,M,35,Superior,WI,USA,2:23:00,4:56:00,6:26:00,9:18:00,12:39:00,,,,,,,, 414 | 2015,15,Rick,Bothwell,M,54,Moose Lake,MN,USA,2:21:00,5:02:00,6:26:00,10:03:00,14:24:00,,,,,,,, 415 | 2015,111,Paul,Jones,M,45,Madison,WI,USA,2:23:00,5:11:00,6:40:00,10:00:00,13:31:00,,,,,,,, 416 | 2015,150,Brianna,Millett,F,33,Minneapolis,MN,USA,2:23:00,5:11:00,6:40:00,10:23:00,14:02:00,,,,,,,, 417 | 2015,98,Van,Huynh-Leap,F,47,Miami,FL,USA,2:23:00,5:37:00,6:59:00,10:23:00,14:05:00,,,,,,,, 418 | 2015,88,Christopher,Heyer,M,34,Minneapolis,MN,USA,2:23:00,5:37:00,6:59:00,11:28:00,14:49:00,,,,,,,, 419 | 2015,128,Jason,Laplant,M,36,Minneapolis,MN,USA,2:23:00,,7:38:00,,,,,,,,,, 420 | 2015,157,Kurt,Neuburger,M,34,New Hope,MN,USA,2:16:00,5:37:00,7:50:00,11:28:00,,,,,,,,, 421 | 2015,105,Wayne,Jenderny,M,39,Minneapolis,MN,USA,2:13:00,4:48:00,,,,,,,,,,, 422 | 2015,33,Michael,Cordum,M,51,Williamsville,IL,USA,2:23:00,5:11:00,,,,,,,,,,, 423 | 2016,179,Frank,Pipp,M,39,Longmont,CO,USA,1:32:00,3:21:00,4:14:00,6:02:00,7:43:00,9:13:00,11:31:00,13:39:00,14:49:00,16:22:00,17:30:00,18:45:00,20:23:15 424 | 2016,234,Joe,Uhan,M,38,Eugene,OR,USA,1:32:00,3:21:00,4:09:00,6:08:00,8:09:00,9:47:00,12:21:00,14:54:00,16:23:00,18:03:00,19:30:00,21:40:00,22:45:00 425 | 2016,209,Adam,Schwartz-Lowe,M,43,Duluth,MN,USA,1:32:00,3:21:00,4:09:00,6:10:00,8:09:00,9:55:00,12:40:00,15:14:00,16:41:00,18:15:00,19:42:00,21:40:00,22:59:07 426 | 2016,105,Timbo,Jenkins,M,35,Lexington,KY,USA,1:26:00,3:14:00,4:09:00,6:30:00,8:30:00,10:07:00,12:40:00,15:14:00,16:09:00,17:58:00,19:25:00,21:40:00,22:58:27 427 | 2016,70,Steven,Graupner,M,27,St. Malo,MB,CAN,1:38:00,3:37:00,4:41:00,6:48:00,8:55:00,10:29:00,13:33:00,16:44:00,19:00:00,20:45:00,23:45:00,25:45:00,27:33:44 428 | 2016,193,Mallory,Richard,F,31,Winnipeg,MB,CAN,1:49:00,3:45:00,4:41:00,6:48:00,8:55:00,10:29:00,13:33:00,16:13:00,17:37:00,19:13:00,20:39:00,22:10:00,23:51:01 429 | 2016,115,Doug,Kleemeier,M,50,Oakdale,MN,USA,1:32:00,3:21:00,4:29:00,6:42:00,8:55:00,10:49:00,14:03:00,17:40:00,19:00:00,22:26:00,23:00:00,24:43:00,26:42:38 430 | 2016,233,Bruce,Udell,M,50,Columbus,WI,USA,1:44:00,3:37:00,4:41:00,6:53:00,9:15:00,11:01:00,14:03:00,16:44:00,18:15:00,20:03:00,21:36:00,23:15:00,24:58:21 431 | 2016,145,Bob,McGrath,M,53,Wyoming,MN,USA,1:49:00,4:03:00,5:00:00,7:12:00,9:30:00,11:10:00,14:03:00,17:09:00,18:38:00,20:40:00,22:45:00,24:30:00,26:16:36 432 | 2016,117,Brian,Klug,M,37,Alexandria,MN,USA,1:32:00,3:27:00,4:29:00,6:40:00,9:03:00,11:01:00,14:14:00,17:40:00,19:00:00,20:40:00,22:20:00,23:45:00,25:24:24 433 | 2016,236,Jeff,Vander Kooi,M,40,Zeeland,MI,USA,1:32:00,3:27:00,4:29:00,6:48:00,9:15:00,11:10:00,14:14:00,17:09:00,20:22:00,,,, 434 | 2016,157,Joshua,Nichols,M,29,Ypsilanti,MI,USA,1:32:00,3:27:00,4:41:00,6:53:00,9:15:00,11:10:00,14:14:00,17:40:00,19:26:00,22:26:00,23:45:00,25:20:00,26:58:26 435 | 2016,237,Ben,Vanhoose,M,34,Greenville,MI,USA,1:32:00,3:27:00,4:29:00,6:48:00,9:15:00,11:30:00,14:56:00,18:12:00,20:10:00,23:05:00,24:39:00,26:30:00,28:30:13 436 | 2016,232,Ondrej,Tomek,M,46,Mequon,WI,USA,1:49:00,3:45:00,4:46:00,7:12:00,9:15:00,11:30:00,14:56:00,18:12:00,20:10:00,22:39:00,24:39:00,26:17:00,28:41:40 437 | 2016,34,Clint,Counsellor,M,53,Mankato,MN,USA,,4:05:00,5:13:00,7:43:00,,11:53:00,15:13:00,18:44:00,20:10:00,22:26:00,24:03:00,25:45:00,28:09:57 438 | 2016,190,Joe,Reiter,M,33,Waterloo,IA,USA,1:33:00,4:16:00,5:26:00,8:02:00,10:10:00,12:12:00,15:13:00,18:12:00,19:26:00,21:22:00,23:00:00,24:30:00,26:27:43 439 | 2016,138,John,Maas,M,55,Sleepy Eye,MN,USA,1:38:00,3:41:00,4:41:00,7:12:00,,11:53:00,15:31:00,18:44:00,20:44:00,23:05:00,24:39:00,26:17:00,28:02:06 440 | 2016,218,Steve,Sorenson,M,51,Breakfast Club,NE,USA,1:44:00,3:45:00,4:46:00,7:12:00,,11:53:00,15:31:00,18:44:00,20:22:00,22:38:00,24:15:00,25:45:00,27:37:23 441 | 2016,238,Carlos,Vicens,M,42,Mississauga,ON,CAN,1:38:00,3:41:00,5:00:00,7:27:00,,12:12:00,15:31:00,18:44:00,20:22:00,22:39:00,24:15:00,25:50:00,27:51:35 442 | 2016,48,Robert,Edman,M,35,Saint Paul,MN,USA,1:38:00,3:37:00,4:41:00,7:12:00,9:30:00,11:30:00,15:56:00,19:32:00,21:50:00,24:30:00,26:55:00,28:20:00,30:40:39 443 | 2016,19,Jason,Buffington,M,47,Duluth,MN,USA,1:38:00,3:41:00,4:46:00,7:27:00,,12:12:00,15:56:00,19:32:00,21:38:00,24:00:00,25:37:00,27:10:00,29:24:06 444 | 2016,148,Jeff,Miller,M,51,Albert Lea,MN,USA,1:32:00,3:27:00,4:29:00,7:12:00,10:10:00,12:28:00,15:56:00,18:44:00,20:22:00,22:26:00,24:15:00,26:30:00,28:49:16 445 | 2016,159,Ryan,Norton,M,42,Manitowoc,WI,USA,1:38:00,3:41:00,5:00:00,8:02:00,10:20:00,12:28:00,15:56:00,19:32:00,21:22:00,23:49:00,25:37:00,27:30:00,29:27:32 446 | 2016,111,Neil,Johnson,M,40,Golden Valley,MN,USA,2:12:00,4:16:00,5:18:00,8:02:00,10:40:00,12:42:00,15:56:00,18:44:00,20:44:00,22:26:00,23:52:00,25:20:00,27:22:20 447 | 2016,231,Jack,Tinucci,M,27,Newport,MN,USA,1:49:00,4:03:00,5:10:00,7:33:00,10:10:00,12:12:00,16:32:00,19:57:00,21:47:00,24:11:00,25:50:00,27:30:00,29:26:12 448 | 2016,128,Randy,Lackman,M,46,Wausau,WI,USA,1:44:00,3:45:00,5:00:00,7:43:00,10:10:00,12:28:00,16:32:00,20:49:00,23:43:00,,29:05:00,31:28:00,35:13:11 449 | 2016,75,Paul,Gucinski,M,36,Superior,WI,USA,2:12:00,4:10:00,5:26:00,7:00:00,10:40:00,12:42:00,16:32:00,19:32:00,21:32:00,24:00:00,25:37:00,,29:37:19 450 | 2016,113,Tina,Johnson,F,37,Greenfield,WI,USA,2:02:00,4:10:00,5:26:00,7:00:00,11:50:00,12:50:00,16:32:00,19:57:00,21:47:00,24:09:00,25:50:00,27:40:00,29:49:28 451 | 2016,147,Alexander,Menacher,M,23,Eau Claire,WI,USA,2:22:00,4:47:00,6:01:00,8:45:00,11:50:00,12:50:00,16:32:00,19:32:00,21:06:00,23:49:00,25:37:00,28:03:00,30:59:34 452 | 2016,89,Andy,Hemenway,M,42,Rochester,MN,USA,2:26:00,4:53:00,6:15:00,8:45:00,11:50:00,12:50:00,16:32:00,20:25:00,22:13:00,24:51:00,27:35:00,29:02:00,31:53:44 453 | 2016,35,Ben,Creehan,M,40,Springfield,MO,USA,1:38:00,3:45:00,5:00:00,7:27:00,10:10:00,12:28:00,17:06:00,22:52:00,,27:25:00,29:25:00,31:28:00,34:14:18 454 | 2016,17,Mark,Brose,M,48,Minneapolis,MN,USA,1:49:00,3:55:00,5:00:00,7:33:00,10:10:00,12:42:00,17:06:00,21:18:00,23:43:00,26:46:00,28:42:00,30:25:00,32:56:31 455 | 2016,69,Carla,Goulart,F,40,Contagem,BRA,BRZ,1:44:00,3:45:00,4:46:00,7:27:00,10:20:00,12:42:00,17:06:00,22:52:00,25:40:00,28:55:00,31:07:00,33:35:00,36:46:50 456 | 2016,54,Stan,Ferguson,M,52,Maumelle,AR,USA,1:49:00,4:10:00,5:18:00,8:02:00,10:20:00,12:42:00,17:06:00,20:49:00,22:59:00,25:10:00,27:35:00,29:02:00,31:49:34 457 | 2016,203,Eric,Schirmers,M,39,Champlin,MN,USA,1:44:00,3:55:00,5:10:00,7:00:00,11:50:00,12:50:00,17:06:00,21:57:00,23:43:00,26:38:00,29:05:00,31:28:00,33:31:12 458 | 2016,83,Janet,Hausken,F,51,Stillwater,MN,USA,2:12:00,4:05:00,5:18:00,7:00:00,11:50:00,12:50:00,17:06:00,22:00:00,,,,, 459 | 2016,135,Jeffrey,Lenard,M,50,McHenry,IL,USA,1:44:00,4:03:00,5:10:00,7:00:00,10:40:00,13:05:00,17:06:00,21:57:00,23:43:00,26:29:00,28:42:00,30:25:00,32:50:23 460 | 2016,141,Nathan,Marti,M,40,Courtland,MN,USA,2:02:00,4:05:00,5:18:00,8:18:00,10:50:00,13:05:00,17:06:00,20:25:00,22:37:00,25:05:00,27:35:00,29:02:00,31:14:29 461 | 2016,216,Bob,Skenzich,M,36,Duluth,MN,USA,1:49:00,4:10:00,5:18:00,8:18:00,10:50:00,13:05:00,17:06:00,20:25:00,22:37:00,,26:55:00,29:02:00,30:53:52 462 | 2016,95,Stephanie,Hoff,F,36,Somerset,WI,USA,2:17:00,4:28:00,5:46:00,8:25:00,11:00:00,13:14:00,17:06:00,20:49:00,24:48:00,,26:55:00,29:02:00,30:50:44 463 | 2016,43,Susan,Donnelly,F,53,Oak Ridge,TN,USA,2:24:00,4:32:00,5:46:00,8:25:00,11:00:00,13:14:00,17:06:00,20:49:00,22:59:00,25:35:00,26:55:00,29:02:00,31:06:06 464 | 2016,249,Ryan,Wold,M,36,Spicer,MN,USA,2:17:00,4:34:00,5:55:00,8:45:00,11:13:00,13:14:00,17:06:00,20:25:00,21:52:00,24:30:00,26:55:00,28:20:00,30:43:10 465 | 2016,94,Scott,Hoberg,M,38,Duluth,MN,USA,1:49:00,4:03:00,5:10:00,8:18:00,11:00:00,13:26:00,17:06:00,20:25:00,22:37:00,24:40:00,26:12:00,28:03:00,29:50:34 466 | 2016,73,Aj,Groebner,M,29,Winona,MN,USA,2:12:00,4:10:00,5:26:00,8:18:00,11:00:00,13:26:00,17:06:00,20:25:00,22:37:00,24:51:00,27:35:00,29:20:00,31:54:27 467 | 2016,103,Tj,Jeannette,M,41,North Mankato,MN,USA,2:02:00,4:10:00,5:26:00,8:25:00,11:13:00,13:26:00,17:06:00,20:49:00,22:37:00,25:35:00,28:07:00,30:25:00,33:42:58 468 | 2016,16,Amy,Broadmoore,F,40,Duluth,MN,USA,2:02:00,4:16:00,5:31:00,8:18:00,10:50:00,13:14:00,17:31:00,22:23:00,24:48:00,27:05:00,28:42:00,30:25:00,32:47:57 469 | 2016,191,Chris,Restad,M,43,Woodbury,MN,USA,2:17:00,4:28:00,5:46:00,8:25:00,11:00:00,13:14:00,17:32:00,21:18:00,23:43:00,25:35:00,27:35:00,29:20:00,31:18:03 470 | 2016,90,Robert,Henderson,M,32,Minneapolis,MN,USA,1:33:00,3:27:00,4:29:00,7:27:00,11:00:00,13:34:00,17:32:00,20:49:00,22:37:00,24:14:00,25:37:00,27:10:00,28:40:00 471 | 2016,82,Aaron,Hansen,M,35,Minneapolis,MN,USA,2:17:00,4:34:00,5:47:00,8:35:00,11:13:00,13:34:00,17:32:00,21:18:00,23:43:00,25:42:00,28:07:00,30:25:00,33:53:05 472 | 2016,28,Kevin,Clark,M,25,Oconomowoc,WI,USA,2:12:00,4:10:00,5:18:00,,10:50:00,13:26:00,17:53:00,22:23:00,24:17:00,26:56:00,29:05:00,31:28:00,33:59:02 473 | 2016,161,Kent,Ogston,M,47,Duluth,MN,USA,1:44:00,4:03:00,5:18:00,8:25:00,11:00:00,13:26:00,17:53:00,21:57:00,24:17:00,26:56:00,29:05:00,31:05:00,33:21:53 474 | 2016,2,Bob,Bahr,M,50,International Falls,MN,USA,2:15:00,4:22:00,5:31:00,8:25:00,11:00:00,13:34:00,17:53:00,21:18:00,22:59:00,25:35:00,27:35:00,29:02:00,31:08:08 475 | 2016,101,Crystal,Hutchings,F,36,Lake In The Hills,IL,USA,2:15:00,4:16:00,5:26:00,7:00:00,10:40:00,13:14:00,18:04:00,22:52:00,25:09:00,27:38:00,29:05:00,31:28:00,33:44:17 476 | 2016,146,Sean,Meehan,M,37,Bloomfield,CT,USA,1:44:00,3:45:00,5:00:00,8:02:00,10:50:00,13:26:00,18:04:00,,25:32:00,28:49:00,30:37:00,33:00:00,35:22:39 477 | 2016,77,Eric,Hadtrath,M,35,Cold Spring,MN,USA,2:26:00,4:53:00,6:01:00,8:45:00,11:25:00,13:34:00,18:04:00,22:23:00,24:17:00,26:17:00,29:05:00,31:28:00,34:41:28 478 | 2016,230,Jason,Tintes,M,47,Coon Rapids,MN,USA,2:20:00,4:37:00,5:55:00,9:00:00,11:40:00,13:57:00,18:04:00,22:23:00,24:17:00,26:38:00,28:42:00,30:35:00,33:03:54 479 | 2016,110,Mark,Johnson,M,45,Minneapolis,MN,USA,2:24:00,4:47:00,6:07:00,9:05:00,11:40:00,14:04:00,18:04:00,21:57:00,23:43:00,25:35:00,27:35:00,29:30:00,32:50:40 480 | 2016,248,Jay,Wnuk,M,48,Galesville,WI,USA,2:15:00,4:28:00,5:46:00,8:35:00,11:25:00,13:57:00,18:20:00,22:23:00,24:17:00,26:52:00,28:42:00,30:35:00,32:37:11 481 | 2016,155,Long,Nguyen,M,28,Minneapolis,MN,USA,2:26:00,4:55:00,6:17:00,9:00:00,11:25:00,13:57:00,18:20:00,22:52:00,24:35:00,27:25:00,29:25:00,32:05:00,34:59:50 482 | 2016,126,David,Krueger,M,47,Milton,WI,USA,2:02:00,4:28:00,5:46:00,8:45:00,11:40:00,14:04:00,18:20:00,23:13:00,24:35:00,26:58:00,29:05:00,31:05:00,33:34:10 483 | 2016,245,Brad,Whitson,M,52,Winnipeg,MB,CAN,2:20:00,4:32:00,5:46:00,8:35:00,11:25:00,14:24:00,18:20:00,21:57:00,23:43:00,26:17:00,28:07:00,30:13:00,32:07:45 484 | 2016,18,Ben,Bruce,M,33,Waubun,MN,USA,2:17:00,4:32:00,5:46:00,8:45:00,11:25:00,14:24:00,18:20:00,21:57:00,23:43:00,26:22:00,28:07:00,30:13:00,32:08:35 485 | 2016,165,Rob,Owens,M,39,Fremont,NE,USA,2:26:00,4:53:00,6:15:00,9:00:00,11:55:00,14:24:00,18:20:00,,24:35:00,27:04:00,29:05:00,31:05:00,33:32:38 486 | 2016,212,Drew,Shafer,M,36,Maple Grove,MN,USA,2:17:00,4:32:00,5:46:00,8:35:00,11:13:00,13:34:00,18:35:00,23:59:00,27:00:00,32:07:00,,, 487 | 2016,136,Andy,Lohn,M,43,Dayton,MN,USA,2:15:00,4:22:00,5:31:00,8:25:00,11:25:00,14:04:00,18:35:00,23:13:00,25:09:00,27:58:00,30:05:00,32:35:00,35:35:04 488 | 2016,5,Gerrit,Bass,M,24,Jackson,WY,USA,2:22:00,,6:01:00,8:45:00,11:25:00,14:04:00,18:35:00,23:13:00,25:32:00,28:20:00,31:05:00,33:35:00,36:00:44 489 | 2016,183,Reid,Plumbo,M,32,Vadnais Heights,MN,USA,2:20:00,4:37:00,,8:45:00,11:25:00,14:04:00,18:35:00,22:23:00,24:17:00,,28:42:00,30:25:00,32:38:37 490 | 2016,177,Tony,Pierce,M,38,Grand Rapids,MN,USA,2:12:00,4:47:00,5:46:00,8:45:00,11:40:00,14:24:00,18:35:00,22:23:00,24:17:00,26:22:00,28:07:00,29:20:00,31:00:07 491 | 2016,102,Kathy,Jambor,F,50,Eagan,MN,USA,2:24:00,4:47:00,6:17:00,9:05:00,,14:24:00,18:35:00,22:23:00,24:17:00,26:18:00,28:42:00,30:35:00,33:44:03 492 | 2016,51,Kathy,Errthum,F,40,La Crosse,WI,USA,2:15:00,4:22:00,5:38:00,8:25:00,11:13:00,13:57:00,18:49:00,23:13:00,25:40:00,28:49:00,30:41:00,33:00:00,36:00:36 493 | 2016,173,Josh,Peterson,M,33,Minneapolis,MN,USA,2:17:00,4:28:00,5:46:00,8:35:00,11:25:00,14:04:00,18:49:00,22:52:00,25:09:00,27:50:00,30:17:00,32:38:00,35:18:55 494 | 2016,158,Faye,Norby,F,34,Saint Paul,MN,USA,2:20:00,4:47:00,6:07:00,9:05:00,12:00:00,14:42:00,18:49:00,22:52:00,24:48:00,27:16:00,29:05:00,31:28:00,33:58:54 495 | 2016,45,Kurt,Drengler,M,34,Duluth,MN,USA,2:26:00,4:58:00,6:17:00,9:19:00,12:15:00,14:51:00,18:49:00,22:52:00,24:48:00,27:04:00,28:42:00,30:25:00,32:42:30 496 | 2016,124,Shalini,Kovach,F,40,Ballwin,MO,USA,2:15:00,4:32:00,6:01:00,9:10:00,12:15:00,14:52:00,18:49:00,23:28:00,25:40:00,28:28:00,30:19:00,32:05:00,34:00:51 497 | 2016,131,Scott,Laudick,M,41,Crystal Lake,IL,USA,2:17:00,4:28:00,5:46:00,8:45:00,11:40:00,14:24:00,19:11:00,23:28:00,26:11:00,29:15:00,31:07:00,,36:50:45 498 | 2016,176,Josh,Phillips,M,35,Milwaukee,WI,USA,2:24:00,4:47:00,5:55:00,9:00:00,11:40:00,14:24:00,19:11:00,23:47:00,26:11:00,29:34:00,32:07:00,34:30:00,37:33:46 499 | 2016,106,Isaac,Jensen,M,28,Saint Paul,MN,USA,2:24:00,4:47:00,6:16:00,9:10:00,12:00:00,14:42:00,19:11:00,23:59:00,25:55:00,28:20:00,30:43:00,33:00:00,36:18:46 500 | 2016,61,Mark,Gehringer,M,42,Katy,TX,USA,2:17:00,4:37:00,6:01:00,9:05:00,12:00:00,14:51:00,19:11:00,23:28:00,25:40:00,28:17:00,30:17:00,32:18:00,34:48:55 501 | 2016,39,Tracy,Denbleyker,F,45,Fennville,MI,USA,2:15:00,4:32:00,6:07:00,9:10:00,12:15:00,14:51:00,19:11:00,,25:09:00,,29:05:00,31:28:00,33:47:49 502 | 2016,119,Bj,Knight,M,45,Apple Valley,MN,USA,2:20:00,4:32:00,6:01:00,9:05:00,12:00:00,14:52:00,19:11:00,23:28:00,26:11:00,29:34:00,,, 503 | 2016,240,Adrianne,Warren,F,33,McHenry,IL,USA,2:26:00,4:55:00,6:20:00,9:05:00,12:15:00,14:52:00,19:11:00,24:28:00,27:00:00,28:38:00,31:05:00,33:17:00,36:32:12 504 | 2016,108,Cary,Johnson,M,51,Savage,MN,USA,2:26:00,,6:17:00,9:10:00,12:15:00,14:52:00,19:11:00,23:28:00,25:40:00,28:28:00,30:07:00,32:05:00,34:23:38 505 | 2016,140,Scott,Mark,M,45,Roseville,MN,USA,2:26:00,4:55:00,,9:19:00,12:15:00,14:52:00,19:11:00,23:13:00,25:32:00,27:58:00,29:57:00,32:18:00,34:49:17 506 | 2016,202,Matthew,Santner,M,40,Dowling,MI,USA,2:17:00,4:22:00,5:31:00,8:18:00,11:25:00,14:04:00,19:25:00,24:09:00,27:00:00,29:51:00,31:42:00,33:45:00,36:20:35 507 | 2016,239,John,Wagner,M,44,Fort Mill,SC,USA,2:17:00,4:34:00,5:55:00,9:05:00,11:40:00,14:04:00,19:25:00,23:37:00,25:55:00,28:38:00,30:35:00,32:18:00,34:39:02 508 | 2016,59,Jesse,Fuller,M,32,Fairfax,VA,USA,2:26:00,4:55:00,6:17:00,9:05:00,11:55:00,14:42:00,19:25:00,23:28:00,25:32:00,28:02:00,29:25:00,31:28:00,34:00:46 509 | 2016,31,Steven,Connelly,M,37,Savage,MN,USA,2:24:00,4:48:00,6:15:00,9:10:00,12:00:00,14:42:00,19:25:00,23:28:00,25:55:00,28:38:00,31:00:00,33:35:00,36:37:24 510 | 2016,86,Brandon,Heimark,M,38,Carver,MN,USA,,4:37:00,6:15:00,9:10:00,11:55:00,14:51:00,19:25:00,23:37:00,25:32:00,28:02:00,30:03:00,32:05:00,34:42:58 511 | 2016,255,Stephen,Yurek,M,54,Arlington,VA,USA,2:26:00,4:53:00,6:17:00,9:10:00,12:00:00,14:52:00,19:25:00,23:28:00,25:32:00,27:58:00,29:25:00,32:05:00,34:54:59 512 | 2016,91,Josh,Henningson,M,31,Minneapolis,MN,USA,2:02:00,4:10:00,5:38:00,9:00:00,12:15:00,14:52:00,19:25:00,23:37:00,25:32:00,28:20:00,30:29:00,32:35:00,35:08:29 513 | 2016,182,Richard,Plezia,M,58,Morton Grove,IL,USA,2:28:00,5:09:00,6:26:00,9:19:00,12:15:00,14:52:00,19:25:00,23:28:00,25:32:00,27:58:00,29:57:00,32:05:00,33:59:50 514 | 2016,244,Jordan,Wesely,M,34,Mankato,MN,USA,2:24:00,4:55:00,6:20:00,9:19:00,12:15:00,14:58:00,19:25:00,24:28:00,,,,, 515 | 2016,208,Sherri,Schummer,F,35,St. Paul,MN,USA,2:26:00,4:53:00,6:15:00,9:19:00,12:15:00,15:05:00,19:25:00,23:37:00,25:55:00,28:55:00,31:00:00,33:35:00,36:22:11 516 | 2016,93,Thao,Hoang,M,51,Fond Du Lac,WI,USA,2:26:00,4:58:00,6:20:00,9:25:00,12:30:00,15:33:00,19:25:00,23:37:00,25:55:00,28:38:00,30:47:00,32:35:00,34:31:57 517 | 2016,137,Zac,Lundgren,M,26,Minneapolis,MN,USA,2:02:00,4:16:00,5:26:00,8:18:00,11:00:00,13:57:00,19:48:00,,,,,, 518 | 2016,134,Jim,Lemke,M,55,Fort Atkinson,WI,USA,2:12:00,4:28:00,5:55:00,9:00:00,12:00:00,14:51:00,19:48:00,23:59:00,27:00:00,28:55:00,30:50:00,33:00:00,35:35:50 519 | 2016,197,Wesley,Rolnick,M,28,Saratoga Springs,NY,USA,2:24:00,4:53:00,6:20:00,9:25:00,12:25:00,14:52:00,19:48:00,23:47:00,26:11:00,28:49:00,30:41:00,32:38:00,34:57:45 520 | 2016,213,Martin,Short,M,46,Grand Forks,ND,USA,2:24:00,4:47:00,6:07:00,9:00:00,11:55:00,14:58:00,19:48:00,24:28:00,27:27:00,30:08:00,32:02:00,34:10:00,37:08:23 521 | 2016,60,Jason,Furtney,M,37,St. Paul,MN,USA,2:22:00,4:48:00,6:15:00,9:10:00,12:15:00,14:58:00,19:48:00,23:47:00,25:55:00,28:10:00,30:07:00,32:18:00,34:53:27 522 | 2016,14,Richard,Bjork,M,53,Chisago City,MN,USA,2:22:00,4:48:00,6:15:00,9:10:00,12:15:00,14:58:00,19:48:00,23:47:00,25:55:00,28:10:00,30:07:00,32:18:00,34:53:29 523 | 2016,100,Jason,Husveth,M,44,Marine On St. Croix,MN,USA,2:17:00,4:34:00,6:15:00,9:10:00,12:15:00,15:05:00,19:48:00,23:47:00,26:11:00,28:49:00,30:40:00,32:38:00,35:16:51 524 | 2016,178,Zach,Pierce,M,43,Minneapolis,MN,USA,2:24:00,4:55:00,6:17:00,9:19:00,12:15:00,15:05:00,19:48:00,23:37:00,25:55:00,29:15:00,31:07:00,34:10:00,37:23:29 525 | 2016,62,Griffin,Geisler,M,39,Bloomington,MN,USA,2:17:00,4:37:00,6:01:00,9:10:00,12:30:00,15:33:00,19:48:00,23:37:00,25:40:00,28:38:00,30:46:00,33:00:00,36:19:53 526 | 2016,72,Mark,Gregware,M,36,Minneapolis,MN,USA,2:22:00,4:47:00,6:17:00,9:25:00,12:30:00,15:33:00,19:48:00,24:09:00,27:00:00,29:47:00,31:50:00,34:30:00,37:41:40 527 | 2016,214,Carolyn,Shreck,F,44,Hampton,NH,USA,2:24:00,4:48:00,6:17:00,9:25:00,12:25:00,15:34:00,19:48:00,23:38:00,25:32:00,28:10:00,29:57:00,32:05:00,34:14:08 528 | 2016,42,Trevor,Distad,M,49,Pine Island,MN,USA,2:26:00,5:11:00,6:37:00,9:45:00,12:43:00,15:34:00,19:48:00,23:37:00,25:40:00,28:38:00,30:20:00,32:35:00,35:00:01 529 | 2016,38,Andrew,Deering,M,25,Columbia,MN,USA,2:28:00,5:14:00,6:37:00,9:55:00,12:43:00,15:34:00,19:48:00,23:47:00,25:55:00,28:17:00,30:07:00,32:05:00,35:16:11 530 | 2016,242,Joe,Weise,M,36,Ely,MN,USA,2:17:00,4:34:00,6:07:00,9:00:00,12:00:00,14:51:00,20:13:00,24:09:00,25:55:00,29:15:00,30:45:00,32:35:00,34:50:28 531 | 2016,247,Joshua,Witte,M,45,Flower Mound,TX,USA,2:17:00,4:28:00,5:46:00,9:00:00,12:00:00,15:05:00,20:13:00,23:59:00,26:11:00,28:49:00,30:29:00,32:35:00,34:40:28 532 | 2016,78,Andy,Hagen,M,41,Hopkins,MN,USA,2:20:00,4:37:00,6:01:00,9:05:00,12:15:00,15:05:00,20:13:00,24:45:00,27:13:00,30:00:00,32:05:00,34:10:00,36:55:33 533 | 2016,186,Erik,Raivo,M,32,Brook Park,MN,USA,2:26:00,4:53:00,6:15:00,9:10:00,12:25:00,15:05:00,20:13:00,24:09:00,27:00:00,28:55:00,30:35:00,32:38:00,35:11:55 534 | 2016,64,Kari,Gibbons,F,37,Minneapolis,MN,USA,2:26:00,4:48:00,6:17:00,9:10:00,12:25:00,15:05:00,20:13:00,24:09:00,27:00:00,28:55:00,30:35:00,32:38:00,35:11:52 535 | 2016,188,David,Reddel,M,51,Breakfast Club,NE,USA,2:15:00,4:34:00,6:01:00,9:10:00,12:25:00,15:33:00,20:13:00,24:28:00,26:11:00,28:55:00,31:02:00,,36:16:09 536 | 2016,257,Joe,Lang,M,31,Ham Lake,MN,USA,2:26:00,4:58:00,6:20:00,9:19:00,12:25:00,15:33:00,20:13:00,23:59:00,26:11:00,29:26:00,31:07:00,33:17:00,35:42:20 537 | 2016,109,Deb,Johnson,F,56,Shawnee,KS,USA,2:28:00,5:14:00,6:37:00,9:55:00,12:43:00,15:33:00,20:13:00,24:09:00,26:11:00,28:20:00,30:12:00,32:18:00,34:53:28 538 | 2016,47,Jeramy,Duffee,M,39,Moline,IL,USA,2:28:00,4:59:00,6:20:00,9:25:00,12:43:00,15:34:00,20:13:00,24:09:00,27:00:00,29:15:00,31:07:00,33:35:00,36:01:59 539 | 2016,205,Steve,Schmidt,M,53,Loretto,MN,USA,2:20:00,4:47:00,6:15:00,9:45:00,12:43:00,15:34:00,20:13:00,24:28:00,26:30:00,29:15:00,31:05:00,33:17:00,35:59:25 540 | 2016,174,Paul,Peterson,M,36,Minnetonka,MN,USA,2:24:00,,6:20:00,9:45:00,12:53:00,15:34:00,20:13:00,25:41:00,,,,, 541 | 2016,185,Jack,Prentice,M,45,Eagan,MN,USA,2:20:00,4:39:00,6:07:00,9:10:00,12:25:00,,20:13:00,24:45:00,27:13:00,30:00:00,32:05:00,34:10:00,36:55:30 542 | 2016,66,Mark,Gilligan,M,45,Carmichael,CA,USA,2:02:00,4:22:00,5:56:00,9:25:00,12:25:00,14:58:00,20:24:00,,,,,, 543 | 2016,171,Chris,Peterson,M,42,Greenfield,MN,USA,2:17:00,4:28:00,5:55:00,9:10:00,12:25:00,15:34:00,20:46:00,24:45:00,27:00:00,30:29:00,31:05:00,33:00:00,35:31:37 544 | 2016,85,Craig,Hegrenes,M,45,Grand Rapids,MN,USA,2:26:00,4:55:00,6:20:00,9:45:00,12:43:00,15:42:00,20:46:00,25:12:00,27:00:00,29:51:00,31:41:00,33:45:00,36:30:40 545 | 2016,37,Gary,Davis,M,53,Des Moines,IA,USA,2:29:00,5:11:00,6:37:00,9:25:00,12:30:00,16:02:00,20:46:00,24:45:00,27:00:00,29:35:00,31:40:00,33:35:00,36:24:28 546 | 2016,8,Timothy,Bergan,M,51,Colfax,IA,USA,2:22:00,4:58:00,6:26:00,9:45:00,12:55:00,16:02:00,20:46:00,24:45:00,27:00:00,29:34:00,31:25:00,33:45:00,36:24:52 547 | 2016,87,Jesse,Heise,M,42,Minneapolis,MN,USA,2:28:00,4:59:00,6:26:00,9:45:00,12:55:00,16:02:00,20:46:00,24:45:00,27:00:00,29:45:00,31:29:00,33:45:00,36:59:04 548 | 2016,58,Jerry,Frost,M,61,St. Louis,MO,USA,2:28:00,5:14:00,6:37:00,9:55:00,12:55:00,16:02:00,20:46:00,24:45:00,27:27:00,30:00:00,32:07:00,34:30:00,37:44:10 549 | 2016,25,Justin,Chapman,M,37,Rochester,MN,USA,2:28:00,5:09:00,6:41:00,9:55:00,12:55:00,16:02:00,20:46:00,25:12:00,27:27:00,30:00:00,32:07:00,34:10:00,37:16:05 550 | 2016,26,Katie,Chapman,F,33,Rochester,MN,USA,2:28:00,5:09:00,6:41:00,9:55:00,12:55:00,16:02:00,20:46:00,25:12:00,27:27:00,30:00:00,32:07:00,34:10:00,37:16:08 551 | 2016,76,John,Gustafson,M,64,Forest Lake,MN,USA,2:26:00,5:09:00,6:37:00,9:55:00,13:18:00,16:02:00,20:46:00,25:12:00,27:13:00,30:00:00,32:02:00,34:10:00,37:07:23 552 | 2016,112,Stuart,Johnson,M,57,Shawnee,KS,USA,2:28:00,5:14:00,6:37:00,9:55:00,13:18:00,16:02:00,20:46:00,25:12:00,27:27:00,30:29:00,32:22:00,34:45:00,37:44:09 553 | 2016,4,Angela,Barbera,F,56,Oconomowoc,WI,USA,2:24:00,5:11:00,6:41:00,10:25:00,13:18:00,16:21:00,20:46:00,25:12:00,27:13:00,30:06:00,32:19:00,34:30:00,37:41:25 554 | 2016,229,Holly,Thiry,F,43,Lakewood,CO,USA,2:30:00,5:30:00,6:54:00,10:25:00,13:18:00,16:21:00,20:46:00,24:45:00,27:00:00,29:51:00,32:02:00,34:30:00,37:34:43 555 | 2016,53,Joe,Fejes,M,50,Gainesville,GA,USA,1:38:00,4:55:00,6:49:00,10:25:00,13:44:00,16:53:00,20:46:00,24:47:00,,,,, 556 | 2016,3,Wendi,Baldwin,F,47,Eden Prairie,MN,USA,2:24:00,4:53:00,6:17:00,9:25:00,12:43:00,15:34:00,20:53:00,,,,,, 557 | 2016,180,David,Pither,M,49,Thunder Bay,ON,CAN,2:20:00,4:39:00,6:15:00,9:25:00,12:30:00,16:02:00,20:53:00,25:12:00,27:13:00,30:01:00,,, 558 | 2016,153,Dale,Nesbitt,M,37,Winnipeg,MB,CAN,2:28:00,5:14:00,6:41:00,10:25:00,13:18:00,16:02:00,20:53:00,25:12:00,27:40:00,30:41:00,,, 559 | 2016,127,Timothy,Kruse,M,43,Woodstock,IL,USA,2:26:00,5:09:00,6:37:00,9:55:00,13:18:00,16:21:00,20:53:00,25:12:00,27:40:00,30:38:00,33:05:00,, 560 | 2016,97,Allan,Holtz,M,66,Oakdale,MN,USA,2:30:00,5:30:00,6:54:00,10:30:00,,16:30:00,20:53:00,25:57:00,29:12:00,,,, 561 | 2016,98,Jon,Howard,M,36,Osseo,MN,USA,2:28:00,5:09:00,6:37:00,9:55:00,13:18:00,16:02:00,21:20:00,,,,,, 562 | 2016,224,Misty,Swanson,F,39,Minneapolis,MN,USA,2:28:00,5:11:00,6:49:00,10:25:00,13:18:00,16:02:00,21:20:00,25:39:00,28:14:00,30:56:00,32:48:00,34:45:00,37:31:05 563 | 2016,225,Kazimierz,Swistun,M,64,Buffalo Grove,IL,USA,2:30:00,5:30:00,6:54:00,10:25:00,13:18:00,16:21:00,21:20:00,25:12:00,27:13:00,29:51:00,32:00:00,34:10:00,37:06:05 564 | 2016,125,Predrag,Krkic,M,61,Western Springs,IL,USA,2:22:00,4:58:00,6:37:00,10:25:00,13:44:00,16:21:00,21:20:00,25:30:00,27:27:00,30:38:00,,, 565 | 2016,175,Cole,Peyton,M,30,Bloomington,MN,USA,2:26:00,4:53:00,6:17:00,9:45:00,13:18:00,16:30:00,21:20:00,26:20:00,28:14:00,31:16:00,33:05:00,34:57:00,37:42:18 566 | 2016,201,Daryl,Saari,M,53,Rochester,MN,USA,2:28:00,5:30:00,7:02:00,10:39:00,13:44:00,16:53:00,21:20:00,25:39:00,27:57:00,30:55:00,32:35:00,34:45:00,37:27:35 567 | 2016,6,Brian,Beckman,M,29,Ashland,WI,USA,2:20:00,4:34:00,5:55:00,9:00:00,11:55:00,15:05:00,21:44:00,26:20:00,28:14:00,30:55:00,32:35:00,34:30:00,36:46:44 568 | 2016,11,Mary,Binsfield,F,46,Cloquet,MN,USA,2:26:00,4:55:00,6:20:00,9:45:00,12:53:00,15:42:00,21:44:00,27:35:00,29:36:00,33:31:00,,, 569 | 2016,170,Nicholas,Petersen,M,32,Minneapolis,MN,USA,2:12:00,4:37:00,6:26:00,9:55:00,13:18:00,16:21:00,21:44:00,25:39:00,27:57:00,30:29:00,32:23:00,34:30:00,37:10:07 570 | 2016,99,Karl,Huemiller,M,31,Minneapolis,MN,USA,2:12:00,4:37:00,6:26:00,9:55:00,13:18:00,16:21:00,21:44:00,25:39:00,27:57:00,30:29:00,32:25:00,34:30:00,37:10:08 571 | 2016,55,Troy,Feustel,M,41,Apple Valley,MN,USA,2:22:00,4:53:00,6:26:00,9:55:00,13:18:00,16:21:00,21:44:00,26:43:00,28:42:00,30:38:00,32:07:00,34:10:00,35:56:26 572 | 2016,33,Tom,Cotter,M,44,Green Bay,WI,USA,2:26:00,5:09:00,6:26:00,9:45:00,13:18:00,16:30:00,21:44:00,,,,,, 573 | 2016,151,Julie,Moran,F,45,Shakopee,MN,USA,2:17:00,5:30:00,6:26:00,9:55:00,13:18:00,16:30:00,21:44:00,25:57:00,27:57:00,30:29:00,32:19:00,34:30:00,37:16:17 574 | 2016,204,Jordan,Schmidt,M,22,Ramsey,MN,USA,2:28:00,5:11:00,6:37:00,10:25:00,13:44:00,16:30:00,21:44:00,25:57:00,28:14:00,31:16:00,33:20:00,35:10:00, 575 | 2016,1,Matthew,Anderson,M,41,Lakewood,CO,USA,2:29:00,5:11:00,6:49:00,10:25:00,13:44:00,16:30:00,21:44:00,26:20:00,29:00:00,31:16:00,33:05:00,34:57:00,37:31:03 576 | 2016,10,Benjamin,Bestland,M,43,Staples,MN,USA,2:28:00,5:23:00,6:54:00,10:30:00,13:44:00,16:53:00,21:44:00,26:43:00,30:20:00,,,, 577 | 2016,228,Travis,Thiede,M,42,Apple Valley,MN,USA,2:24:00,4:48:00,6:15:00,9:45:00,12:55:00,16:21:00,21:57:00,,,,,, 578 | 2016,206,Mike,Schmitt,M,39,Rochester,MN,USA,2:26:00,5:09:00,6:26:00,9:45:00,12:43:00,16:21:00,22:47:00,26:43:00,,31:46:00,33:15:00,34:57:00,37:27:59 579 | 2016,195,Jeff,Rock,M,44,Cloquet,MN,USA,2:26:00,5:23:00,7:02:00,10:30:00,13:59:00,17:39:00,22:47:00,25:57:00,28:14:00,,33:20:00,35:10:00, 580 | 2016,189,Chris,Reed,M,33,Astoria,NY,USA,2:26:00,4:48:00,6:20:00,9:45:00,13:18:00,16:30:00,23:22:00,27:29:00,29:12:00,31:16:00,33:05:00,34:57:00,37:07:16 581 | 2016,122,Rob,Kortbein,M,47,Apple Valley,MN,USA,2:29:00,5:14:00,6:41:00,10:25:00,13:18:00,16:30:00,23:22:00,,,,,, 582 | 2016,41,Scott,Deyo,M,43,West St. Paul,MN,USA,,4:55:00,6:17:00,10:25:00,14:30:00,17:56:00,23:22:00,27:55:00,,,,, 583 | 2016,133,Lindsay,Leclair,F,37,Mayville,ND,USA,2:24:00,4:48:00,6:26:00,9:45:00,13:44:00,16:53:00,23:53:00,27:45:00,30:25:00,,,, 584 | 2016,156,Tony,Nicholls,M,31,Waconia,MN,USA,2:26:00,4:58:00,6:37:00,10:25:00,14:19:00,17:56:00,23:53:00,27:55:00,,,,, 585 | 2016,40,Craig,Desjarlais,M,46,Winnipeg,MB,CAN,2:26:00,4:53:00,6:15:00,9:19:00,12:43:00,,24:27:00,,,,,, 586 | 2016,22,Nathan,Campeau,M,37,Minneapolis,MN,USA,2:17:00,4:28:00,5:38:00,8:18:00,10:50:00,13:05:00,,21:57:00,24:17:00,26:14:00,28:42:00,30:13:00,32:25:29 587 | 2016,142,Lee,Martin,M,34,Minneapolis,MN,USA,2:15:00,4:22:00,5:38:00,8:25:00,11:00:00,13:26:00,,21:18:00,22:59:00,25:35:00,27:35:00,29:20:00,31:13:24 588 | 2016,144,Travis,McCathie,M,35,Richfield,MN,USA,,3:37:00,4:29:00,6:42:00,8:55:00,10:49:00,,,,,,, 589 | 2016,169,Garrett,Peltonen,M,34,Middleton,WI,USA,1:32:00,3:21:00,4:16:00,6:30:00,8:55:00,11:57:00,,,,,,, 590 | 2016,49,Alex,Eichman,F,30,Minneapolis,MN,USA,2:22:00,4:47:00,5:55:00,8:35:00,11:13:00,13:57:00,,,,,,, 591 | 2016,57,Ryan,Flynn,M,36,Esko,MN,USA,1:44:00,4:05:00,5:18:00,8:45:00,11:40:00,14:53:00,,,,,,, 592 | 2016,68,Mike,Gorski,M,42,Des Moines,IA,USA,2:12:00,4:10:00,5:26:00,8:35:00,12:31:00,15:35:00,,,,,,, 593 | 2016,251,Brian,Wolfe,M,35,Bloomington,MN,USA,2:26:00,4:55:00,6:20:00,9:19:00,13:18:00,15:42:00,,,,,,, 594 | 2016,143,Mike,McCarl,M,48,Sioux Lookout,ON,CAN,2:22:00,4:48:00,6:07:00,9:10:00,12:25:00,16:03:00,,,,,,, 595 | 2016,116,Neil,Klein,M,46,Stillwater,MN,USA,2:28:00,4:59:00,6:26:00,9:45:00,12:59:00,16:21:00,,,,,,, 596 | 2016,79,Jeff,Hainlen,M,33,Minneapolis,MN,USA,2:26:00,4:48:00,6:17:00,9:45:00,13:18:00,16:30:00,,,,,,, 597 | 2016,227,Kevin,Terry,M,31,Wausau,WI,USA,1:44:00,3:55:00,5:10:00,8:18:00,11:13:00,16:54:00,,,,,,, 598 | 2016,221,Dan,Strain,M,46,Rochester,MN,USA,2:26:00,5:11:00,6:49:00,10:25:00,13:44:00,16:54:00,,,,,,, 599 | 2016,243,Kelley,Wells,F,42,Columbia,SC,USA,2:26:00,5:23:00,6:49:00,10:25:00,13:44:00,17:10:00,,,,,,, 600 | 2016,118,Jeremy,Knaus,M,43,Green Bay,WI,USA,1:38:00,4:10:00,5:46:00,9:05:00,12:59:00,17:39:00,,,,,,, 601 | 2016,164,Timothy,Owata,M,38,Coon Rapids,MN,USA,2:20:00,4:34:00,6:07:00,9:45:00,13:18:00,17:39:00,,,,,,, 602 | 2016,36,John,D'agostino,M,36,Homer Glen,IL,USA,2:26:00,4:55:00,6:26:00,10:30:00,14:20:00,17:39:00,,,,,,, 603 | 2016,152,Jason,Mullenbach,M,43,Owatonna,MN,USA,2:15:00,4:47:00,6:17:00,9:45:00,13:18:00,17:56:00,,,,,,, 604 | 2016,187,Chris,Ramsey,M,52,Waconia,MN,USA,2:26:00,5:23:00,6:54:00,10:30:00,14:20:00,18:06:00,,,,,,, 605 | 2016,253,Karen,Wray,F,51,Crystal Lake,IL,USA,2:29:00,5:23:00,6:49:00,10:25:00,13:59:00,18:32:00,,,,,,, 606 | 2016,24,Jason,Chance,M,36,Milwaukee,WI,USA,2:28:00,4:59:00,6:37:00,10:25:00,14:21:00,18:32:00,,,,,,, 607 | 2016,120,Tim,Koh,M,53,Wheaton,IL,USA,2:29:00,5:23:00,6:54:00,10:25:00,13:44:00,18:42:00,,,,,,, 608 | 2016,27,Ryan,Chukuske,M,35,Shakopee,MN,USA,2:17:00,4:28:00,5:46:00,8:25:00,9:15:00,,,,,,,, 609 | 2016,88,Drew,Heitman,M,32,Shorewood,IL,USA,2:20:00,4:28:00,5:46:00,8:35:00,11:13:00,,,,,,,, 610 | 2016,130,Kevin,Langton,M,46,Mankato,MN,USA,2:02:00,4:05:00,5:18:00,8:25:00,12:30:00,,,,,,,, 611 | 2016,123,Cassie,Kottke,F,34,Neenah,WI,USA,2:26:00,4:58:00,6:20:00,9:25:00,12:43:00,,,,,,,, 612 | 2016,207,John,Schuhmacher,M,44,Mt. Horeb,WI,USA,2:24:00,4:32:00,5:48:00,8:25:00,12:53:00,,,,,,,, 613 | 2016,50,Terry,Eldien,M,45,Fergus Falls,MN,USA,2:20:00,4:28:00,5:46:00,8:45:00,12:55:00,,,,,,,, 614 | 2016,184,Stan,Pohmer,M,37,Hopkins,MN,USA,2:20:00,4:47:00,6:15:00,9:45:00,12:55:00,,,,,,,, 615 | 2016,67,Jeff,Goldstein,M,59,Maple Grove,MN,USA,2:24:00,4:48:00,6:07:00,9:45:00,13:59:00,,,,,,,, 616 | 2016,32,J.D.,Coolidge,M,42,Braham,MN,USA,2:26:00,5:09:00,6:37:00,10:25:00,14:20:00,,,,,,,, 617 | 2016,163,Meredith,Oneill,F,30,Richfield,MN,USA,2:29:00,5:23:00,6:54:00,10:25:00,14:20:00,,,,,,,, 618 | 2016,211,Tyler,Sears,M,28,Beloit,WI,USA,2:26:00,5:23:00,7:08:00,10:57:00,14:47:00,,,,,,,, 619 | 2016,210,Daniel,Sears,M,54,Machesney Park,IL,USA,2:26:00,5:23:00,7:08:00,10:57:00,14:47:00,,,,,,,, 620 | 2016,52,Sean,Faulk,M,43,Bloomington,MN,USA,1:49:00,4:03:00,5:18:00,8:25:00,,,,,,,,, 621 | 2016,166,Jeff,Paradise,M,30,Mt. Pleasant,SC,USA,2:20:00,,5:46:00,9:00:00,,,,,,,,, 622 | 2016,199,Chris,Rozoff,M,39,Madison,WI,USA,2:20:00,4:37:00,6:07:00,9:25:00,,,,,,,,, 623 | 2016,181,Andrew,Plackner,M,46,Maple Grove,MN,USA,2:24:00,4:47:00,6:15:00,9:45:00,,,,,,,,, 624 | 2016,160,Kevin,O'grady,M,57,Columbus,OH,USA,2:20:00,4:48:00,6:26:00,9:45:00,,,,,,,,, 625 | 2016,12,Cris,Bitker,M,45,Bemidji,MN,USA,2:26:00,4:59:00,6:37:00,10:23:00,,,,,,,,, 626 | 2016,168,Blake,Paulson,M,43,Louisville,KY,USA,1:49:00,4:28:00,7:02:00,10:30:00,,,,,,,,, 627 | 2016,107,Ross,Jilk,M,51,River Falls,WI,USA,2:20:00,4:55:00,6:26:00,10:39:00,,,,,,,,, 628 | 2016,23,Jeffrey,Carkhuff,M,55,Champlin,MN,USA,2:28:00,5:30:00,7:21:00,10:58:00,,,,,,,,, 629 | 2016,129,Brian,Landstrom,M,65,Duluth,MN,USA,2:24:00,5:09:00,7:02:00,11:43:00,,,,,,,,, 630 | 2016,220,John,Stewart,M,54,Shakopee,MN,USA,2:29:00,5:23:00,7:08:00,11:43:00,,,,,,,,, 631 | 2016,198,Todd,Rowe,M,60,Excelsior,MN,USA,2:26:00,5:23:00,7:21:00,11:43:00,,,,,,,,, 632 | 2016,56,Scott,Finger,M,52,Aurora,IL,USA,2:30:00,5:34:00,7:39:00,11:43:00,,,,,,,,, 633 | 2016,219,Alex,Stephens,M,38,Savage,MN,USA,2:20:00,5:11:00,7:39:00,,,,,,,,,, 634 | 2016,71,Elijah,Gregg,M,41,East Lansing,MI,USA,3:21:00,6:38:00,8:00:00,,,,,,,,,, 635 | 2016,172,Jeremy,Peterson,M,38,Detroit Lakes,MN,USA,2:29:00,5:52:00,,,,,,,,,,, 636 | 2016,84,John,Heemstra,M,40,Zeeland,MI,USA,2:28:00,6:05:00,,,,,,,,,,, 637 | 2016,63,Bill,Gengler,M,62,Saint Paul,MN,USA,2:29:00,6:11:00,,,,,,,,,,, 638 | 2016,256,Katie,Zopf,F,37,Farmington,MI,USA,2:29:00,6:11:00,,,,,,,,,,, 639 | 2016,154,Kurt,Neuburger,M,35,New Hope,MN,USA,2:28:00,6:29:00,,,,,,,,,,, 640 | ,,,,,,,,,,,,,,,,,,,,,33:57:20 -------------------------------------------------------------------------------- /testworkshop.txt: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION 2 | postgis_full_version 3 | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 4 | POSTGIS="2.3.3 r15473" GEOS="3.5.0-CAPI-1.9.0 r4084" PROJ="Rel. 4.9.2, 08 September 2015" GDAL="GDAL 1.11.3, released 2015/09/16" LIBXML="2.9.3" LIBJSON="0.11.99" RASTER 5 | (1 row) 6 | 7 | SET 8 | SET 9 | BEGIN 10 | CREATE TABLE 11 | ALTER TABLE 12 | addgeometrycolumn 13 | ----------------------------------------------------------------- 14 | public.superior100.geom SRID:26915 TYPE:MULTILINESTRING DIMS:2 15 | (1 row) 16 | 17 | COPY 1 18 | CREATE INDEX 19 | COMMIT 20 | ANALYZE 21 | BEGIN 22 | CREATE TABLE 23 | COPY 11 24 | COPY 11 25 | COPY 11 26 | COPY 11 27 | COPY 11 28 | COPY 11 29 | COPY 11 30 | COPY 11 31 | COPY 11 32 | COPY 11 33 | COPY 11 34 | COPY 11 35 | COPY 11 36 | COPY 11 37 | COPY 11 38 | COPY 11 39 | COPY 11 40 | COPY 11 41 | COPY 11 42 | COPY 11 43 | COPY 11 44 | COPY 11 45 | COPY 11 46 | COPY 11 47 | COPY 11 48 | COPY 11 49 | COPY 11 50 | COPY 11 51 | COPY 11 52 | COPY 11 53 | COPY 11 54 | COPY 11 55 | COPY 11 56 | COPY 11 57 | COPY 11 58 | COPY 11 59 | COPY 11 60 | COPY 11 61 | COPY 11 62 | COPY 11 63 | COPY 11 64 | COPY 11 65 | COPY 11 66 | COPY 11 67 | COPY 11 68 | COPY 11 69 | COPY 11 70 | COPY 11 71 | COPY 11 72 | COPY 11 73 | COPY 11 74 | COPY 11 75 | COPY 3 76 | CREATE INDEX 77 | ANALYZE 78 | addrasterconstraints 79 | ---------------------- 80 | t 81 | (1 row) 82 | 83 | COMMIT 84 | SET 85 | SET 86 | BEGIN 87 | CREATE TABLE 88 | ALTER TABLE 89 | addgeometrycolumn 90 | ------------------------------------------------------- 91 | public.aidstations.geom SRID:26915 TYPE:POINT DIMS:4 92 | (1 row) 93 | 94 | COPY 15 95 | CREATE INDEX 96 | COMMIT 97 | ANALYZE 98 | CREATE TABLE superiorresults ( 99 | year int4, 100 | bib int4, 101 | first text, 102 | last text, 103 | sex text, 104 | age int4, 105 | city text, 106 | state text, 107 | country text, 108 | splitrock interval, 109 | beaverbay interval, 110 | silverbay interval, 111 | tettegouche interval, 112 | cr6 interval, 113 | finland interval, 114 | crosby interval, 115 | sugarloaf interval, 116 | cramer interval, 117 | temperance interval, 118 | sawbill interval, 119 | oberg interval, 120 | finish interval 121 | ); 122 | CREATE TABLE 123 | \copy superiorresults from 'superiorresults.csv' with csv header; 124 | COPY 639 125 | create sequence superiorresults_id_seq; 126 | CREATE SEQUENCE 127 | alter table superiorresults add column id int8 primary key default nextval('superiorresults_id_seq'::regclass); 128 | ALTER TABLE 129 | CREATE TABLE superiorsplits AS 130 | WITH allsplits AS 131 | (SELECT id as runnerid, splitrock as split, 'splitrock' as aidstation FROM superiorresults WHERE splitrock < beaverbay 132 | UNION ALL 133 | SELECT id, beaverbay, 'beaverbay' FROM superiorresults WHERE beaverbay BETWEEN splitrock AND silverbay 134 | UNION ALL 135 | SELECT id, silverbay, 'silverbay' FROM superiorresults WHERE silverbay BETWEEN beaverbay AND tettegouche 136 | UNION ALL 137 | SELECT id, tettegouche, 'tettegouche' FROM superiorresults WHERE tettegouche BETWEEN silverbay and cr6 138 | UNION ALL 139 | SELECT id, cr6, 'cr6' FROM superiorresults WHERE cr6 BETWEEN tettegouche AND finland 140 | UNION ALL 141 | SELECT id, finland, 'finland' FROM superiorresults WHERE finland BETWEEN cr6 AND crosby 142 | UNION ALL 143 | SELECT id, crosby, 'crosby' FROM superiorresults WHERE crosby BETWEEN finland AND sugarloaf 144 | UNION ALL 145 | SELECT id, sugarloaf, 'sugarloaf' FROM superiorresults WHERE sugarloaf BETWEEN crosby AND cramer 146 | UNION ALL 147 | SELECT id, cramer, 'cramer' FROM superiorresults WHERE cramer BETWEEN sugarloaf AND temperance 148 | UNION ALL 149 | SELECT id, temperance, 'temperance' FROM superiorresults WHERE temperance BETWEEN cramer AND sawbill 150 | UNION ALL 151 | SELECT id, sawbill, 'sawbill' FROM superiorresults WHERE sawbill BETWEEN temperance AND oberg 152 | UNION ALL 153 | SELECT id, oberg, 'oberg' FROM superiorresults WHERE oberg BETWEEN sawbill AND finish 154 | UNION ALL 155 | SELECT id, finish, 'finish' FROM superiorresults WHERE finish > oberg 156 | ) 157 | SELECT *, (SELECT finish FROM superiorresults WHERE id=allsplits.runnerid) as finish from allsplits WHERE split IS NOT NULL 158 | ; 159 | SELECT 6358 160 | SELECT '2017-01-01 00:00-6'::timestamptz; 161 | timestamptz 162 | ------------------------ 163 | 2017-01-01 00:00:00-06 164 | (1 row) 165 | 166 | SELECT '2017-01-01'::timestamptz; 167 | timestamptz 168 | ------------------------ 169 | 2017-01-01 00:00:00-06 170 | (1 row) 171 | 172 | SELECT '4/5/2017'::timestamptz; 173 | timestamptz 174 | ------------------------ 175 | 2017-04-05 00:00:00-05 176 | (1 row) 177 | 178 | SET datestyle to dmy; 179 | SET 180 | SELECT '4/5/2017'::timestamptz; 181 | timestamptz 182 | ------------------------ 183 | 2017-05-04 00:00:00-05 184 | (1 row) 185 | 186 | SET datestyle TO DEFAULT; 187 | SET 188 | SELECT '4/5/2017'::timestamptz; 189 | timestamptz 190 | ------------------------ 191 | 2017-04-05 00:00:00-05 192 | (1 row) 193 | 194 | SELECT now(); 195 | now 196 | ------------------------------- 197 | 2017-09-04 12:42:46.042405-05 198 | (1 row) 199 | 200 | SET TIME ZONE 'Europe/Rome'; 201 | SET 202 | SELECT now(); 203 | now 204 | ------------------------------ 205 | 2017-09-04 19:42:46.04374+02 206 | (1 row) 207 | 208 | SET TIME ZONE 'UTC'; 209 | SET 210 | SELECT now(); 211 | now 212 | ------------------------------- 213 | 2017-09-04 17:42:46.044219+00 214 | (1 row) 215 | 216 | SET TIME ZONE 'PST8PDT'; 217 | SET 218 | SELECT now(); 219 | now 220 | ------------------------------- 221 | 2017-09-04 10:42:46.045039-07 222 | (1 row) 223 | 224 | SET TIME ZONE DEFAULT; 225 | SET 226 | SHOW TIME ZONE; 227 | TimeZone 228 | ----------- 229 | localtime 230 | (1 row) 231 | 232 | SELECT now(); 233 | now 234 | ------------------------------- 235 | 2017-09-04 12:42:46.045422-05 236 | (1 row) 237 | 238 | SELECT timezone('UTC', now()); 239 | timezone 240 | ---------------------------- 241 | 2017-09-04 17:42:46.045566 242 | (1 row) 243 | 244 | SELECT now() AT TIME ZONE 'America/Chicago'; 245 | timezone 246 | ---------------------------- 247 | 2017-09-04 12:42:46.045991 248 | (1 row) 249 | 250 | SELECT '1 day'::interval; 251 | interval 252 | ---------- 253 | 1 day 254 | (1 row) 255 | 256 | SELECT '2016-01-01'::timestamptz + '3 months'::interval; 257 | ?column? 258 | ------------------------ 259 | 2016-04-01 00:00:00-05 260 | (1 row) 261 | 262 | SELECT to_timestamp(0); 263 | to_timestamp 264 | ------------------------ 265 | 1969-12-31 18:00:00-06 266 | (1 row) 267 | 268 | SELECT timezone('UTC',to_timestamp(0)); 269 | timezone 270 | --------------------- 271 | 1970-01-01 00:00:00 272 | (1 row) 273 | 274 | SELECT extract(epoch from '2017-01-01'::timestamptz); 275 | date_part 276 | ------------ 277 | 1483250400 278 | (1 row) 279 | 280 | SELECT extract(epoch from '1 hour'::interval); 281 | date_part 282 | ----------- 283 | 3600 284 | (1 row) 285 | 286 | CREATE OR REPLACE FUNCTION to_epoch(IN timestamptz, OUT float8) AS $$ 287 | SELECT extract(epoch from $1); 288 | $$ LANGUAGE SQL; 289 | CREATE FUNCTION 290 | CREATE OR REPLACE FUNCTION to_epoch(IN interval, OUT float8) AS $$ 291 | SELECT extract(epoch from $1); 292 | $$ LANGUAGE SQL; 293 | CREATE FUNCTION 294 | SELECT to_epoch('2017-01-01'::timestamptz); 295 | to_epoch 296 | ------------ 297 | 1483250400 298 | (1 row) 299 | 300 | SELECT to_epoch('1 hour'::interval); 301 | to_epoch 302 | ---------- 303 | 3600 304 | (1 row) 305 | 306 | SELECT date_trunc('month', now()); 307 | date_trunc 308 | ------------------------ 309 | 2017-09-01 00:00:00-05 310 | (1 row) 311 | 312 | SELECT date_trunc('month', now()) + '1 month'::interval; 313 | ?column? 314 | ------------------------ 315 | 2017-10-01 00:00:00-05 316 | (1 row) 317 | 318 | SELECT id, substring(st_asewkt(geom),0,100) FROM superior100; 319 | id | substring 320 | ----+----------------------------------------------------------------------------------------------------- 321 | | SRID=26915;MULTILINESTRING((616037 5221994,616037 5221999,616040 5222023,616043 5222048,616045 5222 322 | (1 row) 323 | 324 | SELECT st_dumppoints(geom) FROM superior100 limit 10; 325 | st_dumppoints 326 | --------------------------------------------------------------- 327 | ("{1,1}",01010000202369000000000000CACC2241000000809AEB5341) 328 | ("{1,2}",01010000202369000000000000CACC2241000000C09BEB5341) 329 | ("{1,3}",01010000202369000000000000D0CC2241000000C0A1EB5341) 330 | ("{1,4}",01010000202369000000000000D6CC224100000000A8EB5341) 331 | ("{1,5}",01010000202369000000000000DACC224100000040AEEB5341) 332 | ("{1,6}",01010000202369000000000000E0CC224100000080B4EB5341) 333 | ("{1,7}",01010000202369000000000000E8CC224100000080B5EB5341) 334 | ("{1,8}",0101000020236900000000000008CD224100000080BAEB5341) 335 | ("{1,9}",0101000020236900000000000028CD224100000040BFEB5341) 336 | ("{1,10}",0101000020236900000000000048CD224100000000C4EB5341) 337 | (10 rows) 338 | 339 | SELECT (st_dumppoints(geom)).* FROM superior100 limit 10; 340 | path | geom 341 | --------+---------------------------------------------------- 342 | {1,1} | 01010000202369000000000000CACC2241000000809AEB5341 343 | {1,2} | 01010000202369000000000000CACC2241000000C09BEB5341 344 | {1,3} | 01010000202369000000000000D0CC2241000000C0A1EB5341 345 | {1,4} | 01010000202369000000000000D6CC224100000000A8EB5341 346 | {1,5} | 01010000202369000000000000DACC224100000040AEEB5341 347 | {1,6} | 01010000202369000000000000E0CC224100000080B4EB5341 348 | {1,7} | 01010000202369000000000000E8CC224100000080B5EB5341 349 | {1,8} | 0101000020236900000000000008CD224100000080BAEB5341 350 | {1,9} | 0101000020236900000000000028CD224100000040BFEB5341 351 | {1,10} | 0101000020236900000000000048CD224100000000C4EB5341 352 | (10 rows) 353 | 354 | WITH t AS (SELECT st_dumppoints(geom) as dump FROM superior100) 355 | SELECT 356 | (dump).path[2], 357 | st_asewkt((dump).geom), 358 | st_x((dump).geom), 359 | st_y((dump).geom) 360 | FROM t 361 | LIMIT 10; 362 | path | st_asewkt | st_x | st_y 363 | ------+----------------------------------+--------+--------- 364 | 1 | SRID=26915;POINT(616037 5221994) | 616037 | 5221994 365 | 2 | SRID=26915;POINT(616037 5221999) | 616037 | 5221999 366 | 3 | SRID=26915;POINT(616040 5222023) | 616040 | 5222023 367 | 4 | SRID=26915;POINT(616043 5222048) | 616043 | 5222048 368 | 5 | SRID=26915;POINT(616045 5222073) | 616045 | 5222073 369 | 6 | SRID=26915;POINT(616048 5222098) | 616048 | 5222098 370 | 7 | SRID=26915;POINT(616052 5222102) | 616052 | 5222102 371 | 8 | SRID=26915;POINT(616068 5222122) | 616068 | 5222122 372 | 9 | SRID=26915;POINT(616084 5222141) | 616084 | 5222141 373 | 10 | SRID=26915;POINT(616100 5222160) | 616100 | 5222160 374 | (10 rows) 375 | 376 | CREATE TABLE superior100_points AS 377 | WITH t AS (SELECT st_dumppoints(geom) as dump FROM superior100) 378 | SELECT 379 | (dump).path[2], 380 | (dump).geom, 381 | st_x((dump).geom) as x, 382 | st_y((dump).geom) as y 383 | FROM t; 384 | SELECT 7706 385 | ALTER TABLE superior100_points ADD COLUMN z float8; 386 | ALTER TABLE 387 | UPDATE superior100_points 388 | SET 389 | z=st_value(rast,geom) 390 | FROM dem 391 | WHERE st_intersects(dem.rast,geom); 392 | UPDATE 7706 393 | SELECT st_asewkt(geom), x, y, z FROM superior100_points LIMIT 10; 394 | st_asewkt | x | y | z 395 | ----------------------------------+--------+---------+------------------ 396 | SRID=26915;POINT(616037 5221994) | 616037 | 5221994 | 211.970001220703 397 | SRID=26915;POINT(616037 5221999) | 616037 | 5221999 | 211.970001220703 398 | SRID=26915;POINT(616040 5222023) | 616040 | 5222023 | 212.25 399 | SRID=26915;POINT(616043 5222048) | 616043 | 5222048 | 212.660003662109 400 | SRID=26915;POINT(616045 5222073) | 616045 | 5222073 | 213.889999389648 401 | SRID=26915;POINT(616048 5222098) | 616048 | 5222098 | 217.649993896484 402 | SRID=26915;POINT(616052 5222102) | 616052 | 5222102 | 217.649993896484 403 | SRID=26915;POINT(616068 5222122) | 616068 | 5222122 | 219.119995117188 404 | SRID=26915;POINT(616084 5222141) | 616084 | 5222141 | 219.119995117188 405 | SRID=26915;POINT(616100 5222160) | 616100 | 5222160 | 220.610000610352 406 | (10 rows) 407 | 408 | UPDATE superior100_points 409 | SET geom = st_setsrid(st_makepoint(x,y,z), 26915); 410 | UPDATE 7706 411 | SELECT st_asewkt(geom) FROM superior100_points LIMIT 10; 412 | st_asewkt 413 | --------------------------------------------------- 414 | SRID=26915;POINT(616037 5221994 211.970001220703) 415 | SRID=26915;POINT(616037 5221999 211.970001220703) 416 | SRID=26915;POINT(616040 5222023 212.25) 417 | SRID=26915;POINT(616043 5222048 212.660003662109) 418 | SRID=26915;POINT(616045 5222073 213.889999389648) 419 | SRID=26915;POINT(616048 5222098 217.649993896484) 420 | SRID=26915;POINT(616052 5222102 217.649993896484) 421 | SRID=26915;POINT(616068 5222122 219.119995117188) 422 | SRID=26915;POINT(616084 5222141 219.119995117188) 423 | SRID=26915;POINT(616100 5222160 220.610000610352) 424 | (10 rows) 425 | 426 | WITH t AS (SELECT * FROM superior100_points ORDER BY PATH) 427 | SELECT substring(st_asewkt(st_makeline(geom)),1,100) FROM t; 428 | substring 429 | ------------------------------------------------------------------------------------------------------ 430 | SRID=26915;LINESTRING(616037 5221994 211.970001220703,616037 5221999 211.970001220703,616040 5222023 431 | (1 row) 432 | 433 | CREATE TABLE superior1003d AS 434 | WITH t AS (SELECT * FROM superior100_points ORDER BY PATH) 435 | SELECT st_makeline(geom) as geom FROM t; 436 | SELECT 1 437 | SELECT path, x, y, z, z-lag(z) OVER (ORDER BY PATH) 438 | FROM superior100_points LIMIT 20; 439 | path | x | y | z | ?column? 440 | ------+--------+---------+------------------+-------------------- 441 | 1 | 616037 | 5221994 | 211.970001220703 | 442 | 2 | 616037 | 5221999 | 211.970001220703 | 0 443 | 3 | 616040 | 5222023 | 212.25 | 0.279998779296875 444 | 4 | 616043 | 5222048 | 212.660003662109 | 0.410003662109375 445 | 5 | 616045 | 5222073 | 213.889999389648 | 1.22999572753906 446 | 6 | 616048 | 5222098 | 217.649993896484 | 3.75999450683594 447 | 7 | 616052 | 5222102 | 217.649993896484 | 0 448 | 8 | 616068 | 5222122 | 219.119995117188 | 1.47000122070312 449 | 9 | 616084 | 5222141 | 219.119995117188 | 0 450 | 10 | 616100 | 5222160 | 220.610000610352 | 1.49000549316406 451 | 11 | 616116 | 5222179 | 216.899993896484 | -3.71000671386719 452 | 12 | 616109 | 5222192 | 223.210006713867 | 6.31001281738281 453 | 13 | 616098 | 5222214 | 223.210006713867 | 0 454 | 14 | 616101 | 5222224 | 218.929992675781 | -4.28001403808594 455 | 15 | 616120 | 5222240 | 211.449996948242 | -7.47999572753906 456 | 16 | 616139 | 5222256 | 224.25 | 12.8000030517578 457 | 17 | 616147 | 5222241 | 212.020004272461 | -12.2299957275391 458 | 18 | 616162 | 5222244 | 224.25 | 12.2299957275391 459 | 19 | 616186 | 5222250 | 228.119995117188 | 3.8699951171875 460 | 20 | 616203 | 5222266 | 227.240005493164 | -0.879989624023438 461 | (20 rows) 462 | 463 | ALTER TABLE superior100_points ADD COLUMN elchange float8; 464 | ALTER TABLE 465 | WITH t AS (SELECT path, x, y, z, 466 | round((z-lag(z) OVER (ORDER BY PATH))::numeric,1) elchange 467 | FROM superior100_points) 468 | UPDATE superior100_points p SET elchange=t.elchange 469 | FROM t WHERE p.path=t.path; 470 | UPDATE 7706 471 | SELECT x, y, z, elchange FROM superior100_points limit 10; 472 | x | y | z | elchange 473 | --------+---------+------------------+---------- 474 | 616037 | 5221994 | 211.970001220703 | 475 | 616037 | 5221999 | 211.970001220703 | 0 476 | 616040 | 5222023 | 212.25 | 0.3 477 | 616043 | 5222048 | 212.660003662109 | 0.4 478 | 616045 | 5222073 | 213.889999389648 | 1.2 479 | 616048 | 5222098 | 217.649993896484 | 3.8 480 | 616052 | 5222102 | 217.649993896484 | 0 481 | 616068 | 5222122 | 219.119995117188 | 1.5 482 | 616084 | 5222141 | 219.119995117188 | 0 483 | 616100 | 5222160 | 220.610000610352 | 1.5 484 | (10 rows) 485 | 486 | SELECT 487 | 3.28 * sum(elchange) FILTER (WHERE elchange>0) as gain, 488 | 3.28 * sum(elchange) FILTER (WHERE elchange<0) as descent 489 | FROM superior100_points; 490 | gain | descent 491 | ------------------+------------ 492 | 24922.7520000001 | -24452.072 493 | (1 row) 494 | 495 | SELECT path, x, y, z, 496 | degrees(st_azimuth(lag(geom) OVER (ORDER BY path), geom)) 497 | FROM superior100_points LIMIT 20; 498 | path | x | y | z | degrees 499 | ------+--------+---------+------------------+------------------ 500 | 1 | 616037 | 5221994 | 211.970001220703 | 501 | 2 | 616037 | 5221999 | 211.970001220703 | 0 502 | 3 | 616040 | 5222023 | 212.25 | 7.1250163489018 503 | 4 | 616043 | 5222048 | 212.660003662109 | 6.84277341263094 504 | 5 | 616045 | 5222073 | 213.889999389648 | 4.57392125990086 505 | 6 | 616048 | 5222098 | 217.649993896484 | 6.84277341263094 506 | 7 | 616052 | 5222102 | 217.649993896484 | 45 507 | 8 | 616068 | 5222122 | 219.119995117188 | 38.6598082540901 508 | 9 | 616084 | 5222141 | 219.119995117188 | 40.1009075462122 509 | 10 | 616100 | 5222160 | 220.610000610352 | 40.1009075462122 510 | 11 | 616116 | 5222179 | 216.899993896484 | 40.1009075462122 511 | 12 | 616109 | 5222192 | 223.210006713867 | 331.699244233994 512 | 13 | 616098 | 5222214 | 223.210006713867 | 333.434948822922 513 | 14 | 616101 | 5222224 | 218.929992675781 | 16.6992442339936 514 | 15 | 616120 | 5222240 | 211.449996948242 | 49.8990924537878 515 | 16 | 616139 | 5222256 | 224.25 | 49.8990924537878 516 | 17 | 616147 | 5222241 | 212.020004272461 | 151.927513064147 517 | 18 | 616162 | 5222244 | 224.25 | 78.6900675259798 518 | 19 | 616186 | 5222250 | 228.119995117188 | 75.9637565320735 519 | 20 | 616203 | 5222266 | 227.240005493164 | 46.7357045889284 520 | (20 rows) 521 | 522 | SELECT st_length(geom)/1609 FROM superior1003d; 523 | ?column? 524 | ------------------ 525 | 99.9703141773914 526 | (1 row) 527 | 528 | SELECT st_3dlength(geom)/1609 FROM superior1003d; 529 | ?column? 530 | ------------------ 531 | 101.114767684496 532 | (1 row) 533 | 534 | SELECT st_asewkt(st_lineinterpolatepoint(geom,.5)) 535 | FROM superior1003d; 536 | st_asewkt 537 | ------------------------------------------------------------ 538 | SRID=26915;POINT(634236 5255874.43108546 471.070007324219) 539 | (1 row) 540 | 541 | SELECT st_asewkt(st_lineinterpolatepoint(geom,50*1609/st_length(geom))) 542 | FROM superior1003d; 543 | st_asewkt 544 | ------------------------------------------------------------ 545 | SRID=26915;POINT(634236 5255898.31332975 472.203611857971) 546 | (1 row) 547 | 548 | SELECT 549 | a.aidstation, 550 | a.miles, 551 | a.miles/st_length(s.geom)*1609 as along_track, 552 | a.miles/103.2 along_total_distance, 553 | st_linelocatepoint(s.geom,a.geom) at_nearest_point 554 | FROM 555 | aidstations a, 556 | superior1003d s 557 | ORDER BY a.miles 558 | ; 559 | aidstation | miles | along_track | along_total_distance | at_nearest_point 560 | -------------+-------+--------------------+----------------------+-------------------- 561 | start | 0 | 0 | 0 | 0 562 | splitrock | 9.7 | 0.0970288037985749 | 0.0939922480620155 | 0.0884339602695875 563 | beaverbay | 20 | 0.200059389275412 | 0.193798449612403 | 0.190039174775857 564 | silverbay | 24.9 | 0.249073939647888 | 0.241279069767442 | 0.23615202371927 565 | tettegouche | 34.8 | 0.348103337339217 | 0.337209302325581 | 0.32661383421069 566 | cr6 | 43.4 | 0.434128874727644 | 0.420542635658915 | 0.411704544677768 567 | finland | 51.1 | 0.511151739598678 | 0.49515503875969 | 0.486143768586655 568 | sonju | 58.6 | 0.586174010576958 | 0.567829457364341 | 0.562076220731827 569 | crosby | 62.8 | 0.628186482324794 | 0.608527131782946 | 0.602721497294969 570 | sugarloaf | 72.2 | 0.722214395284238 | 0.699612403100775 | 0.698552417757572 571 | cramer | 77.8 | 0.778231024281353 | 0.753875968992248 | 0.752054022915056 572 | temperance | 84.9 | 0.849252107474124 | 0.822674418604651 | 0.821037717962419 573 | sawbill | 90.6 | 0.906269033417617 | 0.877906976744186 | 0.873870577694405 574 | oberg | 96.1 | 0.961285365468355 | 0.931201550387597 | 0.928819720772351 575 | finish | 103.2 | 1.03230644866113 | 1 | 1 576 | (15 rows) 577 | 578 | CREATE TABLE sections AS 579 | SELECT 580 | aidstation, 581 | miles, 582 | st_addmeasure( 583 | st_linesubstring( 584 | s.geom, 585 | st_linelocatepoint(s.geom, 586 | lag(a.geom) OVER (ORDER BY miles)), 587 | st_linelocatepoint(s.geom,a.geom) 588 | ), 589 | lag(a.miles) OVER (ORDER BY miles), 590 | a.miles 591 | ) as geom 592 | FROM 593 | aidstations a, 594 | superior1003d s 595 | ORDER BY a.miles 596 | ; 597 | SELECT 15 598 | SELECT aidstation, miles, substring(st_asewkt(geom),0,100) FROM sections; 599 | aidstation | miles | substring 600 | -------------+-------+----------------------------------------------------------------------------------------------------- 601 | start | 0 | 602 | splitrock | 9.7 | SRID=26915;LINESTRING(616037 5221994 211.970001220703 0,616037 5221999 211.970001220703 0.003409538 603 | beaverbay | 20 | SRID=26915;LINESTRING(620962 5227202 208.330001831055 9.7,620972 5227225 210.020004272461 9.7158059 604 | silverbay | 24.9 | SRID=26915;LINESTRING(627886.980534602 5236115.86174252 283.254262283495 20,627889 5236118 283.3599 605 | tettegouche | 34.8 | SRID=26915;LINESTRING(628642 5239000 337.720001220703 24.9,628638 5239020 338.670013427734 24.91387 606 | cr6 | 43.4 | SRID=26915;LINESTRING(634717.011587533 5245410.68211671 310.410115487287 34.8,634724 5245420 310.48 607 | finland | 51.1 | SRID=26915;LINESTRING(639229 5252553 355.790008544922 43.4,639227 5252566 355.549987792969 43.40845 608 | sonju | 58.6 | SRID=26915;LINESTRING(633523 5254264 401.119995117188 51.1,633523 5254266 401.119995117188 51.10122 609 | crosby | 62.8 | SRID=26915;LINESTRING(637258 5260468 471.75 58.6,637251 5260454 471 58.6100553026911,637239 5260431 610 | sugarloaf | 72.2 | SRID=26915;LINESTRING(642205.931929514 5260077.3150877 443.161481674377 62.8,642221 5260078 442.230 611 | cramer | 77.8 | SRID=26915;LINESTRING(650793 5262452 337.029998779297 72.2,650793 5262452 337.029998779297 72.2,650 612 | temperance | 84.9 | SRID=26915;LINESTRING(652178.41050353 5267208.11575529 390.349999618797 77.8,652179 5267209 390.309 613 | sawbill | 90.6 | SRID=26915;LINESTRING(659127.481664561 5270058.90366709 256.362463282696 84.9,659152 5270054 254.96 614 | oberg | 96.1 | SRID=26915;LINESTRING(660721.992527336 5273874.08967197 369.073336019578 90.6,660721 5273886 368.19 615 | finish | 103.2 | SRID=26915;LINESTRING(666427.457118748 5277351.23603533 372.650583456592 96.1,666428 5277351 372.60 616 | (15 rows) 617 | 618 | CREATE TABLE superior1003dm AS 619 | SELECT st_linemerge(st_collect(geom)) AS geom FROM sections; 620 | SELECT 1 621 | SELECT substring(st_asewkt(geom),0,100) FROM superior1003dm; 622 | substring 623 | ----------------------------------------------------------------------------------------------------- 624 | SRID=26915;LINESTRING(616037 5221994 211.970001220703,616037 5221999 211.970001220703,616040 522202 625 | (1 row) 626 | 627 | DROP TABLE superior1003dm; 628 | DROP TABLE 629 | CREATE TABLE superior1003dm AS 630 | WITH 631 | p1 AS 632 | (SELECT (st_dumppoints(geom)).* FROM sections), 633 | p2 AS 634 | (SELECT DISTINCT ON (st_m(geom)) geom, st_m(geom) 635 | FROM p1 ORDER BY st_m(geom)) 636 | SELECT st_makeline(geom) as geom FROM p2; 637 | SELECT 1 638 | SELECT substring(st_asewkt(geom),0,100) FROM superior1003dm; 639 | substring 640 | ----------------------------------------------------------------------------------------------------- 641 | SRID=26915;LINESTRING(616037 5221994 211.970001220703 0,616037 5221999 211.970001220703 0.003409538 642 | (1 row) 643 | 644 | SELECT * FROM superiorsplits ORDER BY runnerid, aidstation LIMIT 20; 645 | runnerid | split | aidstation | finish 646 | ----------+----------+-------------+---------- 647 | 1 | 03:22:00 | beaverbay | 21:58:32 648 | 1 | 08:10:00 | cr6 | 21:58:32 649 | 1 | 16:12:00 | cramer | 21:58:32 650 | 1 | 12:17:00 | crosby | 21:58:32 651 | 1 | 21:58:32 | finish | 21:58:32 652 | 1 | 09:44:00 | finland | 21:58:32 653 | 1 | 20:20:00 | oberg | 21:58:32 654 | 1 | 19:06:00 | sawbill | 21:58:32 655 | 1 | 04:18:00 | silverbay | 21:58:32 656 | 1 | 01:36:00 | splitrock | 21:58:32 657 | 1 | 14:47:00 | sugarloaf | 21:58:32 658 | 1 | 17:56:00 | temperance | 21:58:32 659 | 1 | 06:12:00 | tettegouche | 21:58:32 660 | 2 | 03:14:00 | beaverbay | 22:52:28 661 | 2 | 07:58:00 | cr6 | 22:52:28 662 | 2 | 16:10:00 | cramer | 22:52:28 663 | 2 | 12:11:00 | crosby | 22:52:28 664 | 2 | 22:52:28 | finish | 22:52:28 665 | 2 | 09:32:00 | finland | 22:52:28 666 | 2 | 21:09:00 | oberg | 22:52:28 667 | (20 rows) 668 | 669 | SELECT aidstation, min(split), avg(split), max(split) 670 | FROM superiorsplits GROUP BY aidstation ORDER BY min(split); 671 | aidstation | min | avg | max 672 | -------------+----------+-----------------+---------- 673 | splitrock | 01:18:00 | 02:11:53.311475 | 03:21:00 674 | beaverbay | 02:53:00 | 04:33:59.390863 | 06:38:00 675 | silverbay | 03:40:00 | 05:52:20.067912 | 07:50:00 676 | tettegouche | 05:30:00 | 08:43:24 | 11:28:00 677 | cr6 | 07:20:00 | 11:31:37.73309 | 14:30:00 678 | finland | 08:39:00 | 14:00:09.590164 | 17:56:00 679 | crosby | 10:56:00 | 18:25:52.129032 | 23:53:00 680 | sugarloaf | 13:00:00 | 22:11:23.595506 | 27:45:00 681 | cramer | 14:49:00 | 24:29:03.46988 | 29:36:00 682 | temperance | 16:22:00 | 26:57:45.721519 | 32:07:00 683 | sawbill | 17:30:00 | 28:50:58.469388 | 33:30:00 684 | oberg | 18:00:00 | 30:25:14.676259 | 34:57:00 685 | finish | 19:30:37 | 32:58:00.671329 | 38:26:38 686 | (13 rows) 687 | 688 | SELECT aidstation, min(split), avg(split), max(split) 689 | FROM superiorsplits 690 | WHERE finish BETWEEN '35 hours'::interval AND '37 hours'::interval 691 | GROUP BY aidstation ORDER BY min(split); 692 | aidstation | min | avg | max 693 | -------------+----------+-----------------+---------- 694 | splitrock | 01:44:00 | 02:20:34.455446 | 02:54:00 695 | beaverbay | 03:45:00 | 04:48:42.178218 | 05:46:00 696 | silverbay | 04:46:00 | 06:10:43.68932 | 07:07:00 697 | tettegouche | 07:27:00 | 09:11:39.056604 | 10:36:00 698 | cr6 | 10:10:00 | 12:12:33.142857 | 13:47:00 699 | finland | 12:28:00 | 15:04:33.142857 | 16:42:00 700 | crosby | 16:32:00 | 20:03:01.730769 | 22:32:00 701 | sugarloaf | 20:49:00 | 24:06:47.884615 | 26:43:00 702 | cramer | 24:40:00 | 26:20:06.407767 | 28:42:00 703 | temperance | 27:36:00 | 29:06:24.950495 | 30:55:00 704 | sawbill | 29:55:00 | 31:03:25.8 | 32:35:00 705 | oberg | 31:28:00 | 33:09:50 | 34:30:00 706 | finish | 35:00:01 | 35:55:32.2 | 36:59:06 707 | (13 rows) 708 | 709 | CREATE TABLE bitner_goal AS 710 | WITH 711 | goalsplits AS ( 712 | SELECT aidstation, avg(split) as goal 713 | FROM superiorsplits 714 | WHERE finish BETWEEN '35 hours'::interval AND '37 hours'::interval 715 | GROUP BY aidstation ORDER BY min(split) 716 | ) 717 | SELECT 718 | aidstation, 719 | miles as miles, 720 | miles - coalesce(lag(miles) OVER (ORDER BY miles),0) AS miles_section, 721 | coalesce(lag(goal) OVER (ORDER BY miles),'0 hours'::interval) as goal_from, 722 | goal as goal_to, 723 | goal - 724 | coalesce(lag(goal) OVER (ORDER BY miles),'0 hours'::interval) 725 | AS goal_section, 726 | '2017-09-08 08:00:00 CDT'::timestamptz + goal AS goal_time, 727 | (goal - coalesce(lag(goal) OVER (ORDER BY miles),'0 hours'::interval)) 728 | / 729 | (miles - coalesce(lag(miles) OVER (ORDER BY miles),0)) 730 | as pace_section 731 | FROM 732 | sections JOIN goalsplits USING (aidstation) 733 | ; 734 | SELECT 13 735 | SELECT * FROM bitner_goal; 736 | aidstation | miles | miles_section | goal_from | goal_to | goal_section | goal_time | pace_section 737 | -------------+-------+------------------+-----------------+-----------------+-----------------+-------------------------------+----------------- 738 | splitrock | 9.7 | 9.7 | 00:00:00 | 02:20:34.455446 | 02:20:34.455446 | 2017-09-08 10:20:34.455446-05 | 00:14:29.531489 739 | beaverbay | 20 | 10.3 | 02:20:34.455446 | 04:48:42.178218 | 02:28:07.722772 | 2017-09-08 12:48:42.178218-05 | 00:14:22.885706 740 | silverbay | 24.9 | 4.9 | 04:48:42.178218 | 06:10:43.68932 | 01:22:01.511102 | 2017-09-08 14:10:43.68932-05 | 00:16:44.390021 741 | tettegouche | 34.8 | 9.9 | 06:10:43.68932 | 09:11:39.056604 | 03:00:55.367284 | 2017-09-08 17:11:39.056604-05 | 00:18:16.501746 742 | cr6 | 43.4 | 8.6 | 09:11:39.056604 | 12:12:33.142857 | 03:00:54.086253 | 2017-09-08 20:12:33.142857-05 | 00:21:02.103053 743 | finland | 51.1 | 7.7 | 12:12:33.142857 | 15:04:33.142857 | 02:52:00 | 2017-09-08 23:04:33.142857-05 | 00:22:20.25974 744 | crosby | 62.8 | 11.7 | 15:04:33.142857 | 20:03:01.730769 | 04:58:28.587912 | 2017-09-09 04:03:01.730769-05 | 00:25:30.648539 745 | sugarloaf | 72.2 | 9.40000000000001 | 20:03:01.730769 | 24:06:47.884615 | 04:03:46.153846 | 2017-09-09 08:06:47.884615-05 | 00:25:55.973813 746 | cramer | 77.8 | 5.59999999999999 | 24:06:47.884615 | 26:20:06.407767 | 02:13:18.523152 | 2017-09-09 10:20:06.407767-05 | 00:23:48.307706 747 | temperance | 84.9 | 7.10000000000001 | 26:20:06.407767 | 29:06:24.950495 | 02:46:18.542728 | 2017-09-09 13:06:24.950495-05 | 00:23:25.428553 748 | sawbill | 90.6 | 5.69999999999999 | 29:06:24.950495 | 31:03:25.8 | 01:57:00.849505 | 2017-09-09 15:03:25.8-05 | 00:20:31.727983 749 | oberg | 96.1 | 5.5 | 31:03:25.8 | 33:09:50 | 02:06:24.2 | 2017-09-09 17:09:50-05 | 00:22:58.945455 750 | finish | 103.2 | 7.10000000000001 | 33:09:50 | 35:55:32.2 | 02:45:42.2 | 2017-09-09 19:55:32.2-05 | 00:23:20.309859 751 | (13 rows) 752 | 753 | CREATE TABLE bitner_goal_track AS 754 | WITH 755 | t1 AS ( 756 | SELECT 757 | st_addmeasure(geom, to_epoch(goal_from), to_epoch(goal_to)) 758 | AS geom 759 | FROM 760 | sections JOIN bitner_goal USING (aidstation) 761 | ), 762 | p1 AS 763 | (SELECT (st_dumppoints(geom)).* FROM t1), 764 | p2 AS 765 | (SELECT DISTINCT ON (st_m(geom)) geom, st_m(geom) 766 | FROM p1 ORDER BY st_m(geom)) 767 | SELECT st_makeline(geom) as geom FROM p2; 768 | SELECT 1 769 | SELECT substring(st_asewkt(geom),0,100) FROM bitner_goal_track; 770 | substring 771 | ----------------------------------------------------------------------------------------------------- 772 | SRID=26915;LINESTRING(616037 5221994 211.970001220703 0,616037 5221999 211.970001220703 2.964700848 773 | (1 row) 774 | 775 | WITH point AS 776 | (SELECT st_geometryn(st_locatealong(geom,60),1) as point FROM superior1003dm) 777 | SELECT 778 | (st_m( 779 | st_lineinterpolatepoint( 780 | geom, 781 | st_linelocatepoint(geom,point.point) 782 | ) 783 | )::text || ' seconds')::interval 784 | FROM bitner_goal_track, point; 785 | interval 786 | ----------------- 787 | 16:44:02.672161 788 | (1 row) 789 | 790 | SELECT * FROM superiorsplits 791 | WHERE aidstation='finish' AND finish BETWEEN '35.5 hours'::interval AND '36.5 hours'::interval LIMIT 20; 792 | runnerid | split | aidstation | finish 793 | ----------+----------+------------+---------- 794 | 93 | 35:34:01 | finish | 35:34:01 795 | 94 | 35:38:16 | finish | 35:38:16 796 | 95 | 35:41:20 | finish | 35:41:20 797 | 96 | 35:44:56 | finish | 35:44:56 798 | 97 | 35:50:24 | finish | 35:50:24 799 | 98 | 35:55:25 | finish | 35:55:25 800 | 99 | 35:58:07 | finish | 35:58:07 801 | 100 | 35:58:07 | finish | 35:58:07 802 | 101 | 36:00:57 | finish | 36:00:57 803 | 102 | 36:02:11 | finish | 36:02:11 804 | 103 | 36:02:12 | finish | 36:02:12 805 | 104 | 36:02:14 | finish | 36:02:14 806 | 105 | 36:05:35 | finish | 36:05:35 807 | 106 | 36:08:41 | finish | 36:08:41 808 | 107 | 36:14:30 | finish | 36:14:30 809 | 108 | 36:15:33 | finish | 36:15:33 810 | 109 | 36:15:35 | finish | 36:15:35 811 | 110 | 36:18:15 | finish | 36:18:15 812 | 111 | 36:19:55 | finish | 36:19:55 813 | 112 | 36:28:02 | finish | 36:28:02 814 | (20 rows) 815 | 816 | CREATE TABLE target_goal AS 817 | WITH 818 | goalsplits AS ( 819 | SELECT aidstation, split as goal 820 | FROM superiorsplits 821 | WHERE runnerid = 93 822 | ) 823 | SELECT 824 | aidstation, 825 | miles AS miles, 826 | miles - coalesce(lag(miles) OVER (ORDER BY miles),0) 827 | AS miles_section, 828 | coalesce(lag(goal) OVER (ORDER BY miles),'0 hours'::interval) 829 | AS goal_from, 830 | goal AS goal_to, 831 | goal - 832 | coalesce(lag(goal) OVER (ORDER BY miles),'0 hours'::interval) 833 | AS goal_section, 834 | '2017-09-08 08:00:00 CDT'::timestamptz + goal AS goal_time, 835 | (goal - coalesce(lag(goal) OVER (ORDER BY miles),'0 hours'::interval)) 836 | / 837 | (miles - coalesce(lag(miles) OVER (ORDER BY miles),0)) 838 | as pace_section 839 | FROM 840 | sections JOIN goalsplits USING (aidstation) 841 | ; 842 | SELECT 11 843 | SELECT * FROM target_goal; 844 | aidstation | miles | miles_section | goal_from | goal_to | goal_section | goal_time | pace_section 845 | -------------+-------+------------------+-----------+----------+--------------+------------------------+----------------- 846 | silverbay | 24.9 | 24.9 | 00:00:00 | 06:36:00 | 06:36:00 | 2017-09-08 14:36:00-05 | 00:15:54.216867 847 | tettegouche | 34.8 | 9.9 | 06:36:00 | 09:30:00 | 02:54:00 | 2017-09-08 17:30:00-05 | 00:17:34.545455 848 | cr6 | 43.4 | 8.6 | 09:30:00 | 12:25:00 | 02:55:00 | 2017-09-08 20:25:00-05 | 00:20:20.930233 849 | finland | 51.1 | 7.7 | 12:25:00 | 15:00:00 | 02:35:00 | 2017-09-08 23:00:00-05 | 00:20:07.792208 850 | crosby | 62.8 | 11.7 | 15:00:00 | 19:40:00 | 04:40:00 | 2017-09-09 03:40:00-05 | 00:23:55.897436 851 | sugarloaf | 72.2 | 9.40000000000001 | 19:40:00 | 23:40:00 | 04:00:00 | 2017-09-09 07:40:00-05 | 00:25:31.914894 852 | cramer | 77.8 | 5.59999999999999 | 23:40:00 | 25:45:00 | 02:05:00 | 2017-09-09 09:45:00-05 | 00:22:19.285714 853 | temperance | 84.9 | 7.10000000000001 | 25:45:00 | 28:32:00 | 02:47:00 | 2017-09-09 12:32:00-05 | 00:23:31.267606 854 | sawbill | 90.6 | 5.69999999999999 | 28:32:00 | 30:35:00 | 02:03:00 | 2017-09-09 14:35:00-05 | 00:21:34.736842 855 | oberg | 96.1 | 5.5 | 30:35:00 | 32:51:00 | 02:16:00 | 2017-09-09 16:51:00-05 | 00:24:43.636364 856 | finish | 103.2 | 7.10000000000001 | 32:51:00 | 35:34:01 | 02:43:01 | 2017-09-09 19:34:01-05 | 00:22:57.605634 857 | (11 rows) 858 | 859 | CREATE TABLE target_goal_track AS 860 | WITH 861 | t1 AS ( 862 | SELECT 863 | st_addmeasure(geom, to_epoch(goal_from), 864 | to_epoch(goal_to)) AS geom 865 | FROM 866 | sections JOIN target_goal USING (aidstation) 867 | ), 868 | p1 AS 869 | (SELECT (st_dumppoints(geom)).* FROM t1), 870 | p2 AS 871 | (SELECT DISTINCT ON (st_m(geom)) geom, st_m(geom) 872 | FROM p1 ORDER BY st_m(geom)) 873 | SELECT st_makeline(geom) as geom FROM p2; 874 | SELECT 1 875 | SELECT substring(st_asewkt(geom),0,100) FROM target_goal_track; 876 | substring 877 | ----------------------------------------------------------------------------------------------------- 878 | SRID=26915;LINESTRING(627886.980534602 5236115.86174252 283.254262283495 0,627889 5236118 283.35998 879 | (1 row) 880 | 881 | SELECT st_isvalidtrajectory(geom) FROM bitner_goal_track; 882 | st_isvalidtrajectory 883 | ---------------------- 884 | t 885 | (1 row) 886 | 887 | SELECT st_isvalidtrajectory(geom) FROM target_goal_track; 888 | st_isvalidtrajectory 889 | ---------------------- 890 | t 891 | (1 row) 892 | 893 | SELECT (st_closestpointofapproach( 894 | (SELECT st_linesubstring(geom,.5,1) FROM bitner_goal_track), 895 | (SELECT st_linesubstring(geom,.5,1) FROM target_goal_track) 896 | )::text || ' seconds')::interval; 897 | interval 898 | ----------------- 899 | 29:07:16.601321 900 | (1 row) 901 | 902 | SELECT st_distancecpa( 903 | (SELECT st_linesubstring(geom,.5,1) FROM bitner_goal_track), 904 | (SELECT st_linesubstring(geom,.5,1) FROM target_goal_track) 905 | ); 906 | st_distancecpa 907 | ------------------ 908 | 115.023461985643 909 | (1 row) 910 | 911 | -------------------------------------------------------------------------------- /workshop.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -x 2 | export PGDATBASE=superior 3 | sed -n '/^```sql/,/^```/ p' < index.md | sed '/^```/ d' > sqlcommands.sql 4 | sed -n '/^```bash/,/^```/ p' < index.md | sed '/^```/ d' > bashcommands.sh 5 | bash -x bashcommands.sh > testworkshop.txt 6 | psql -a -f sqlcommands.sql superior >> testworkshop.txt --------------------------------------------------------------------------------