Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Voor het genereren van grids maakt D-HyDAMO gebruik van de MeshKernel bibliotheek. Via meshkernel kunnen zowel driehoekige als rechthoekige grids gegenereerd en bewerkt worden. Een voordeel ten opzichte van de methode die werd gebruikt in delft3dfmpy (gridgeom), is dat MeshKernel in Linux werkt en dezelfde resultaten geeft als in Windows. Daarnaast wordt meshkernel ook gebruikt voor het genereren en bewerken van grids in de GUI van D-HYDRO.

Gridgeneratie en bewerkingen gaan via het aanroepen van functies in de workflow / het notebook. Hieronder geven we steeds de mogelijkheden van de functie (de zogenaamde docstring) en een fictief voorbeeld. Voor realistische toepassingen verwijzen we naar het notebook.

Genereren van een vierkant grid binnen een polygoon

Het genereren van een 2D grid is voorlopig alleen mogelijk via een rechthoekig grid. Hiervoor is het het eenvoudigst om de functie generate_within_polygon te gebruiken. Met deze functie kan een grid met gekozen afmetingen en rotatie binnen een opgegeven polygoon (of meerdere polygonen) worden gegenereerd. Zie de docstring van de functie voor meer informatie. De optie van het toevoegen van een rotatie gaat niet samen met het verfijnen van een grid.

Code Block
def generate_within_polygon(self, polygon, cellsize, rotation=0):
	"""
	Function to generate a grid within a polygon. It uses the function
	'generate_grid' but automatically detects the extent.

	Parameters
	----------
	polygon : (list of) shapely.geometry.Polygon or a shapely.geometry.MultiPolygon
		Polygon or Polygons within which the grid is generated
	cellsize : int, float
		Cell size of the rectangular grid to be generated
	rotation : int, float
		Rotation of the grid in degrees carthesian, default 0. Does not work
		together with grid refinement.	
	"""

...

rechthoekig grid gaat via de functie “Mesh2d_add_rectilinear”.

Code Block
def mesh2d_add_rectilinear(
    network: Network,
    polygon: Union[Polygon, MultiPolygon],
    dx: float,
    dy: float,
    deletemeshoption: int = 1,
) -> None:
    """Add 2d rectilinear mesh to network. A new network is created, clipped, and merged
    with the existing network.

    Args:
        network (Network): Network object to which the mesh is added
        polygon (Union[Polygon, MultiPolygon]): Geometry within which the mesh is generated
        dx (float): Horizontal mesh spacing
        dy (float): Vertical mesh spacing
        deletemeshoption (int, optional): Option for clipping mesh. Defaults to 1.

    Returns:
        None.
    """

Als voorbeeld genereren we binnen een cirkel (straal van 10 m) een rechthoekig grid. De aanroep is als volgt:

Code Block
mesh.mesh2d_add_rectilinear(network, circle, dx=2,  dy=2)

...

Genereren van een driehoekig grid binnen een polygoon

Het is ook mogelijk een driehoekig grid te genereren:

Code Block
def mesh2d_add_triangular(
    network: Network, polygon: Union[Polygon, MultiPolygon], edge_length: float = None
) -> None:
    """Add triangular mesh to existing network. An orthogonal mesh is generated by the
    meshkernel, which likely means that the given geometry is not completely filled. The
    triangle discretization is determined based on the coordinates on the boundary of the
    provided geometry. Giving an edge_length will discretize the polygon for you, but
    you can also do this yourself.

    Args:
        network (Network): Network object to which the mesh is added
        polygon (Union[Polygon, MultiPolygon]): Geometry within which the mesh is generated
        edge_length (float, optional): Distance for which the polygon boundary is discretized (by approximation). Defaults to None.
    """

Hetzelfde voorbeeld als hierboven, maar nu voor een driehoekig grid:

Code Block
mesh.mesh2d_add_triangular(network, circle, edge_length=2)

...

Verfijnen een grid binnen een polygon

Het is mogelijk het grid lokaal binnen een gegeven polygoon een aantal stappen te verfijnen. Zo kan een 40x40 grid lokaal verfijnd worden naar een 20x20 grid, 10x10 grid, etc.

Merk op dat de gridverfijning alleen kan worden toegepast bij een vierkant of rechthoekig grid zonder rotatie.

De werkwijze is momenteel dat het grid eerst geclipt wordt, bij het genereren - en vervolgens pas verfijnd wordt. Met de aanwezige routines is het mogelijk dit andersom te doen, maar dit is momenteel niet geïmplementeerd.

De code-documentatie van de functie refine in de class Rectangular biedt meer informatie over de wijze waarop het grid kan worden verfijnd.

...

Code Block
def mesh2d_refine(
    network: Network, polygon: Union[Polygon, MultiPolygon], steps: int
) -> None:
    """Refine mesh 2d within (list of) polygon or multipolygon, with a certain
    number of refinement steps.

    Args:
        network (Network): Network for which the mesh is clipped
        polygon (Union[GeometryList, Union[Polygon, MultiPolygon]]): Polygon within which the mesh is clipped
        steps (int): Number of steps in the refinement
    """

In onderstaand voorbeeld wordt een driehoekig grid gegenereerd binnen een MultiPolygon dat bestaat uit twee cirkels, waarna binnen een rechtoekig polygoon wordt verfijnd met één stap:

Code Block
mesh.mesh2d_add_triangular(network, multipolygon, edge_length=2)
mesh.mesh2d_refine(network, refinement_box, steps=1)

...

Grid uitknippen binnen een polygoon

Ook kan een polygoon worden opgegeven waarbinnen (of waarbuiten) een grid wordt uitgeknipt.

Code Block
def mesh2d_clip(
    network: Network,
    polygon: Union[GeometryList, Union[Polygon, MultiPolygon]],
    deletemeshoption: int = 1,
    inside=True,
) -> None:
    """Clip the mesh (currently implemented for 2d) and clean remaining hanging edges.

    Args:
        network (Network): Network for which the mesh is clipped
        polygon (Union[GeometryList, Union[Polygon, MultiPolygon]]): Polygon within which the mesh is clipped
        deletemeshoption (int, optional): Options for deleting nodes inside/outside polygon. Defaults to 1.
        inside (bool, optional): Whether to clip inside or outside the polygon. Defaults to True.
    """

In de volgende figuren wordt links een Multipolygon bestaande uit twee rechthoeken uit het rechthoekige raster geknipt.

Rechts wordt een realistischer voorbeeld getoond: een raster wordt gegeneerd in een multipolygon, waarna een sinusvormige river wordt gemaakt. Om de rivier heen wordt verfijnd (groene gebied), de river zelf wordt uitgeknipt (rode gebied).

Code Block
mesh.mesh2d_add_rectilinear(network, rectangle, dx=1, dy=1)
clipgeo = MultiPolygon([box(-6, -1, -4, 2), box(4, 5, 7.2, 7.2)])
mesh.mesh2d_clip(network, clipgeo, deletemeshoption=1, inside=True)

Code Block
multipolygon = MultiPolygon([box(0, 0, 10, 10), box(12, 2, 19, 9)])
mesh.mesh2d_add_rectilinear(network, multipolygon, dx=1, dy=1)
river = LineString(np.c_[x, np.sin(x / 3) + 5]).buffer(0.5)
refinement = river.buffer(1)
mesh.mesh2d_refine(network, refinement, steps=1)
mesh.mesh2d_clip(network=network, polygon=GeometryList.from_geometry(river))
Image Added

Image Added