Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
A
ags_grabber
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Larkin Heintzman
ags_grabber
Commits
d6dee84b
Commit
d6dee84b
authored
Dec 11, 2020
by
Larkin Heintzman
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
changed terrain interpolation method to avoid edge artifacts (hopefully)
parent
54b7dd2e
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
47 additions
and
66 deletions
+47
-66
arcgis_terrain.py
arcgis_terrain.py
+42
-16
feature_set.py
feature_set.py
+5
-50
No files found.
arcgis_terrain.py
View file @
d6dee84b
...
...
@@ -10,6 +10,7 @@ import math
from
pyproj
import
Transformer
,
Proj
,
transform
from
scipy.interpolate
import
griddata
from
scipy
import
interpolate
from
scipy
import
ndimage
import
time
# 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
y
=
np
.
append
(
y
,
y_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
:
# Attaching 3D axis to the figure
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
print
(
"y max: {}"
.
format
(
np
.
max
(
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')
if
__name__
==
"__main__"
:
...
...
@@ -237,36 +248,51 @@ if __name__ == "__main__":
# anchor_point = [float(ics_pt[0]), float(ics_pt[1])]
anchor_point
=
[
42.17965
,
-
74.21362
]
extent
=
20e3
sample_dist
=
int
(
extent
/
10
0
)
sample_dist
=
int
(
extent
/
10
)
heading
=
0
start_time
=
time
.
time
()
# 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
,
extent
=
extent
,
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)
scaled_extent
=
np
.
ceil
(
scale_factor
*
extent
)
.
astype
(
np
.
int
)
plt
.
imshow
(
e_interp
)
plt
.
title
(
'e interp'
)
plt
.
show
()
# 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'
)
gdt
=
np
.
gradient
(
e_interp
)
plt
.
imshow
(
np
.
sqrt
(
gdt
[
0
]
**
2
+
gdt
[
1
]
**
2
))
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
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
.
title
(
'e interp old'
)
plt
.
show
()
plt
.
imshow
(
e
)
plt
.
show
()
plt
.
imshow
(
x
)
plt
.
show
()
plt
.
imshow
(
y
)
gdt
=
np
.
gradient
(
e_interp
)
plt
.
imshow
(
np
.
sqrt
(
gdt
[
0
]
**
2
+
gdt
[
1
]
**
2
))
plt
.
title
(
'e interp grad old'
)
plt
.
show
()
print
(
'done'
)
# elv_filename = "map_layers\\elv_data_"+file_id+".csv"
# if save_files:
# np.savetxt(elv_filename,e_interp,delimiter=",", fmt='%f')
...
...
feature_set.py
View file @
d6dee84b
...
...
@@ -71,7 +71,8 @@ def grab_features(anchor_point, extent, sample_dist = 10, heading = 0, save_file
print
(
"querying {} layer..."
.
format
(
name_list
[
i
]))
q
=
lyr
.
query
(
return_count_only
=
False
,
return_ids_only
=
False
,
return_geometry
=
True
,
out_sr
=
'3857'
,
geometry_filter
=
geom_filter
)
except
json
.
decoder
.
JSONDecodeError
as
e
:
except
(
json
.
decoder
.
JSONDecodeError
,
TypeError
)
as
e
:
if
type
(
e
)
!=
TypeError
:
query_cnt
=
query_cnt
+
1
print
(
"error on query: {}"
.
format
(
e
))
print
(
"{} layer failed on query, trying again ..."
.
format
(
name_list
[
i
]))
...
...
@@ -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
# 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
x_pts_idx
=
np
.
round
(
x_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
np
.
savetxt
(
fn
,
bin_map
,
delimiter
=
","
,
fmt
=
'
%
f'
)
# 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
,
extent
=
extent
,
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"
if
save_files
:
...
...
@@ -352,7 +307,7 @@ if __name__ == "__main__":
anchor_point
=
[
float
(
ics_pt
[
0
]),
float
(
ics_pt
[
1
])]
extent
=
20e3
save_flag
=
True
plot_flag
=
Tru
e
plot_flag
=
Fals
e
file_extension
=
'temp'
sample_dist
=
int
(
extent
/
100
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment