Take the 2-minute tour ×
Geographic Information Systems Stack Exchange is a question and answer site for cartographers, geographers and GIS professionals. It's 100% free, no registration required.

Using SRTM altitude information and OpenStreetmap roads, I want to calculate altitude differences (sum of meters uphill and downhill separated = two values) per road element.

What would be the fastest way to achieve this?

share|improve this question
add comment

1 Answer

up vote 6 down vote accepted

Dylan Beaudette has an article on calculating raster profiles along a line segment that may prove helpful. The basic approach is to convert the lines information into regularly spaced points with v.to.points (docs), and then extract the raster values at those locations using v.drape (docs). This will get you the first step of the elevations along road segments, next you'd want to categorize the elevation pairs along a particular road. For example, given a raster srtm_dem and a road layer osm_road the analysis might look like this:

# convert line to points; dmax = distance between points
v.to.points -i -v -t in=osm_road out=osm_road_pts type=line dmax=90

# match resolution and extents of the DEM
g.region rast=srtm_dem

# extract raster values at our points
# use cubic convolution for interpolation between DEM locations
v.drape in=osm_road_pts out=osm_pts_srtm_elevs type=point \
  rast=srtm_dem method=cubic

v.out.ascii osm_pts_srtm_elevs > osm_pts_srtm_elevs.txt

From there, you could use a shell script, R, or Python to calculate the distance differences. In Python, that might look something like:

last = None
increase = 0
decrease = 0
with open('osm_pts_srtm_elevs.txt') as f:
    for line in f:
        elev = float(line)
        if last:
            change = elev - last 
            if change > 0:
                increase += change
            else:
                decrease += change
        last = elev    

print "total increase: %.2f" % increase       
print "total decrease: %.2f" % decrease

This is just an example for a single road, but could be scripted to run repeatedly across many roads.

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.