I have a choropleth map of plankton distribution in the ocean that I am digitizing. However, as you can see, there are many features within features creating rings, almost like mountains on a topographic map. I'm using QGIS to digitize this map.

phytoplankton map map legend

At the moment my game plan for digitizing these is to:

  1. Digitize the innermost rings using Freehand editing plugin - "> 500" according to the scale

  2. Digitize everything surrounding those - "250-500" according to the scale

  3. Clip all "> 500" patches out from the "250-500" shapefile

So on and so forth. This does mean I'd have many shapefile layers and much clipping to do, though it seems faster and less error-prone than simply tracing out each feature and contour line by hand.

My question is - before I commit too much time and effort to this clipping technique, does anybody in the community know of a better or faster way of doing this? Or is simply manually tracing each contour line the best way to go?

I'm worried that I may be reinventing the wheel, trying to figure out a problem that may be common knowledge to somebody who has much digitizing experience.

PS - if there is a better term for this map than "psuedo topographical choropleth", and I assume there is, please update my post/let me know! I don't know what this style of map is called.

  • 2
    more than clipping, you should use "union", then you'll have a file with categories which you can choropleth;
    – Elio Diaz
    Sep 21, 2017 at 19:11
  • 2
    instead of manually digitizing you may select pixels by color in the raster calculator. Choropleth term is ok, because you are mapping a numeric variable with different shades of a color scale, which is the same for topo maps, where you map the altitude
    – Elio Diaz
    Sep 21, 2017 at 19:20

2 Answers 2


if the base raster is colored, go for classification techniques.

it will vectorize all the raster for you.

more information can easily be gathered from the web.

  • there are plugins in Qgis to do this. but Esri's do a better job. if you ask my personal opinion, Bentley Descartes is extreme for this job.
    – Ash
    Sep 21, 2017 at 20:16
  • I need to mention Ersi's and Bentley's are proprietary.
    – Ash
    Sep 21, 2017 at 20:17
  • I think this is a good idea; however in my case the image colors were not really well distinguished. I think I would do what you suggested in the future after tweaking the image colors a bit in photoshop.
    – srha
    Sep 26, 2017 at 20:01

In the end I used a mix of my own plan and other people's suggestions. In case anybody in the future comes here with a similar question, I'm posting my workflow below. Always open to better suggestions from the community, however!


  1. I did not know the CRS of the map I was digitizing (see original question for the map & legend), but I knew the map was made in 1971, so I just used the WGS 66 datum/CRS while georeferencing. See an excellent tutorial here for more information on georeferencing. I later transformed it to WGS84 using Polynomial 1 (Thin Plate Spline was not working).
  2. I then manually traced out each choropleth level - see image below. The "<100" one (bottom one) was easy enough ;)
    • In the end, I did not use the freehand plugin as that's just too wobbly to use with just a mouse. I clicked out every little curve!
    • It wasn't actually that bad. Though I had to shake out my wrist and take a break every half hour or so. It took me a few hours (about half a work day).
    • For more complex maps, I imagine it's also possible to just use a generalizer plugin to make bezier curves.

5 digitized maps


  1. I next Unioned my 5 choropleth layers in this order:
    • 100 + 100-150 > [result] + 150-250 > [result] + 250-500 > [result] + 500 > final Unioned result.
    • See screenshot below. enter image description here

Clean + Dissolve

  1. The result needed a lot of cleaning up.

    • I eliminated many hundreds of sliver polygons by selecting features by attribute (i.e. one of the 5 choropleth classes) and using the Merge selected features function in QGIS.
    • I manually edited any totally whack geometries that were too complicated for an algorithm to deal with (such as overlaps combined with intersections) using the "Edit nodes" tool with 10 px snapping options and topological editing enabled.
    • This took about another hour.
    • In retrospect, when making "ringed" choropleths, make sure the innermost rings are fully surrounded by the outer rings, including in "hidden" areas (i.e. land areas in my case) so that your union layer is as neat as possible.
    • See above screenshot for snapping options.
    • I used QGIS's Check validity tool to find errors, which spits out a points file to help you pinpoint the exact location of errors.
    • I used the Topology Checker plugin to find overlaps.
  2. I then used GRASS's v.dissolve function to clean any final breaks in polygons that should be combined.

    • Dissolved by attribute (choropleth class).
    • v.in.ogr snap tolerance set to 0.
    • Note that the polygon needs to be a multipart polygon for this to work - otherwise QGIS will just see that you have many pieces of one attribute and think that all is fine and dandy and not merge any split pieces. Convert Singleparts -> Multipart if needed.
    • See here for a really excellent explanation of the various Dissolve functions and why I chose the GRASS one in particular.

Clipping at international dateline

  1. As you can see from my map, the extents of the paper map do not line up with the standard -180 to 180 extents used in the WGS84 projection. My digitized polygons extend from -210 to 150.
    • I need to clip at -180 so that any pieces to the left of that can be "wrapped" to the right side of the map.
    • I used the approach outlined in numerous QA's on this StachExchange re: crossing the international dateline. Basically, clip the data you have at the longitude that you want your map to be split at. In my case, it is at the international dateline (180). See here or here for tutorials.
    • The WKT file that I used was: Nr;WKT 1;POLYGON((-179.95 100, -180 100, -180 -100, -179.95 -100, -179.95 100))


  1. I then used the ogr2ogr function -wrapdateline to move the cut polygon pieces over to the right edge of the map.
    • In theory, -wrapdateline should have done the clipping for me, but it just wasn't working for me, so I did it manually in step 6.
    • See here for ogr2ogr -wrapdateline tutorial.
  2. I then used the trusty Edit nodes tool to make sure the wrapped pieces at the right end lined up with the main map at the ~150 longitude (Kamchatka to Eastern Australia).
    • See screenshot below for clip & wrap.

Clipped & wrapped

Dissolve (again)

  1. Again, use v.dissolve to merge the split pieces that are around the ~150 longitude.
    • You shouldn't need to touch snapping tolerance this time, as you were using the edit nodes tool with snapping - but it's good to keep at 0 just in case.
    • Again, make sure the polygon is a Multipart polygon.

You're done!

My final digitized map is below.

Final map

Note that throughout this workflow process, I fixed a few minor errors here and there with my polygon, so if you notice any small changes in shapes/colors that would be why.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

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