in analysis/webservice/algorithms_spark/MatchupDoms.py [0:0]
def match_tile_to_point_generator(tile_service, tile_id, m_tree, edge_results, search_domain_bounding_wkt,
search_parameter, radius_tolerance, aeqd_proj):
from nexustiles.model.nexusmodel import NexusPoint
from webservice.algorithms_spark.MatchupDoms import DomsPoint # Must import DomsPoint or Spark complains
# Load tile
try:
the_time = datetime.now()
tile = tile_service.mask_tiles_to_polygon(wkt.loads(search_domain_bounding_wkt),
tile_service.find_tile_by_id(tile_id))[0]
print("%s Time to load tile %s" % (str(datetime.now() - the_time), tile_id))
except IndexError:
# This should only happen if all measurements in a tile become masked after applying the bounding polygon
print('Tile is empty after masking spatially. Skipping this tile.')
return
# Convert valid tile lat,lon tuples to UTM tuples
the_time = datetime.now()
# Get list of indices of valid values
valid_indices = tile.get_indices()
primary_points = np.array(
[aeqd_proj(tile.longitudes[aslice[2]], tile.latitudes[aslice[1]]) for
aslice in valid_indices])
print("%s Time to convert primary points for tile %s" % (str(datetime.now() - the_time), tile_id))
a_time = datetime.now()
p_tree = spatial.cKDTree(primary_points, leafsize=30)
print("%s Time to build primary tree" % (str(datetime.now() - a_time)))
a_time = datetime.now()
matched_indexes = p_tree.query_ball_tree(m_tree, radius_tolerance)
print("%s Time to query primary tree for tile %s" % (str(datetime.now() - a_time), tile_id))
for i, point_matches in enumerate(matched_indexes):
if len(point_matches) > 0:
if tile.is_multi:
data_vals = [tile_data[tuple(valid_indices[i])] for tile_data in tile.data]
else:
data_vals = tile.data[tuple(valid_indices[i])]
p_nexus_point = NexusPoint(
latitude=tile.latitudes[valid_indices[i][1]],
longitude=tile.longitudes[valid_indices[i][2]],
depth=None,
time=tile.times[valid_indices[i][0]],
index=valid_indices[i],
data_vals=data_vals
)
p_doms_point = DomsPoint.from_nexus_point(p_nexus_point, tile=tile)
for m_point_index in point_matches:
m_doms_point = DomsPoint.from_edge_point(edge_results[m_point_index])
yield p_doms_point, m_doms_point