I am working with data that are unprojected (they are in lat/lon) and for every point I want to create a buffer of 800 meter. How can I construct a buffer of 800m. but give the distance in decimal degrees? I use ArcMap 10.2.
-
Please edit the question to specify the GIS software in use.– VinceJan 27, 2015 at 13:59
-
en.wikipedia.org/wiki/Decimal_degrees about 1 degree is about 111 km at the equator. In other systems only way to get "accurate" 800m is reproject data to system which uses meters– simpleuser001Jan 27, 2015 at 14:06
-
Moving towards to the poles, the lon distance decreases, but the lat distance remains nearly constant. So there is no simple scaling possible. Reprojection is the only way to go.– AndreJJan 27, 2015 at 14:13
-
If I were working in a certain projection, my buffer would that of 800 meters. Now that I am in decimal degrees, how can I calculate to how many decimal degrees this equals?– Maria KarypidouJan 28, 2015 at 12:01
2 Answers
There are multiple ways to accomplish this, but none of the correct methods involve static conversion of degrees and linear units. In the past I've had to define my own equidistant or equal area coordinate system over each feature, but ArcMap offers a much simpler solution: Use Geoprocessing... Buffer, which invokes Buffer (Analysis), and then specify a linear unit:
Which results in properly buffered shapes:
-
1And when you upgrade to 10.3.0, you can explicitly ask for "geodesic"-based buffers.– mkennedyJan 28, 2015 at 17:31
You can't. As commenters note, a degree of longitude is a different distance at different latitudes, while a degree of latitude is pretty much constant.
When you reproject, as recommended, there may be distance distortion. For example, Mercator projections exaggerate distance at higher latitudes. So if you project to meters, you must also understand how the projection distorts distance.
For instance, here's a method in one of my projects that gets the conversion from actual to projected meters for "Popular Spherical Mercator" (ESPG 3857):
public static double GetScaleFromRealMetersToSphericalMercator(Point location)
{
double a = Math.Exp((location.Y * 2.0) / EARTH_RADIUS);
double lat = (Math.Asin((a - 1) / (a + 1)));
return 1.0 / Math.Cos(lat);
}
where EARTH_RADIUS = 6378136.98 which is not absolutely correct but is the value for the spheroid used by the projection.
Such approximations are valid for small distance like your 800 m but less so for large distances.