in libs/apls/apls_utils.py [0:0]
def _get_road_buffer(geoJson, im_vis_file, output_raster,
buffer_meters=2, burnValue=1,
# max_mask_val=1,
buffer_cap_style=6,
useSpacenetLabels=False,
plot_file='', figsize=(11, 3), fontsize=6,
dpi=800, show_plot=False,
valid_road_types=set([]), verbose=False):
'''
Wrapper around create_buffer_geopandas(), with plots
Get buffer around roads defined by geojson and image files
valid_road_types serves as a filter of valid types (no filter if len==0)
https://wiki.openstreetmap.org/wiki/Key:highway
valid_road_types = set(['motorway', 'trunk', 'primary', 'secondary',
'tertiary',
'motorway_link', 'trunk_link', 'primary_link',
'secondary_link', 'tertiary_link',
'unclassified', 'residential', 'service' ])
'''
# get buffer
# filter out roads of the wrong type
try:
inGDF_raw = gpd.read_file(geoJson)
except:
mask_gray = np.zeros(cv2.imread(im_vis_file, 0).shape)
cv2.imwrite(output_raster, mask_gray)
return [], []
if useSpacenetLabels:
inGDF = inGDF_raw
# use try/except to handle empty label files
try:
inGDF['type'] = inGDF['road_type'].values
inGDF['class'] = 'highway'
inGDF['highway'] = 'highway'
except:
pass
else:
# filter out roads of the wrong type
if (len(valid_road_types) > 0) and (len(inGDF_raw) > 0):
if 'highway' in inGDF_raw.columns:
inGDF = inGDF_raw[inGDF_raw['highway'].isin(valid_road_types)]
# set type tag
inGDF['type'] = inGDF['highway'].values
inGDF['class'] = 'highway'
else:
inGDF = inGDF_raw[inGDF_raw['type'].isin(valid_road_types)]
# set highway tag
inGDF['highway'] = inGDF['type'].values
if verbose:
print("gdf.type:", inGDF['type'])
if len(inGDF) != len(inGDF_raw):
print("len(inGDF), len(inGDF_raw)",
len(inGDF), len(inGDF_raw))
print("gdf['type']:", inGDF['type'])
else:
inGDF = inGDF_raw
try:
inGDF['type'] = inGDF['highway'].values
inGDF['class'] = 'highway'
except:
pass
gdf_buffer = create_buffer_geopandas(inGDF,
buffer_distance_meters=buffer_meters,
buffer_cap_style=buffer_cap_style,
dissolve_by='class',
projectToUTM=True)
# make sure gdf is not null
if len(gdf_buffer) == 0:
mask_gray = np.zeros(cv2.imread(im_vis_file, 0).shape)
cv2.imwrite(output_raster, mask_gray)
# create label image
else:
gdf_to_array(gdf_buffer, im_vis_file, output_raster,
burnValue=burnValue)
# load mask
mask_gray = cv2.imread(output_raster, 0)
# mask_gray = np.clip(mask_gray, 0, max_mask_val)
if plot_file:
fig, (ax0, ax1, ax2, ax3) = plt.subplots(1, 4, figsize=figsize)
# road lines
try:
gdfRoadLines = gpd.read_file(geoJson)
gdfRoadLines.plot(ax=ax0, marker='o', color='red')
except:
ax0.imshow(mask_gray)
ax0.axis('off')
ax0.set_aspect('equal')
ax0.set_title('Unfiltered Roads from GeoJson', fontsize=fontsize)
# first show raw image
im_vis = cv2.imread(im_vis_file, 1)
img_mpl = cv2.cvtColor(im_vis, cv2.COLOR_BGR2RGB)
ax1.imshow(img_mpl)
ax1.axis('off')
ax1.set_title('Raw Image', fontsize=fontsize)
# plot mask
ax2.imshow(mask_gray)
ax2.axis('off')
ax2.set_title('Roads Mask (' + str(np.round(buffer_meters))
+ ' meter buffer)', fontsize=fontsize)
# plot combined
ax3.imshow(img_mpl)
# overlay mask
# set zeros to nan
z = mask_gray.astype(float)
z[z == 0] = np.nan
# change palette to orange
palette = plt.cm.gray
palette.set_over('orange', 1.0)
ax3.imshow(z, cmap=palette, alpha=0.4,
norm=matplotlib.colors.Normalize(vmin=0.5, vmax=0.9, clip=False))
ax3.set_title('Raw Image + Buffered Roads', fontsize=fontsize)
ax3.axis('off')
#plt.axes().set_aspect('equal', 'datalim')
# plt.tight_layout()
plt.savefig(plot_file, dpi=dpi)
if not show_plot:
plt.close()
return mask_gray, gdf_buffer