# Getting latitude and longitude raster from DEM using ArcGIS Desktop?

Could anyone provide with a way to calculate latitude and longitude from DEM, for each raster cell?

In previous posts about this, I have seen that some suggest calculating lat and long in certain sample point locations. This doesn't work for me, as I need complete rasters.

Also, I use ArcGIS 10.2 version so \$\$XMAP, \$\$YMAP does not work for me.

Is there any other way inside ArcGIS to get lat and long?

• marika, you can convert your raster to points and than use the x and y of each point representing each raster cell. Mar 13 '15 at 15:57
• Another option is to export your raster as asc and use the coordinates reference and the pixel size to get all your cells. Mar 13 '15 at 15:58
• The coordinate boundary (ulx/uly/lrx/lry) is a property of any raster. Coordinate location not generally seen as a property of individual cells, per se, since such an extraction would increase the size manifold. What are you going to do with this information, and in what programming language? Mar 13 '15 at 16:01
• I want to use latitude and longitude as explanatory variables in a multiple regression model. I will use R. Mar 13 '15 at 16:16
• read the dem with raster() and use functions coordinates, xFromCol, yFromRow, xyFromCell etc. Mar 13 '15 at 19:50

Per Bill Huber's (whuber) clever workaround:

xmap = (FlowAccumulation(1) + 0.5)*cellsize + xmin

ymap = (FlowAccumulation(64) + 0.5)*cellsize + ymin

Curtis Price has developed a python script to do this:

``````from arcpy.sa import *
from arcpy import env as E
# Calculate \$\$NROWS and \$\$NCOLS from current environment
cellSize = float(E.cellSize)
nrows = int((E.extent.YMax - E.extent.YMin) / float(E.cellSize))
ncols = int((E.extent.XMax - E.extent.XMin)  / float(E.cellSize))
# Bill Huber's method for \$\$XMAP and \$\$YMAP: "1" flows "right", "64" (63+1) flows "up"
tmpg = CreateConstantRaster(1)
xmap = (FlowAccumulation(tmpg) + 0.5) * cellSize + E.extent.XMin
ymap = (FlowAccumulation(tmpg + 63) + 0.5) * cellSize + E.extent.YMin
# applying the same method for \$\$ROWMAP and \$\$COLMAP
colmap = Int(FlowAccumulation(tmpg))
rowmap = Int(FlowAccumulation(tmpg + 3))  # flowdir "4" is "down" (top row is 0)
``````

You can also still use \$\$XMAP/\$\$YMAP in ArcGIS 10+ by using the old arcgisscripting API

``````import arcgisscripting
gp = arcgisscripting.create(9.3) #This works in ArcGIS 10
xmap='path/to/output'
ymap='path/to/output'

#you need to set appropriate extent and cellsize gp environments
result=gp.SingleOutputMapAlgebra('\$\$XMAP', xmap)
result=gp.SingleOutputMapAlgebra('\$\$YMAP', ymap)
``````
• In the first example, what the (1) and (64) stand for? Jun 4 '15 at 16:59
• @NewAtGis They are direction constants/codes. See the help - resources.arcgis.com/en/help/main/10.1/index.html#/… Jun 5 '15 at 3:03
• thanks @Luke. I got the FlowAcc rasters, but I do not know how to put to work that formula in the RasterCalculator. I mean, I have read the arcGIS documentation, and I got the idea of the direction codes. But, once I got the FlowAcc rasters, there is some other step to take before using the formula? Jun 5 '15 at 7:31
• @NewAtGis You don't need to create flow accumulation rasters. Just open the raster calculator, set your environment (extent, snap raster and cell size) appropriately and enter the expression. ie `(FlowAccumulation(1) + 0.5)* cellsize + xmin` substituting cell size and xmin with the actual values. Jun 5 '15 at 9:22
• Thanks @Luke. I have circumvented the problem, as I described here: gis.stackexchange.com/questions/149736/… Jun 5 '15 at 9:31

Another approach with R

``````library(raster)
r <- raster('dem.tif')
lon <- init(r, 'x', filename='lon.tif')
lat <- init(r, 'y', filename='lat.tif')
``````
• Your "another approach with R" was not tested. It doesn't work. See my "Editing Note 2". Mar 18 '15 at 9:35
• That probably means that you are using an old version of R/raster. Mar 19 '15 at 15:59