Commit d6dee84b authored by Larkin Heintzman's avatar Larkin Heintzman

changed terrain interpolation method to avoid edge artifacts (hopefully)

parent 54b7dd2e
...@@ -10,6 +10,7 @@ import math ...@@ -10,6 +10,7 @@ import math
from pyproj import Transformer, Proj, transform from pyproj import Transformer, Proj, transform
from scipy.interpolate import griddata from scipy.interpolate import griddata
from scipy import interpolate from scipy import interpolate
from scipy import ndimage
import time import time
# This function computes the factor of the argument passed # This function computes the factor of the argument passed
...@@ -208,6 +209,16 @@ def get_terrain_map(lat_lon = [0,0], sample_dist = 10, extent = 100, heading = 0 ...@@ -208,6 +209,16 @@ def get_terrain_map(lat_lon = [0,0], sample_dist = 10, extent = 100, heading = 0
y = np.append(y, y_row, axis=0) y = np.append(y, y_row, axis=0)
e = np.append(e, e_row, axis=0) e = np.append(e, e_row, axis=0)
# flip elevation data up to down to match other layers
e = np.flipud(e)
# interpolate terrain to match size/resolution of other layers
c = np.int(extent/sample_dist)
scale_factor = 3/20 # factor to get 6.66667m mapping from 1m mapping (1/6.6667)
scaled_extent = np.ceil(scale_factor*extent).astype(np.int)
factor = scaled_extent/e.shape[0]
e_interp = ndimage.zoom(e, factor, order = 3)
if show_plot: if show_plot:
# Attaching 3D axis to the figure # Attaching 3D axis to the figure
grid_x, grid_y = np.mgrid[min(x):max(x):100j, min(y):max(y):100j] grid_x, grid_y = np.mgrid[min(x):max(x):100j, min(y):max(y):100j]
...@@ -228,7 +239,7 @@ def get_terrain_map(lat_lon = [0,0], sample_dist = 10, extent = 100, heading = 0 ...@@ -228,7 +239,7 @@ def get_terrain_map(lat_lon = [0,0], sample_dist = 10, extent = 100, heading = 0
print("y max: {}".format(np.max(y))) print("y max: {}".format(np.max(y)))
print("y max - min: {}".format(np.max(y)-np.min(y))) print("y max - min: {}".format(np.max(y)-np.min(y)))
return [e,x,y,data,lat_lon] return [e,e_interp,x,y,data,lat_lon]
# savedimg = elv_layer.export_image(bbox=elv_layer.extent, size=[3840,2160], f='image', save_folder='.', save_file='testerino.jpg') # savedimg = elv_layer.export_image(bbox=elv_layer.extent, size=[3840,2160], f='image', save_folder='.', save_file='testerino.jpg')
if __name__ == "__main__": if __name__ == "__main__":
...@@ -237,36 +248,51 @@ if __name__ == "__main__": ...@@ -237,36 +248,51 @@ if __name__ == "__main__":
# anchor_point = [float(ics_pt[0]), float(ics_pt[1])] # anchor_point = [float(ics_pt[0]), float(ics_pt[1])]
anchor_point = [42.17965, -74.21362] anchor_point = [42.17965, -74.21362]
extent = 20e3 extent = 20e3
sample_dist = int(extent/100) sample_dist = int(extent/10)
heading = 0 heading = 0
start_time = time.time() start_time = time.time()
# save terrain as csv file (this method is pretty slow, but can compensate with interp) # save terrain as csv file (this method is pretty slow, but can compensate with interp)
[e,x,y,data,ll_pt] = get_terrain_map(lat_lon=anchor_point, [e,e_interp,x,y,data,ll_pt] = get_terrain_map(lat_lon=anchor_point,
sample_dist = sample_dist, sample_dist = sample_dist,
extent = extent, extent = extent,
heading = -heading) # because flipping heading = -heading) # because flipping
# flip elevation data up to down to match other layers
e = np.flipud(e)
scale_factor = 3/20 # factor to get 6.66667m mapping from 1m mapping (1/6.6667) plt.imshow(e_interp)
scaled_extent = np.ceil(scale_factor*extent).astype(np.int) plt.title('e interp')
plt.show()
# interpolate terrain to match size/resolution of other layers gdt = np.gradient(e_interp)
c = np.int(extent/sample_dist) plt.imshow(np.sqrt(gdt[0]**2 + gdt[1]**2))
f = interpolate.interp2d(np.linspace(0, extent, c), np.linspace(0, extent, c), e, kind='cubic') plt.title('e interp grad')
plt.show()
c = np.int(extent / sample_dist)
scale_factor = 3 / 20 # factor to get 6.66667m mapping from 1m mapping (1/6.6667)
scaled_extent = np.ceil(scale_factor * extent).astype(np.int)
x_start = np.linspace(0, extent, c)
y_start = np.linspace(0, extent, c)
X_start, Y_start = np.meshgrid(x_start, y_start)
Z_start = np.zeros_like(X_start)
f = interpolate.Rbf(X_start, Y_start, Z_start, e, function='multiquadric')
x_temp = np.linspace(0,extent,scaled_extent) # get correct size of terrain map x_temp = np.linspace(0,extent,scaled_extent) # get correct size of terrain map
y_temp = np.linspace(0,extent,scaled_extent) y_temp = np.linspace(0,extent,scaled_extent)
e_interp = f(x_temp, y_temp) X_temp, Y_temp = np.meshgrid(x_temp, y_temp)
Z_temp = np.zeros_like(X_temp)
e_interp = f(X_temp, Y_temp, Z_temp)
plt.imshow(e_interp) plt.imshow(e_interp)
plt.title('e interp old')
plt.show() plt.show()
plt.imshow(e)
plt.show() gdt = np.gradient(e_interp)
plt.imshow(x) plt.imshow(np.sqrt(gdt[0]**2 + gdt[1]**2))
plt.show() plt.title('e interp grad old')
plt.imshow(y)
plt.show() plt.show()
print('done')
# elv_filename = "map_layers\\elv_data_"+file_id+".csv" # elv_filename = "map_layers\\elv_data_"+file_id+".csv"
# if save_files: # if save_files:
# np.savetxt(elv_filename,e_interp,delimiter=",", fmt='%f') # np.savetxt(elv_filename,e_interp,delimiter=",", fmt='%f')
......
...@@ -71,8 +71,9 @@ def grab_features(anchor_point, extent, sample_dist = 10, heading = 0, save_file ...@@ -71,8 +71,9 @@ def grab_features(anchor_point, extent, sample_dist = 10, heading = 0, save_file
print("querying {} layer...".format(name_list[i])) print("querying {} layer...".format(name_list[i]))
q = lyr.query(return_count_only=False, return_ids_only=False, return_geometry=True, q = lyr.query(return_count_only=False, return_ids_only=False, return_geometry=True,
out_sr='3857', geometry_filter=geom_filter) out_sr='3857', geometry_filter=geom_filter)
except json.decoder.JSONDecodeError as e: except (json.decoder.JSONDecodeError, TypeError) as e:
query_cnt = query_cnt + 1 if type(e) != TypeError:
query_cnt = query_cnt + 1
print("error on query: {}".format(e)) print("error on query: {}".format(e))
print("{} layer failed on query, trying again ...".format(name_list[i])) print("{} layer failed on query, trying again ...".format(name_list[i]))
gis = GIS(username="larkinheintzman",password="Meepp97#26640") # linked my arcgis pro account gis = GIS(username="larkinheintzman",password="Meepp97#26640") # linked my arcgis pro account
...@@ -218,44 +219,6 @@ def grab_features(anchor_point, extent, sample_dist = 10, heading = 0, save_file ...@@ -218,44 +219,6 @@ def grab_features(anchor_point, extent, sample_dist = 10, heading = 0, save_file
inac_bin_map[pts_inac[:,1], pts_inac[:,0]] = 1 # set indices to 1 inac_bin_map[pts_inac[:,1], pts_inac[:,0]] = 1 # set indices to 1
# print("looped(tm) inac calculation time = {} sec".format(time.time() - s_time)) # print("looped(tm) inac calculation time = {} sec".format(time.time() - s_time))
#-----------------------------
# # print("points not looped")
# # do boundary calculation for binary matrix (slow for large bounaries but whatever)
#
# # test_pts is the rectangular matrix covering ring for boundary calculation
# x_test, y_test = np.meshgrid(np.arange(np.min(x_pts), np.max(x_pts), 1) , np.arange(np.min(y_pts), np.max(y_pts), 1))
# test_pts = np.array([x_test.flatten(), y_test.flatten()]).T
# mask = np.zeros(test_pts.shape[0])
# core_pts = np.stack([x_pts,y_pts]).T
#
# for pt in core_pts:
# test_dists = np.sqrt(np.square(test_pts[:,0] - pt[0]) +
# np.square(test_pts[:,1] - pt[1]))
# mask[test_dists<=1] = 1
#
# # instead of filling gaps, we want to save filled in areas separately
# # so we need to re-create the bin_map here but on inac. points
# x_pts_inac = test_pts[np.where(mask),0].flatten()
# y_pts_inac = test_pts[np.where(mask),1].flatten()
# pts_inac = np.stack([x_pts_inac,y_pts_inac]).T
#
# # remove points being used as linear features
# for pt in core_pts:
# pts_inac = np.delete(pts_inac, np.where(np.equal(pt,pts_inac).all(1)), axis = 0)
#
# # binarization step
# pts_inac = np.round(pts_inac).astype(np.int)
# # flip y axis
# pts_inac[:,1] = inac_bin_map.shape[1] - pts_inac[:,1]
# # remove any points outside limits of binary map (fixes round versus ceil issues)
# rm_mask = np.logical_or(pts_inac[:,0] < 0, pts_inac[:,0] >= inac_bin_map.shape[1])
# rm_mask = np.logical_or(rm_mask, np.logical_or(pts_inac[:,1] < 0, pts_inac[:,1] >= inac_bin_map.shape[0]))
# pts_inac = pts_inac[np.invert(rm_mask),:]
# inac_bin_map[pts_inac[:,1], pts_inac[:,0]] = 1 # set indices to 1
# print("non looped inac calculation time = {} sec".format(time.time() - s_time))
# binarization step # binarization step
x_pts_idx = np.round(x_pts).astype(np.int) x_pts_idx = np.round(x_pts).astype(np.int)
y_pts_idx = np.round(y_pts).astype(np.int) y_pts_idx = np.round(y_pts).astype(np.int)
...@@ -284,19 +247,11 @@ def grab_features(anchor_point, extent, sample_dist = 10, heading = 0, save_file ...@@ -284,19 +247,11 @@ def grab_features(anchor_point, extent, sample_dist = 10, heading = 0, save_file
np.savetxt(fn,bin_map,delimiter=",", fmt='%f') np.savetxt(fn,bin_map,delimiter=",", fmt='%f')
# save terrain as csv file (this method is pretty slow, but can compensate with interp) # save terrain as csv file (this method is pretty slow, but can compensate with interp)
[e,x,y,data,ll_pt] = get_terrain_map(lat_lon=anchor_point, [e,e_interp,x,y,data,ll_pt] = get_terrain_map(lat_lon=anchor_point,
sample_dist = sample_dist, sample_dist = sample_dist,
extent = extent, extent = extent,
heading = -heading) # because flipping heading = -heading) # because flipping
# flip elevation data up to down to match other layers
e = np.flipud(e)
# interpolate terrain to match size/resolution of other layers
c = np.int(extent/sample_dist)
f = interpolate.interp2d(np.linspace(0, extent, c), np.linspace(0, extent, c), e, kind='cubic')
x_temp = np.linspace(0,extent,scaled_extent) # get correct size of terrain map
y_temp = np.linspace(0,extent,scaled_extent)
e_interp = f(x_temp, y_temp)
elv_filename = "map_layers\\elv_data_"+file_id+".csv" elv_filename = "map_layers\\elv_data_"+file_id+".csv"
if save_files: if save_files:
...@@ -352,7 +307,7 @@ if __name__ == "__main__": ...@@ -352,7 +307,7 @@ if __name__ == "__main__":
anchor_point = [float(ics_pt[0]), float(ics_pt[1])] anchor_point = [float(ics_pt[0]), float(ics_pt[1])]
extent = 20e3 extent = 20e3
save_flag = True save_flag = True
plot_flag = True plot_flag = False
file_extension = 'temp' file_extension = 'temp'
sample_dist = int(extent/100) sample_dist = int(extent/100)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment