Miss_Orchid
Miss_Orchid

Reputation: 374

'Lining up' large lat/lon grid with smaller lat/lon grid

Let's say I have a large array of values that represent terrain latitude locations that is shape x. I also have another array of values that represent terrain longitude values that is shape y. All of the values in x as well as y are equally spaced at 0.005-degrees. In other words:

lons[0:10] = [-130.0, -129.995, -129.99, -129.985, -129.98, -129.975, -129.97, -129.965, -129.96, -129.955]
lats[0:10] = [55.0, 54.995, 54.99, 54.985, 54.98, 54.975, 54.97, 54.965, 54.96, 54.955]

I have a second dataset that is projected in an irregularly-spaced lat/lon grid (but equally spaced ~ 25 meters apart) that is [m,n] dimensions big, and falls within the domain of x and y. Furthermore, we also have all of the lat/lon points within this second dataset. I would like to 'lineup' the grids such that every value of [m,n] matches the nearest neighbor terrain value within the larger grid. I am able to do this with the following code where I basically loop through every lat/lon value in dataset two, and try to find the argmin of a the calculated lat/lon values from dataset1:

for a in range(0,lats.shape[0]):
    # Loop through the ranges
    for r in range(0,lons.shape[0]):

        # Access the elements
        tmp_lon = lons[r]
        tmp_lat = lats[a]

        # Now we need to find where the tmp_lon and tmp_lat match best with the index from new_lats and new_lons
        idx = (np.abs(new_lats - tmp_lat)).argmin()
        idy = (np.abs(new_lons - tmp_lon)).argmin()

        # Make our final array!
        second_dataset_trn[a,r] = first_dataset_trn[idy,idx]

Except it is exceptionally slow. Is there another method, either through a package, library, etc. that can speed this up?

Upvotes: 0

Views: 51

Answers (1)

ChrisSc
ChrisSc

Reputation: 306

Please take a look at the following previous question for iterating over two lists, which may improve the speed: Is there a better way to iterate over two lists, getting one element from each list for each iteration?

A possible correction to the sample code: assuming that the arrays are organized in the standard GIS fashion of Latitude, Longitude, I believe there is an error in the idx and idy variable assignments - the variables receiving the assignments should be swapped (idx should be idy, and the other way around). For example:

        # Now we need to find where the tmp_lon and tmp_lat match best with the index from new_lats and new_lons
        idy = (np.abs(new_lats - tmp_lat)).argmin()
        idx = (np.abs(new_lons - tmp_lon)).argmin()

Upvotes: 0

Related Questions