I need to digitize soil horizon data from photos to be later used in a 3-dimensional GIS workflow.

For each photo I have DGPS coordinates of the top left and right corner and the depth of the profile. Thus, I can place the photos in three dimensional space. I want to digitize the soil horizons on each of these photos, combine it with horizon-specific data and then be able to extract the data per coordinate and depth.

Is there a FOSS application that can drape images in 3d and be used to digitize information in 3d vector format? I usually use QGIS for digitizing and R for all my data processing, but I am fine with other FOSS solutions on Linux as long as I can get my data into these applications later on.

enter image description here

  • I notice that you have not yet taken this site's 2-minute Tour which gives an overview of the site's protocols and leads into more detailed help. As it stands I think your question is too broad because it is asking more than one question and seems to be seeking a project/workflow review rather than asking a single focussed question. – PolyGeo May 5 '16 at 10:19
  • 1
    Ok, I have changed the question. It is now more specific. – mace May 5 '16 at 17:01

Here's a potential approach: I haven't tried this so your mileage may vary, but it should be quite doable (but it might require rather heavy-duty scripting). I'm starting to think in a similar direction for some projects I'm working on.


  • QGIS
  • PostGIS (likely the best storage medium for relational data but others could potentially be used)
  • Python (or maybe R or SQL)

First, digitize your data in QGIS - mostly as normal, but in pixel (!) space. This is a gentle misuse of GIS that requires you to fib about CRS information, but it's really the best tool for the job.

I'd store the data as Geometry objects in a PostGIS database (keyed to a unique ID per image) but other solutions (shapefiles per-image?) could be used as well. (PostGIS operates exceptionally well with QGIS though...) You can then key your DGPS points to the same image as well, and perhaps have an "image" table that contains the height of your measured section.

From this, you can write a script that puts each geometry through an affine transformation, mapping pixel coordinates to locations in 'real' space on a coordinate grid tied to your DGPS locations and depth. Basically, you map each image corner to a (location, depth) pair and fit your data between them. I won't go into the math here, but my answer here should give the general picture.

I'd do this using a Python script (with the sqlalchemy and geoalchemy2 modules), but it should be possible with a PostGIS SQL script (you'd have to have the image pixel dimensions in your database). You can then write this data to another Geometry column (or shapefile) in the coordinate reference system of your choice. This will leave you with (x,y,z) geometries in a GIS-digestible format.

This is a pretty hands-on method, to be sure, but I think it would leave you with a lot of room to customize, and a pipeline through which you can re-transform your data as you digitize more information.

| improve this answer | |
  • Thank you Daven for this comprehensive work-flow description. Do you have any hint on how to work in pixel space. I couldn't find any description for that. – mace May 13 '16 at 8:46
  • Just open a JPEG in QGIS, and it'll "project" the data as pixels because no georeference is available. So you'll have lon/lat pairs like [340,-45] corresponding to pixel locations. Any shapefile you create will work in this coordinate system as well. – Daven Quinn May 15 '16 at 4:00

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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