oq-engine
oq-engine copied to clipboard
Find a decent WKT representation for NonParametric sources
The South America model fails: https://gitlab.openquake.org/hazard/mosaic/SAM/-/jobs/16426.
The reason is that the engine computes a WKT string for the seismic sources; such string is used in the oq plot sources
command. For nonparametric sources the WKT is obtained from this formula which is ultra-slow:
def wkt(self):
"""
:returns: the geometry as a WKT string
"""
polys = [rup.surface.mesh.get_convex_hull()._polygon2d
for rup, pmf in self.data]
return shapely.geometry.MultiPolygon(polys).wkt
This is a bad idea, we are generating one polygon for each rupture in the source, and then even the realization is ultra-slow. We need a decent formula from @mmpagani . For the moment I am just producing the WKT of the convex hull (see https://github.com/gem/oq-engine/pull/5652).
NB: in the past the SAM model did not fail but only by accident (the .wkt() calls were made in parallel and not sequentially as now). It was still impossible to visualize the sources, so the problem of the wrong formula was still there (BTW, I am responsible for the formula since I had no idea of what to put there).
@mmpagani says that we should use a concave hull. Here are two references: https://gist.github.com/dwyerk/10561690 https://towardsdatascience.com/the-concave-hull-c649795c0f0f
Another alternative would be to use the library alpha_shapes
. The line to change would be https://github.com/gem/oq-engine/blob/engine-3.18/openquake/hazardlib/source/non_parametric.py#L236