24

Objective

Given a list of coordinates in longitude/latitude, stored as a .csv file, I want to create a buffer with distance of x km around those coordinates. (In case this is relevant, these coordinates are locations of the societies in the SCCS dataset. These societies scatter all around the world.)

Problem

I'm only able to create buffers with distance in radial degrees, but I want to do them in (kilo)meters. I'm aware of the following Q&A's, but following what's suggested therein doesn't seem to solve my problem:

What I have tried...

  1. I start QGIS 2.4, and Add delimited text layer
  2. choose my .csv file and the x/y fields, click OK
  3. select WGS 84 as my CRS (also tried NAD83 but didn't make a difference), click OK
  4. right-click on layer and select Save As..., in the dialog box, choose the following and click OK: enter image description here
  5. add sccs_meter.shp as layer to the current project
  6. Select Vector > Geoprocessing Tools > Buffers > set buffer distance as 10

The result is a buffer with radius of approximately 1068km, which suggests that buffer distance is 10 degrees rather than 10 meters.

What did I do wrong here?

3
  • 2
    "What's the Workflow for buffering in meters/km using WGS84 layers?" does solve your problem, please read the comments. When you use the buffer tool it uses the layer CRS units, choosing wgs84 it will use degrees. You can your file _meters, but you haven't realy changed the coordinate system. Commented Jul 11, 2014 at 22:28
  • @AlexandreNeto: I read the answer by Jake in that question. Did you mean the part about creating the Azimuthal Equidistant projection, or the part about saving the current layer using a different CRS? I did save mine using NAD83 (as shown in the picture), which is supposed to be in meters, but it still creates buffers in degrees.
    – Herr K.
    Commented Jul 11, 2014 at 22:49
  • 3
    NAD83 also uses degrees for units. There are many projections that use the NAD83 datum which do use meters, perhaps you meant to choose one of them instead. Commented Jul 12, 2014 at 2:53

4 Answers 4

21

In step 4, you have to change the CRS from NAD83 to another projection that uses metres as units.

It depends on the extent of your data which one is best. Unfortunately, your data is located all over the world, so you could:

  1. Create a custom CRS using aeqd (or tmerc) for each one, and draw just that one buffer with it. Practically, you only have to create the buffer once, and exchange the CRS information in the .prj and .qpj file. The coordinates of the buffer with respect to its center will always be the same.
  2. Group the data according to the UTM zones, and use the UTM CRS of that zone for those points.
  3. Similar to UTM, group your points into zones of latitude (e.g. every 10 degrees), and create custom Lambert conformal conical 2SP CRS for each group. This will be significantly faster than using all northern and southern UTM zones of the world.
  4. Use pseudo mercator EPSG:3857 for all. The buffers will look like nice circles, but the real size will get smaller and distorted the more to the poles you come.
2
  • Hi there, I have a similar situation (but with polylines located all over the wold and needing a 50km buffer either side) and I am a little confused as to why you would use one of the top options if you can use the fourth one (which seems the easiest). Is it just because it will not clearly show the distortion which you may like to see, despite giving the accurate result? Thanks! :)
    – Amroco
    Commented Jun 5, 2017 at 18:09
  • @Amroco EPSG:3857 should be avoided if it should be a exactly a certain distance, and you are far away from the equator.
    – AndreJ
    Commented Jun 6, 2017 at 5:36
3

Fast and dirty way: use a buffer distance of 0.01° per km. That is the mean degrees per km at 37° lat. and distorts N-S and E-W buffer extent. But it may be accurate enough for your purpose.

2
  • hi, do you know how great the distortion is at the equ. and the poles?
    – Amroco
    Commented Jun 5, 2017 at 17:56
  • Assuming a perfect sphere (not geoid): Equator: 1°lat = ~ 111111 m, 1°long = ~ 111133 m, avg. = 111122 m Poles: 1°lat = ~ 111111 m, 1°long = 0 m, avg. = 55556 m
    – Flo
    Commented Jun 19, 2017 at 6:34
2

Best (and only) method I've found for point buffers is plugin called Shape tools. It has "Ellipse" function where you can set both radiuses same and have circular buffer, and you can use proper geodesic (metric) unit.

All these "change CRS to some random one" and "use degrees" work only in small maps scale (which should anyway not be in WGS84) end up with essentially no-circular buffers.

It is weird that QGIS still does not have proper geodesic buffers built in and allows 'map units' only. I recall e.g. MapInfo Pro had that feature already in early versions, back in mid-90ies or so.

1

I know your question is regarding QGIS, but there is a solution in R using terra::distance function which by default outputs buffered distances in meters for longitude and latitude data. (https://rdrr.io/cran/terra/man/distance.html)

It is relatively fast for point vectors, but is quite slow for buffering polygon vectors. Buffering in QGIS is much faster, but as mentioned already you would need to convert your data to UTM then back to geographic coordinates if you want to retain the distance in meters.

Your Answer

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

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