Mapping History
 (starting with Manchester)
      Frankie Roberto
      frankie@frankieroberto.com
      Twitter: frankier...
Currently, OpenStreetMap
maps change over time, as
    people edit them.
...in a way that printed maps don’t.
        N.B. This map, in Sheffield, has been like this for months.
But these changes represent
 the speed at which editors
  update and improve the
   maps, not the speed of
  changes on th...
I’d like to be able to add a
time-slider to maps, so that
you can see how the places
  themselves have changed
           ...
Comparing old maps with
   new maps is fun...
Before...
After...
But these comparisons are
 made harder by the big
 changes in cartography.
I’ve mapped some of the buildings in Manchester...
...where there are lots of pretty old buildings...
...and some ugly newer ones...
...as well as a few under construction.
(I’ve shared all the photos on Flickr)
...where they are even machine tagged with the appropriate way.
The years in which the
buildings were constructed
    have been added to
 OpenStreetMap using...
start_date=
This information can
    sometimes be found
inscribed on the buildings,
but for the most part I used
     the local librar...
Isn’t it pretty?
Books like this were a great help.
...it even has a gazeteer, listing the buildings by street.
So, given this data, how do
you filter out new buildings
      from old maps?
You could add extra rules
to Mapnik or Osmarender.

...but it’s probably easiest
      to pre-process.
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"...
#!/bin/bash

for (( i = 1900; i < 2011; i = i + 10))
do
	    xsltproc --stringparam "year" "$i" start_date_filter.xsl data...
#!/bin/bash

for (( i = 1900; i < 2011; i = i + 10))
do
	    ln -s ../files/$i.osm data.osm
	    xsltproc osmarender.xsl o...
A quick caveat...
A quick caveat...

start_date_filter.xsl   expects start_date=YYYY
A quick caveat...

start_date_filter.xsl   expects start_date=YYYY

         but the actual date might be:
A quick caveat...

start_date_filter.xsl   expects start_date=YYYY

         but the actual date might be:


   1934-10
A quick caveat...

start_date_filter.xsl   expects start_date=YYYY

          but the actual date might be:


    1934-10
...
A quick caveat...

start_date_filter.xsl   expects start_date=YYYY

          but the actual date might be:


    1934-10 ...
A quick caveat...

start_date_filter.xsl   expects start_date=YYYY

          but the actual date might be:


    1934-10 ...
A quick caveat...

start_date_filter.xsl   expects start_date=YYYY

          but the actual date might be:


    1934-10 ...
A quick caveat...

start_date_filter.xsl   expects start_date=YYYY

          but the actual date might be:


    1934-10 ...
A quick caveat...

start_date_filter.xsl    expects start_date=YYYY

          but the actual date might be:


    1934-10...
Here’s how the rendered files look:




                                     1 80 0
18 1 0
1820
1830
1840
Theatre Royale




                 1850
Free Trade Hall




                  1860
Lloyd’s House




                1870
Town Hall




Train station




                1 880
Elliot House




               1 89 0
Train station goods warehouse



1900
Midland Hotel




                19 1 0
St George’s House



                    1920
1930
Town Hall Extension




   Central Library




                      1940
1950
Peter House


              1960
Lincoln Square




                 1970
1 980
Heron House




              1990
20 0 0
Great Northern Tower




                       20 1 0 (?)
But there’s a problem with this map!




                                       There are buildings I don’t have dates for...
Take a look at this old map of the area for example...




                      We could trace all these old buildings, a...
end_date=
But there’s a problem:
But there’s a problem:

  We don’t want long-demolished
 buildings appearing on the maps!
But there’s a problem:

    We don’t want long-demolished
   buildings appearing on the maps!


Renderers could filter out ...
But it’d probably be best to
move the filtering to the API:
But it’d probably be best to
  move the filtering to the API:

GET http://www.openstreetmap.org/api/0.7/[...]?date=1932
But it’d probably be best to
  move the filtering to the API:

GET http://www.openstreetmap.org/api/0.7/[...]?date=1932



...
We also need to date attributes:
We also need to date attributes:
• Name changes   (old_name=)
We also need to date attributes:
• Name changes     (old_name=)
• Change in use   (amenity=cinema becomes sport=bingo)
We also need to date attributes:
• Name changes (old_name=)
• Change in use (amenity=cinema becomes sport=bingo)
• Change ...
We also need to date attributes:
• Name changes (old_name=)
• Change in use (amenity=cinema becomes sport=bingo)
• Change ...
One solution is add two extra columns:
One solution is add two extra columns:

          Tag               start_date   end_date
     amenity=bank             19...
One solution is add two extra columns:

          Tag               start_date   end_date
     amenity=bank             19...
One solution is add two extra columns:

          Tag               start_date   end_date
     amenity=bank             19...
One solution is add two extra columns:

          Tag               start_date   end_date
     amenity=bank             19...
One solution is add two extra columns:

          Tag               start_date   end_date
     amenity=bank             19...
One solution is add two extra columns:

          Tag               start_date   end_date
     amenity=bank             19...
One solution is add two extra columns:

          Tag               start_date   end_date
     amenity=bank             19...
We may also need to date
changes in positions (nodes)
We may also need to date
   changes in positions (nodes)

• Boundary changes
We may also need to date
   changes in positions (nodes)

• Boundary changes
• Extensions to buildings
We may also need to date
   changes in positions (nodes)

• Boundary changes
• Extensions to buildings
• Road straightening
We may also need to date
   changes in positions (nodes)

• Boundary changes
• Extensions to buildings
• Road straightenin...
The solution is probably to use
        Relations (??)
Dating things poses some
  Philosophical Issues
How long does a feature remain the same feature?

  (Is a building with a preserved facade the
         same building, or ...
Final thought....
Final thought....



Can we predict the future?
Final thought....



Can we predict the future?

    (Should we tag planned new
   buildings, roads and features?)
Thanks
(get mapping history!)
   Frankie Roberto
   frankie@frankieroberto.com
  Twitter: frankieroberto
Mapping History on Open Street Map
Mapping History on Open Street Map
Mapping History on Open Street Map
Upcoming SlideShare
Loading in...5
×

Mapping History on Open Street Map

17,020

Published on

Published in: Technology, Business
3 Comments
17 Likes
Statistics
Notes
  • Great work. I came here investigating a way for my high school students in B.C., Canada to create a map of our area with layers of historic information detailing changes to economic activity and such.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Excellent summary and example images, thanks!
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • I want to do the same thing exactly!!
    In openstreetmap, you can draw line features like roads... do you know of anywhere you can draw polygons?
    Check out the work I did animating North American history and the expansion of my town in the 20th century:
    Scroll down to 'Geographic Information Systems (GIS)':
    http://www.thenittygritty.org/intheworks.html
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total Views
17,020
On Slideshare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
62
Comments
3
Likes
17
Embeds 0
No embeds

No notes for slide

Mapping History on Open Street Map

  1. 1. Mapping History (starting with Manchester) Frankie Roberto frankie@frankieroberto.com Twitter: frankieroberto
  2. 2. Currently, OpenStreetMap maps change over time, as people edit them.
  3. 3. ...in a way that printed maps don’t. N.B. This map, in Sheffield, has been like this for months.
  4. 4. But these changes represent the speed at which editors update and improve the maps, not the speed of changes on the ground.
  5. 5. I’d like to be able to add a time-slider to maps, so that you can see how the places themselves have changed over time.
  6. 6. Comparing old maps with new maps is fun...
  7. 7. Before...
  8. 8. After...
  9. 9. But these comparisons are made harder by the big changes in cartography.
  10. 10. I’ve mapped some of the buildings in Manchester...
  11. 11. ...where there are lots of pretty old buildings...
  12. 12. ...and some ugly newer ones...
  13. 13. ...as well as a few under construction.
  14. 14. (I’ve shared all the photos on Flickr)
  15. 15. ...where they are even machine tagged with the appropriate way.
  16. 16. The years in which the buildings were constructed have been added to OpenStreetMap using...
  17. 17. start_date=
  18. 18. This information can sometimes be found inscribed on the buildings, but for the most part I used the local library...
  19. 19. Isn’t it pretty?
  20. 20. Books like this were a great help.
  21. 21. ...it even has a gazeteer, listing the buildings by street.
  22. 22. So, given this data, how do you filter out new buildings from old maps?
  23. 23. You could add extra rules to Mapnik or Osmarender. ...but it’s probably easiest to pre-process.
  24. 24. <?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="@*|node()"> <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy> </xsl:template> <xsl:template match="way"> <xsl:choose> <xsl:when test="tag/@k = 'start_date'"> <xsl:choose> <xsl:when test="tag[@k = 'start_date']/@v &gt; $year"> </xsl:when> <xsl:otherwise> <way><xsl:apply-templates select="@*|node()"/></way> </xsl:otherwise> </xsl:choose> </xsl:when> <xsl:otherwise> <way><xsl:apply-templates select="@*|node()"/></way> </xsl:otherwise> </xsl:choose> </xsl:template> ...using a little bit of XSLT. </xsl:stylesheet>
  25. 25. #!/bin/bash for (( i = 1900; i < 2011; i = i + 10)) do xsltproc --stringparam "year" "$i" start_date_filter.xsl data.svg > data/$i.osm done A quick bash script produces one filtered data file per decade: 1800.osm 1910.osm 1810.osm 1920.osm 1820.osm 1930.osm 1830.osm 1940.osm 1840.osm 1950.osm 1850.osm 1960.osm 1860.osm 1970.osm 1870.osm 1980.osm 1880.osm 1990.osm 1890.osm 2000.osm 1900.osm 2010.osm
  26. 26. #!/bin/bash for (( i = 1900; i < 2011; i = i + 10)) do ln -s ../files/$i.osm data.osm xsltproc osmarender.xsl osm-map-features-z17.xml > svg/$i.svg done ...and then another bash script renders each file using Osmarender: 1800.svg 1910.svg 1810.svg 1920.svg 1820.svg 1930.svg 1830.svg 1940.svg 1840.svg 1950.svg 1850.svg 1960.svg 1860.svg 1970.svg 1870.svg 1980.svg 1880.svg 1990.svg 1890.svg 2000.svg 1900.svg 2010.svg
  27. 27. A quick caveat...
  28. 28. A quick caveat... start_date_filter.xsl expects start_date=YYYY
  29. 29. A quick caveat... start_date_filter.xsl expects start_date=YYYY but the actual date might be:
  30. 30. A quick caveat... start_date_filter.xsl expects start_date=YYYY but the actual date might be: 1934-10
  31. 31. A quick caveat... start_date_filter.xsl expects start_date=YYYY but the actual date might be: 1934-10 1934-10-23
  32. 32. A quick caveat... start_date_filter.xsl expects start_date=YYYY but the actual date might be: 1934-10 c1830 1934-10-23
  33. 33. A quick caveat... start_date_filter.xsl expects start_date=YYYY but the actual date might be: 1934-10 c1830 1934-10-23 1900s
  34. 34. A quick caveat... start_date_filter.xsl expects start_date=YYYY but the actual date might be: 1934-10 c1830 1832-1847 1934-10-23 1900s
  35. 35. A quick caveat... start_date_filter.xsl expects start_date=YYYY but the actual date might be: 1934-10 c1830 1832-1847 1934-10-23 1900s “before 1832”
  36. 36. A quick caveat... start_date_filter.xsl expects start_date=YYYY but the actual date might be: 1934-10 c1830 1832-1847 1934-10-23 1900s “before 1832” Figuring this out is a TODO...
  37. 37. Here’s how the rendered files look: 1 80 0
  38. 38. 18 1 0
  39. 39. 1820
  40. 40. 1830
  41. 41. 1840
  42. 42. Theatre Royale 1850
  43. 43. Free Trade Hall 1860
  44. 44. Lloyd’s House 1870
  45. 45. Town Hall Train station 1 880
  46. 46. Elliot House 1 89 0
  47. 47. Train station goods warehouse 1900
  48. 48. Midland Hotel 19 1 0
  49. 49. St George’s House 1920
  50. 50. 1930
  51. 51. Town Hall Extension Central Library 1940
  52. 52. 1950
  53. 53. Peter House 1960
  54. 54. Lincoln Square 1970
  55. 55. 1 980
  56. 56. Heron House 1990
  57. 57. 20 0 0
  58. 58. Great Northern Tower 20 1 0 (?)
  59. 59. But there’s a problem with this map! There are buildings I don’t have dates for yet But more importantly, there are old buildings, long demolished which should be shown. 1 80 0
  60. 60. Take a look at this old map of the area for example... We could trace all these old buildings, and tag them with...
  61. 61. end_date=
  62. 62. But there’s a problem:
  63. 63. But there’s a problem: We don’t want long-demolished buildings appearing on the maps!
  64. 64. But there’s a problem: We don’t want long-demolished buildings appearing on the maps! Renderers could filter out features with end_date < Date.now...
  65. 65. But it’d probably be best to move the filtering to the API:
  66. 66. But it’d probably be best to move the filtering to the API: GET http://www.openstreetmap.org/api/0.7/[...]?date=1932
  67. 67. But it’d probably be best to move the filtering to the API: GET http://www.openstreetmap.org/api/0.7/[...]?date=1932 Default = [today]
  68. 68. We also need to date attributes:
  69. 69. We also need to date attributes: • Name changes (old_name=)
  70. 70. We also need to date attributes: • Name changes (old_name=) • Change in use (amenity=cinema becomes sport=bingo)
  71. 71. We also need to date attributes: • Name changes (old_name=) • Change in use (amenity=cinema becomes sport=bingo) • Change in scale (highway=unclassified to highway=primary)
  72. 72. We also need to date attributes: • Name changes (old_name=) • Change in use (amenity=cinema becomes sport=bingo) • Change in scale (highway=unclassified to highway=primary) • Accessibility modifications (bicycle=yes)
  73. 73. One solution is add two extra columns:
  74. 74. One solution is add two extra columns: Tag start_date end_date amenity=bank 1934 2001 name=Lloyd’s Bank 1934 2001 landuse=construction_site 2001 2002 amenity=pub 2002 name=Wetherspoons 2002 wheelchair=yes 2005
  75. 75. One solution is add two extra columns: Tag start_date end_date amenity=bank 1934 2001 name=Lloyd’s Bank 1934 2001 landuse=construction_site 2001 2002 amenity=pub 2002 name=Wetherspoons 2002 wheelchair=yes 2005
  76. 76. One solution is add two extra columns: Tag start_date end_date amenity=bank 1934 2001 name=Lloyd’s Bank 1934 2001 landuse=construction_site 2001 2002 amenity=pub 2002 name=Wetherspoons 2002 wheelchair=yes 2005
  77. 77. One solution is add two extra columns: Tag start_date end_date amenity=bank 1934 2001 name=Lloyd’s Bank 1934 2001 landuse=construction_site 2001 2002 amenity=pub 2002 name=Wetherspoons 2002 wheelchair=yes 2005
  78. 78. One solution is add two extra columns: Tag start_date end_date amenity=bank 1934 2001 name=Lloyd’s Bank 1934 2001 landuse=construction_site 2001 2002 amenity=pub 2002 name=Wetherspoons 2002 wheelchair=yes 2005
  79. 79. One solution is add two extra columns: Tag start_date end_date amenity=bank 1934 2001 name=Lloyd’s Bank 1934 2001 landuse=construction_site 2001 2002 amenity=pub 2002 name=Wetherspoons 2002 wheelchair=yes 2005
  80. 80. One solution is add two extra columns: Tag start_date end_date amenity=bank 1934 2001 name=Lloyd’s Bank 1934 2001 landuse=construction_site 2001 2002 amenity=pub 2002 name=Wetherspoons 2002 wheelchair=yes 2005
  81. 81. We may also need to date changes in positions (nodes)
  82. 82. We may also need to date changes in positions (nodes) • Boundary changes
  83. 83. We may also need to date changes in positions (nodes) • Boundary changes • Extensions to buildings
  84. 84. We may also need to date changes in positions (nodes) • Boundary changes • Extensions to buildings • Road straightening
  85. 85. We may also need to date changes in positions (nodes) • Boundary changes • Extensions to buildings • Road straightening • Flooding?
  86. 86. The solution is probably to use Relations (??)
  87. 87. Dating things poses some Philosophical Issues
  88. 88. How long does a feature remain the same feature? (Is a building with a preserved facade the same building, or a new one?)
  89. 89. Final thought....
  90. 90. Final thought.... Can we predict the future?
  91. 91. Final thought.... Can we predict the future? (Should we tag planned new buildings, roads and features?)
  92. 92. Thanks (get mapping history!) Frankie Roberto frankie@frankieroberto.com Twitter: frankieroberto
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×