From 176c9b45eb158217b1aeb0657d60ed06739e53e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dav=C3=ADd=20Brakenhoff?= Date: Wed, 10 Jun 2020 17:33:31 +0200 Subject: [PATCH] feat(GridIntersect): #902 (#903) Add gridintersect to flopy utils along with gridintersect tests. Add keepzerolengths option to strtree method Add gridintersection demo notebook Update travis to install shapely New method for parsing shapely intersection results fixes failing test caused by change in behavior in GEOS and shapely clean up and improve code/docstrings Ad triangle grid for vertex grid tests Update notebook with triangle grid Fix conversion of cell2d to list of shapely shapes using ncvert to determine no. of points Add option to perform intersections without building STRtree Add filter to STRtree query results to avoid unnecessary intersection calls closes #902 Fix transform of MultiPolygon coords Add support for transforming MultiPolygon coordinates into real-world coordinates in structured mode. --- autotest/t065_test_gridintersect.py | 233 +- .../flopy3_grid_intersection_demo.ipynb | 830 +++-- flopy/utils/__init__.py | 2 +- flopy/utils/gridintersect.py | 2770 +++++++++-------- 4 files changed, 1978 insertions(+), 1857 deletions(-) diff --git a/autotest/t065_test_gridintersect.py b/autotest/t065_test_gridintersect.py index a8af861e7..7e648a0b7 100644 --- a/autotest/t065_test_gridintersect.py +++ b/autotest/t065_test_gridintersect.py @@ -1,3 +1,5 @@ +import sys +sys.path.insert(1, "..") import flopy.discretization as fgrid import flopy.plot as fplot import matplotlib.pyplot as plt @@ -169,69 +171,69 @@ def test_rect_grid_multipoint_in_multiple_cells(): # %% test point shapely -def test_rect_grid_point_outside_shapely(): +def test_rect_grid_point_outside_shapely(rtree=True): # avoid test fail when shapely not available try: import shapely except: return gr = get_rect_grid() - ix = GridIntersect(gr) + ix = GridIntersect(gr, method='vertex', rtree=rtree) result = ix.intersect_point(Point(25., 25.)) assert len(result) == 0 return result -def test_rect_grid_point_on_outer_boundary_shapely(): +def test_rect_grid_point_on_outer_boundary_shapely(rtree=True): # avoid test fail when shapely not available try: import shapely except: return gr = get_rect_grid() - ix = GridIntersect(gr) + ix = GridIntersect(gr, method='vertex', rtree=rtree) result = ix.intersect_point(Point(20., 10.)) assert len(result) == 1 assert np.all(result.cellids[0] == (0, 1)) return result -def test_rect_grid_point_on_inner_boundary_shapely(): +def test_rect_grid_point_on_inner_boundary_shapely(rtree=True): # avoid test fail when shapely not available try: import shapely except: return gr = get_rect_grid() - ix = GridIntersect(gr) + ix = GridIntersect(gr, method='vertex', rtree=rtree) result = ix.intersect_point(Point(10., 10.)) assert len(result) == 1 assert np.all(result.cellids[0] == (0, 0)) return result -def test_rect_grid_multipoint_in_one_cell_shapely(): +def test_rect_grid_multipoint_in_one_cell_shapely(rtree=True): # avoid test fail when shapely not available try: import shapely except: return gr = get_rect_grid() - ix = GridIntersect(gr) + ix = GridIntersect(gr, method='vertex', rtree=rtree) result = ix.intersect_point(MultiPoint([Point(1., 1.), Point(2., 2.)])) assert len(result) == 1 assert result.cellids[0] == (1, 0) return result -def test_rect_grid_multipoint_in_multiple_cells_shapely(): +def test_rect_grid_multipoint_in_multiple_cells_shapely(rtree=True): # avoid test fail when shapely not available try: import shapely except: return gr = get_rect_grid() - ix = GridIntersect(gr) + ix = GridIntersect(gr, method='vertex', rtree=rtree) result = ix.intersect_point(MultiPoint([Point(1., 1.), Point(12., 12.)])) assert len(result) == 2 assert result.cellids[0] == (0, 1) @@ -239,7 +241,7 @@ def test_rect_grid_multipoint_in_multiple_cells_shapely(): return result -def test_tri_grid_point_outside(): +def test_tri_grid_point_outside(rtree=True): # avoid test fail when shapely not available try: import shapely @@ -248,13 +250,13 @@ def test_tri_grid_point_outside(): gr = get_tri_grid() if gr == -1: return - ix = GridIntersect(gr) + ix = GridIntersect(gr, rtree=rtree) result = ix.intersect_point(Point(25., 25.)) assert len(result) == 0 return result -def test_tri_grid_point_on_outer_boundary(): +def test_tri_grid_point_on_outer_boundary(rtree=True): # avoid test fail when shapely not available try: import shapely @@ -263,14 +265,14 @@ def test_tri_grid_point_on_outer_boundary(): gr = get_tri_grid() if gr == -1: return - ix = GridIntersect(gr) + ix = GridIntersect(gr, rtree=rtree) result = ix.intersect_point(Point(20., 10.)) assert len(result) == 1 assert np.all(result.cellids[0] == 0) return result -def test_tri_grid_point_on_inner_boundary(): +def test_tri_grid_point_on_inner_boundary(rtree=True): # avoid test fail when shapely not available try: import shapely @@ -279,14 +281,14 @@ def test_tri_grid_point_on_inner_boundary(): gr = get_tri_grid() if gr == -1: return - ix = GridIntersect(gr) + ix = GridIntersect(gr, rtree=rtree) result = ix.intersect_point(Point(10., 10.)) assert len(result) == 1 assert np.all(result.cellids[0] == 0) return result -def test_tri_grid_multipoint_in_one_cell(): +def test_tri_grid_multipoint_in_one_cell(rtree=True): # avoid test fail when shapely not available try: import shapely @@ -295,14 +297,14 @@ def test_tri_grid_multipoint_in_one_cell(): gr = get_tri_grid() if gr == -1: return - ix = GridIntersect(gr) + ix = GridIntersect(gr, rtree=rtree) result = ix.intersect_point(MultiPoint([Point(1., 1.), Point(2., 2.)])) assert len(result) == 1 assert result.cellids[0] == 1 return result -def test_tri_grid_multipoint_in_multiple_cells(): +def test_tri_grid_multipoint_in_multiple_cells(rtree=True): # avoid test fail when shapely not available try: import shapely @@ -311,7 +313,7 @@ def test_tri_grid_multipoint_in_multiple_cells(): gr = get_tri_grid() if gr == -1: return - ix = GridIntersect(gr) + ix = GridIntersect(gr, rtree=rtree) result = ix.intersect_point(MultiPoint([Point(1., 1.), Point(12., 12.)])) assert len(result) == 2 assert result.cellids[0] == 0 @@ -436,27 +438,27 @@ def test_rect_grid_linestring_in_and_out_of_cell2(): # %% test linestring shapely -def test_rect_grid_linestring_outside_shapely(): +def test_rect_grid_linestring_outside_shapely(rtree=True): # avoid test fail when shapely not available try: import shapely except: return gr = get_rect_grid() - ix = GridIntersect(gr) + ix = GridIntersect(gr, method='vertex', rtree=rtree) result = ix.intersect_linestring(LineString([(25., 25.), (21., 5.)])) assert len(result) == 0 return result -def test_rect_grid_linestring_in_2cells_shapely(): +def test_rect_grid_linestring_in_2cells_shapely(rtree=True): # avoid test fail when shapely not available try: import shapely except: return gr = get_rect_grid() - ix = GridIntersect(gr) + ix = GridIntersect(gr, method='vertex', rtree=rtree) result = ix.intersect_linestring(LineString([(5., 5.), (15., 5.)])) assert len(result) == 2 assert result.lengths.sum() == 10. @@ -465,14 +467,14 @@ def test_rect_grid_linestring_in_2cells_shapely(): return result -def test_rect_grid_linestring_on_outer_boundary_shapely(): +def test_rect_grid_linestring_on_outer_boundary_shapely(rtree=True): # avoid test fail when shapely not available try: import shapely except: return gr = get_rect_grid() - ix = GridIntersect(gr) + ix = GridIntersect(gr, method='vertex', rtree=rtree) result = ix.intersect_linestring(LineString([(15., 20.), (5., 20.)])) assert len(result) == 2 assert result.lengths.sum() == 10. @@ -481,14 +483,14 @@ def test_rect_grid_linestring_on_outer_boundary_shapely(): return result -def test_rect_grid_linestring_on_inner_boundary_shapely(): +def test_rect_grid_linestring_on_inner_boundary_shapely(rtree=True): # avoid test fail when shapely not available try: import shapely except: return gr = get_rect_grid() - ix = GridIntersect(gr) + ix = GridIntersect(gr, method='vertex', rtree=rtree) result = ix.intersect_linestring(LineString([(5., 10.), (15., 10.)])) assert len(result) == 2 assert result.lengths.sum() == 10. @@ -497,14 +499,14 @@ def test_rect_grid_linestring_on_inner_boundary_shapely(): return result -def test_rect_grid_multilinestring_in_one_cell_shapely(): +def test_rect_grid_multilinestring_in_one_cell_shapely(rtree=True): # avoid test fail when shapely not available try: import shapely except: return gr = get_rect_grid() - ix = GridIntersect(gr) + ix = GridIntersect(gr, method='vertex', rtree=rtree) result = ix.intersect_linestring(MultiLineString( [LineString([(1., 1), (9., 1.)]), LineString([(1., 9.), (9., 9.)])])) assert len(result) == 1 @@ -513,14 +515,14 @@ def test_rect_grid_multilinestring_in_one_cell_shapely(): return result -def test_rect_grid_linestring_in_and_out_of_cell_shapely(): +def test_rect_grid_linestring_in_and_out_of_cell_shapely(rtree=True): # avoid test fail when shapely not available try: import shapely except: return gr = get_rect_grid() - ix = GridIntersect(gr) + ix = GridIntersect(gr, method='vertex', rtree=rtree) result = ix.intersect_linestring( LineString([(5., 9), (15., 5.), (5., 1.)])) assert len(result) == 2 @@ -530,7 +532,7 @@ def test_rect_grid_linestring_in_and_out_of_cell_shapely(): return result -def test_tri_grid_linestring_outside(): +def test_tri_grid_linestring_outside(rtree=True): # avoid test fail when shapely not available try: import shapely @@ -539,13 +541,13 @@ def test_tri_grid_linestring_outside(): gr = get_tri_grid() if gr == -1: return - ix = GridIntersect(gr) + ix = GridIntersect(gr, rtree=rtree) result = ix.intersect_linestring(LineString([(25., 25.), (21., 5.)])) assert len(result) == 0 return result -def test_tri_grid_linestring_in_2cells(): +def test_tri_grid_linestring_in_2cells(rtree=True): # avoid test fail when shapely not available try: import shapely @@ -554,7 +556,7 @@ def test_tri_grid_linestring_in_2cells(): gr = get_tri_grid() if gr == -1: return - ix = GridIntersect(gr) + ix = GridIntersect(gr, rtree=rtree) result = ix.intersect_linestring(LineString([(5., 5.), (5., 15.)])) assert len(result) == 2 assert result.lengths.sum() == 10. @@ -563,7 +565,7 @@ def test_tri_grid_linestring_in_2cells(): return result -def test_tri_grid_linestring_on_outer_boundary(): +def test_tri_grid_linestring_on_outer_boundary(rtree=True): # avoid test fail when shapely not available try: import shapely @@ -572,7 +574,7 @@ def test_tri_grid_linestring_on_outer_boundary(): gr = get_tri_grid() if gr == -1: return - ix = GridIntersect(gr) + ix = GridIntersect(gr, rtree=rtree) result = ix.intersect_linestring(LineString([(15., 20.), (5., 20.)])) assert len(result) == 2 assert result.lengths.sum() == 10. @@ -581,7 +583,7 @@ def test_tri_grid_linestring_on_outer_boundary(): return result -def test_tri_grid_linestring_on_inner_boundary(): +def test_tri_grid_linestring_on_inner_boundary(rtree=True): # avoid test fail when shapely not available try: import shapely @@ -590,7 +592,7 @@ def test_tri_grid_linestring_on_inner_boundary(): gr = get_tri_grid() if gr == -1: return - ix = GridIntersect(gr) + ix = GridIntersect(gr, rtree=rtree) result = ix.intersect_linestring(LineString([(5., 10.), (15., 10.)])) assert len(result) == 2 assert result.lengths.sum() == 10. @@ -599,7 +601,7 @@ def test_tri_grid_linestring_on_inner_boundary(): return result -def test_tri_grid_multilinestring_in_one_cell(): +def test_tri_grid_multilinestring_in_one_cell(rtree=True): # avoid test fail when shapely not available try: import shapely @@ -608,7 +610,7 @@ def test_tri_grid_multilinestring_in_one_cell(): gr = get_tri_grid() if gr == -1: return - ix = GridIntersect(gr) + ix = GridIntersect(gr, rtree=rtree) result = ix.intersect_linestring(MultiLineString( [LineString([(1., 1), (9., 1.)]), LineString([(2., 2.), (9., 2.)])])) assert len(result) == 1 @@ -731,28 +733,28 @@ def test_rect_grid_polygon_with_hole(): # %% test polygon shapely -def test_rect_grid_polygon_outside_shapely(): +def test_rect_grid_polygon_outside_shapely(rtree=True): # avoid test fail when shapely not available try: import shapely except: return gr = get_rect_grid() - ix = GridIntersect(gr) + ix = GridIntersect(gr, method='vertex', rtree=rtree) result = ix.intersect_polygon( Polygon([(21., 11.), (23., 17.), (25., 11.)])) assert len(result) == 0 return result -def test_rect_grid_polygon_in_2cells_shapely(): +def test_rect_grid_polygon_in_2cells_shapely(rtree=True): # avoid test fail when shapely not available try: import shapely except: return gr = get_rect_grid() - ix = GridIntersect(gr) + ix = GridIntersect(gr, method='vertex', rtree=rtree) result = ix.intersect_polygon( Polygon([(2.5, 5.0), (7.5, 5.0), (7.5, 15.), (2.5, 15.)])) assert len(result) == 2 @@ -760,28 +762,28 @@ def test_rect_grid_polygon_in_2cells_shapely(): return result -def test_rect_grid_polygon_on_outer_boundary_shapely(): +def test_rect_grid_polygon_on_outer_boundary_shapely(rtree=True): # avoid test fail when shapely not available try: import shapely except: return gr = get_rect_grid() - ix = GridIntersect(gr) + ix = GridIntersect(gr, method='vertex', rtree=rtree) result = ix.intersect_polygon( Polygon([(20., 5.0), (25., 5.0), (25., 15.), (20., 15.)])) assert len(result) == 0 return result -def test_rect_grid_polygon_on_inner_boundary_shapely(): +def test_rect_grid_polygon_on_inner_boundary_shapely(rtree=True): # avoid test fail when shapely not available try: import shapely except: return gr = get_rect_grid() - ix = GridIntersect(gr) + ix = GridIntersect(gr, method='vertex', rtree=rtree) result = ix.intersect_polygon( Polygon([(5., 10.0), (15., 10.0), (15., 5.), (5., 5.)])) assert len(result) == 2 @@ -789,14 +791,14 @@ def test_rect_grid_polygon_on_inner_boundary_shapely(): return result -def test_rect_grid_multipolygon_in_one_cell_shapely(): +def test_rect_grid_multipolygon_in_one_cell_shapely(rtree=True): # avoid test fail when shapely not available try: import shapely except: return gr = get_rect_grid() - ix = GridIntersect(gr) + ix = GridIntersect(gr, method='vertex', rtree=rtree) p1 = Polygon([(1., 1.), (8., 1.), (8., 3.), (1., 3.)]) p2 = Polygon([(1., 9.), (8., 9.), (8., 7.), (1., 7.)]) p = MultiPolygon([p1, p2]) @@ -806,14 +808,14 @@ def test_rect_grid_multipolygon_in_one_cell_shapely(): return result -def test_rect_grid_multipolygon_in_multiple_cells_shapely(): +def test_rect_grid_multipolygon_in_multiple_cells_shapely(rtree=True): # avoid test fail when shapely not available try: import shapely except: return gr = get_rect_grid() - ix = GridIntersect(gr) + ix = GridIntersect(gr, method='vertex', rtree=rtree) p1 = Polygon([(1., 1.), (19., 1.), (19., 3.), (1., 3.)]) p2 = Polygon([(1., 9.), (19., 9.), (19., 7.), (1., 7.)]) p = MultiPolygon([p1, p2]) @@ -823,14 +825,14 @@ def test_rect_grid_multipolygon_in_multiple_cells_shapely(): return result -def test_rect_grid_polygon_with_hole_shapely(): +def test_rect_grid_polygon_with_hole_shapely(rtree=True): # avoid test fail when shapely not available try: import shapely except: return gr = get_rect_grid() - ix = GridIntersect(gr) + ix = GridIntersect(gr, method='vertex', rtree=rtree) p = Polygon([(5., 5.), (5., 15.), (25., 15.), (25., -5.), (5., -5.)], holes=[[(9., -1), (9, 11), (21, 11), (21, -1)]]) result = ix.intersect_polygon(p) @@ -839,7 +841,7 @@ def test_rect_grid_polygon_with_hole_shapely(): return result -def test_tri_grid_polygon_outside(): +def test_tri_grid_polygon_outside(rtree=True): # avoid test fail when shapely not available try: import shapely @@ -848,14 +850,14 @@ def test_tri_grid_polygon_outside(): gr = get_tri_grid() if gr == -1: return - ix = GridIntersect(gr) + ix = GridIntersect(gr, rtree=rtree) result = ix.intersect_polygon( Polygon([(21., 11.), (23., 17.), (25., 11.)])) assert len(result) == 0 return result -def test_tri_grid_polygon_in_2cells(): +def test_tri_grid_polygon_in_2cells(rtree=True): # avoid test fail when shapely not available try: import shapely @@ -864,7 +866,7 @@ def test_tri_grid_polygon_in_2cells(): gr = get_tri_grid() if gr == -1: return - ix = GridIntersect(gr) + ix = GridIntersect(gr, rtree=rtree) result = ix.intersect_polygon( Polygon([(2.5, 5.0), (5.0, 5.0), (5.0, 15.), (2.5, 15.)])) assert len(result) == 2 @@ -872,7 +874,7 @@ def test_tri_grid_polygon_in_2cells(): return result -def test_tri_grid_polygon_on_outer_boundary(): +def test_tri_grid_polygon_on_outer_boundary(rtree=True): # avoid test fail when shapely not available try: import shapely @@ -881,18 +883,18 @@ def test_tri_grid_polygon_on_outer_boundary(): gr = get_tri_grid() if gr == -1: return - ix = GridIntersect(gr) + ix = GridIntersect(gr, rtree=rtree) result = ix.intersect_polygon( Polygon([(20., 5.0), (25., 5.0), (25., 15.), (20., 15.)])) assert len(result) == 0 return result -def test_tri_grid_polygon_on_inner_boundary(): +def test_tri_grid_polygon_on_inner_boundary(rtree=True): gr = get_tri_grid() if gr == -1: return - ix = GridIntersect(gr) + ix = GridIntersect(gr, rtree=rtree) result = ix.intersect_polygon( Polygon([(5., 10.0), (15., 10.0), (15., 5.), (5., 5.)])) assert len(result) == 4 @@ -900,7 +902,7 @@ def test_tri_grid_polygon_on_inner_boundary(): return result -def test_tri_grid_multipolygon_in_one_cell(): +def test_tri_grid_multipolygon_in_one_cell(rtree=True): # avoid test fail when shapely not available try: import shapely @@ -909,7 +911,7 @@ def test_tri_grid_multipolygon_in_one_cell(): gr = get_tri_grid() if gr == -1: return - ix = GridIntersect(gr) + ix = GridIntersect(gr, rtree=rtree) p1 = Polygon([(1., 1.), (8., 1.), (8., 3.), (3., 3.)]) p2 = Polygon([(5., 5.), (8., 5.), (8., 8.)]) p = MultiPolygon([p1, p2]) @@ -919,7 +921,7 @@ def test_tri_grid_multipolygon_in_one_cell(): return result -def test_tri_grid_multipolygon_in_multiple_cells(): +def test_tri_grid_multipolygon_in_multiple_cells(rtree=True): # avoid test fail when shapely not available try: import shapely @@ -928,7 +930,7 @@ def test_tri_grid_multipolygon_in_multiple_cells(): gr = get_tri_grid() if gr == -1: return - ix = GridIntersect(gr) + ix = GridIntersect(gr, rtree=rtree) p1 = Polygon([(1., 1.), (19., 1.), (19., 3.), (1., 3.)]) p2 = Polygon([(1., 9.), (19., 9.), (19., 7.), (1., 7.)]) p = MultiPolygon([p1, p2]) @@ -938,7 +940,7 @@ def test_tri_grid_multipolygon_in_multiple_cells(): return result -def test_tri_grid_polygon_with_hole(): +def test_tri_grid_polygon_with_hole(rtree=True): # avoid test fail when shapely not available try: import shapely @@ -947,7 +949,7 @@ def test_tri_grid_polygon_with_hole(): gr = get_tri_grid() if gr == -1: return - ix = GridIntersect(gr) + ix = GridIntersect(gr, rtree=rtree) p = Polygon([(5., 5.), (5., 15.), (25., 15.), (25., -5.), (5., -5.)], holes=[[(9., -1), (9, 11), (21, 11), (21, -1)]]) result = ix.intersect_polygon(p) @@ -994,15 +996,17 @@ def test_polygon_offset_rot_structured_grid(): except: return sgr = get_rect_grid(angrot=45., xyoffset=10.) - p = Polygon([(5, 10. + np.sqrt(200.)), (15, 10. + np.sqrt(200.)), - (15, 10. + 1.5 * np.sqrt(200.)), (5, 10. + 1.5 * np.sqrt(200.))]) + p = Polygon([(5, 10. + np.sqrt(200.)), + (15, 10. + np.sqrt(200.)), + (15, 10. + 1.5 * np.sqrt(200.)), + (5, 10. + 1.5 * np.sqrt(200.))]) ix = GridIntersect(sgr, method="structured") result = ix.intersect_polygon(p) # assert len(result) == 3. return result -def test_point_offset_rot_structured_grid_shapely(): +def test_point_offset_rot_structured_grid_shapely(rtree=True): # avoid test fail when shapely not available try: import shapely @@ -1010,13 +1014,13 @@ def test_point_offset_rot_structured_grid_shapely(): return sgr = get_rect_grid(angrot=45., xyoffset=10.) p = Point(10., 10 + np.sqrt(200.)) - ix = GridIntersect(sgr, method="strtree") + ix = GridIntersect(sgr, method="vertex", rtree=rtree) result = ix.intersect_point(p) # assert len(result) == 1. return result -def test_linestring_offset_rot_structured_grid_shapely(): +def test_linestring_offset_rot_structured_grid_shapely(rtree=True): # avoid test fail when shapely not available try: import shapely @@ -1024,27 +1028,91 @@ def test_linestring_offset_rot_structured_grid_shapely(): return sgr = get_rect_grid(angrot=45., xyoffset=10.) ls = LineString([(5, 10. + np.sqrt(200.)), (15, 10. + np.sqrt(200.))]) - ix = GridIntersect(sgr, method="strtree") + ix = GridIntersect(sgr, method="vertex", rtree=rtree) result = ix.intersect_linestring(ls) # assert len(result) == 2. return result -def test_polygon_offset_rot_structured_grid_shapely(): +def test_polygon_offset_rot_structured_grid_shapely(rtree=True): # avoid test fail when shapely not available try: import shapely except: return sgr = get_rect_grid(angrot=45., xyoffset=10.) - p = Polygon([(5, 10. + np.sqrt(200.)), (15, 10. + np.sqrt(200.)), - (15, 10. + 1.5 * np.sqrt(200.)), (5, 10. + 1.5 * np.sqrt(200.))]) - ix = GridIntersect(sgr, method="strtree") + p = Polygon([(5, 10. + np.sqrt(200.)), + (15, 10. + np.sqrt(200.)), + (15, 10. + 1.5 * np.sqrt(200.)), + (5, 10. + 1.5 * np.sqrt(200.))]) + ix = GridIntersect(sgr, method="vertex", rtree=rtree) result = ix.intersect_polygon(p) # assert len(result) == 3. return result +# %% test non strtree shapely intersect + +def test_all_intersections_shapely_no_strtree(): + """avoid adding separate tests for rtree=False""" + # Points + # regular grid + test_rect_grid_point_on_inner_boundary_shapely(rtree=False) + test_rect_grid_point_on_outer_boundary_shapely(rtree=False) + test_rect_grid_point_outside_shapely(rtree=False) + test_rect_grid_multipoint_in_one_cell_shapely(rtree=False) + test_rect_grid_multipoint_in_multiple_cells_shapely(rtree=False) + # vertex grid + test_tri_grid_point_on_inner_boundary(rtree=False) + test_tri_grid_point_on_outer_boundary(rtree=False) + test_tri_grid_point_outside(rtree=False) + test_tri_grid_multipoint_in_multiple_cells(rtree=False) + test_tri_grid_multipoint_in_one_cell(rtree=False) + + # LineStrings + # regular grid + test_rect_grid_linestring_on_inner_boundary_shapely(rtree=False) + test_rect_grid_linestring_on_outer_boundary_shapely(rtree=False) + test_rect_grid_linestring_outside_shapely(rtree=False) + test_rect_grid_linestring_in_2cells_shapely(rtree=False) + test_rect_grid_linestring_in_and_out_of_cell_shapely(rtree=False) + test_rect_grid_multilinestring_in_one_cell_shapely(rtree=False) + # vertex grid + test_tri_grid_linestring_on_inner_boundary(rtree=False) + test_tri_grid_linestring_on_outer_boundary(rtree=False) + test_tri_grid_linestring_outside(rtree=False) + test_tri_grid_linestring_in_2cells(rtree=False) + test_tri_grid_multilinestring_in_one_cell(rtree=False) + + # Polygons + # regular grid + test_rect_grid_polygon_on_inner_boundary_shapely(rtree=False) + test_rect_grid_polygon_on_outer_boundary_shapely(rtree=False) + test_rect_grid_polygon_outside_shapely(rtree=False) + test_rect_grid_polygon_in_2cells_shapely(rtree=False) + test_rect_grid_polygon_with_hole_shapely(rtree=False) + test_rect_grid_multipolygon_in_one_cell_shapely(rtree=False) + test_rect_grid_multipolygon_in_multiple_cells_shapely(rtree=False) + # vertex grid + test_tri_grid_polygon_on_inner_boundary(rtree=False) + test_tri_grid_polygon_on_outer_boundary(rtree=False) + test_tri_grid_polygon_outside(rtree=False) + test_tri_grid_polygon_in_2cells(rtree=False) + test_tri_grid_polygon_with_hole(rtree=False) + test_tri_grid_multipolygon_in_multiple_cells(rtree=False) + test_tri_grid_multipolygon_in_one_cell(rtree=False) + + # offset and rotated grids + test_point_offset_rot_structured_grid_shapely(rtree=False) + test_linestring_offset_rot_structured_grid_shapely(rtree=False) + ix = test_polygon_offset_rot_structured_grid_shapely(rtree=False) + + return ix + + +# %% test rasters + + def test_rasters(): from flopy.utils import Raster import os @@ -1107,8 +1175,3 @@ def test_rasters(): raise AssertionError del rio - - -if __name__ == "__main__": - # test_rasters() - pass diff --git a/examples/Notebooks/flopy3_grid_intersection_demo.ipynb b/examples/Notebooks/flopy3_grid_intersection_demo.ipynb index fbbd47ab2..a86d563da 100644 --- a/examples/Notebooks/flopy3_grid_intersection_demo.ipynb +++ b/examples/Notebooks/flopy3_grid_intersection_demo.ipynb @@ -4,13 +4,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Intersecting grids with shapes\n", + "# Intersecting model grids with shapes\n", "\n", "_Note: This feature requires the shapely and descartes packages (which are not a FloPy dependency) so must be installed by the user._\n", "\n", - "This notebook shows the grid intersection functionality in flopy. The intersection methods are available through the GridIntersect object. A flopy model grid is passed to instantiate the object. Then the modelgrid can be intersected with Points, LineStrings and Polygons through the different intersect methods. There are two intersection modes: \n", - "- the first (default mode) is accessed by passing `method='strtree'` to `GridIntersect` and converts the modelgrid to a list of shapes that are sorted into an STR-tree to allow fast spatial queries. This works on structured and vertex grids.\n", - "- the second only works on structured grids and is accessed by passing `method='structured'` to `GridIntersect`. These methods use information from the structured grid to limit the search space for intersections and are generally faster.\n", + "This notebook shows the grid intersection functionality in flopy. The intersection methods are available through the GridIntersect object. A flopy modelgrid is passed to instantiate the object. Then the modelgrid can be intersected with Points, LineStrings and Polygons through the different intersection methods. \n", + "\n", + "There are three intersection modes: \n", + "- the first (default mode) builds an STR-tree for fast spatial queries before calculating intersections, thereby reducing the number of grid cells it has to process. This method works for structured and vertex grids.\n", + "- the second method does not construct the STR-tree, and loops through all gridcells to determine the intersection between the grid and the shape. This method also works for structured and vertex grids.\n", + "- the third method only works for structured grids and uses information from the structured grid to limit the search space for intersections.\n", "\n", "This notebook showcases the functionality of the GridIntersect class. \n", "\n", @@ -19,14 +22,12 @@ "- [GridIntersect Class](#gridclass)\n", "- [Rectangular regular grid](#rectgrid)\n", " - [Polygon with regular grid](#rectgrid.1)\n", - " - [Polyline with regular grid](#rectgrid.2)\n", + " - [MultiLineString with regular grid](#rectgrid.2)\n", " - [MultiPoint with regular grid](#rectgrid.3)\n", - "- [Triangular grid](#trigrid)\n", + "- [Vertex grid](#trigrid)\n", " - [Polygon with triangular grid](#trigrid.1)\n", - " - [Polyline with triangular grid](#trigrid.2)\n", - " - [MultiPoint with triangular grid](#trigrid.3)\n", - "- [Tests](#tests)\n", - "- [Timings](#timings)" + " - [MultiLineString with triangular grid](#trigrid.2)\n", + " - [MultiPoint with triangular grid](#trigrid.3)" ] }, { @@ -45,10 +46,11 @@ "name": "stdout", "output_type": "stream", "text": [ - "flopy is installed in c:\\GitHub\\flopy_db\\flopy\n", - "3.7.3 (default, Mar 27 2019, 17:13:21) [MSC v.1915 64 bit (AMD64)]\n", - "numpy version: 1.16.2\n", - "matplotlib version: 3.1.1\n", + "flopy is installed in /home/david/Github/flopy_db/flopy\n", + "3.7.6 (default, Jan 8 2020, 19:59:22) \n", + "[GCC 7.3.0]\n", + "numpy version: 1.18.1\n", + "matplotlib version: 3.1.3\n", "flopy version: 3.3.1\n" ] } @@ -68,7 +70,6 @@ " import flopy\n", " import flopy.discretization as fgrid\n", " import flopy.plot as fplot\n", - " from flopy.utils.triangle import Triangle as Triangle\n", " from flopy.utils.gridintersect import GridIntersect\n", "except:\n", " fpth = os.path.abspath(os.path.join('..', '..'))\n", @@ -76,7 +77,6 @@ " import flopy\n", " import flopy.discretization as fgrid\n", " import flopy.plot as fplot\n", - " from flopy.utils.triangle import Triangle as Triangle\n", " from flopy.utils.gridintersect import GridIntersect\n", "\n", "import shapely\n", @@ -89,41 +89,29 @@ "print('flopy version: {}'.format(flopy.__version__))" ] }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "triangle_exe = None" - ] - }, { "cell_type": "markdown", "metadata": {}, "source": [ "## [GridIntersect Class](#top)\n", "\n", - "This GridIntersect class takes a flopy.mfgrid and by default converts it to a list of Shapely geometries and builds a STRTree which can be used to efficiently query the grid to perform intersections. If the method is set to 'structured', the STR-tree is not built and different intersection methods are applied (written by Chris Langevin). The following methods are available:\n", - "- ` _rect_grid_to_shape_list`: convert rectangular (structured) modflow grid to list of shapely geometries\n", - "- `_sort_strtree_result`: sort STRTree by cellid (to ensure lowest cellid is returned when shapes intersect with multiple grid cells)\n", - "- `_usg_grid_to_shape_list`: not yet implemented, convert unstructured grid to list of shapely geometries\n", - "- `_vtx_grid_to_shape_list`: convert vertex modflow grid to list of shapely geometries\n", - "- `_intersect_point_shapely`: intersect Shapely point with grid\n", - "- `_intersect_polygon_shapely`: intersect Shapely Polygon with grid\n", - "- `_intersect_linestring_shapely`: intersect Shapely LineString with grid\n", - "- `_intersect_point_structured`: intersect Shapely point with grid, using optimized search for structured grids\n", - "- `_intersect_polygon_structured`: intersect Shapely Polygon with grid, using optimized search for structured grids\n", - "- `_intersect_rectangle_structured`: intersect rectangle with grid to get intersecting node ids\n", - "- `_intersect_linestring_structured`: intersect Shapely LineString with structured grid, using optimized search for structured grids\n", - "- `_check_adjacent_cells_intersecting_line`: helper function to check adjacent cells in a structured grid for line intersections\n", - "- `_get_nodes_intersecting_linestring`: helper function to follow linestring through structured grid\n", - "- `intersect_point`: intersect point with grid, method depends on whether 'structured' or 'strtree' is passed at intialization.\n", - "- `intersect_linestring`: intersect linestring with grid, method depends on whether 'structured' or 'strtree' is passed at intialization.\n", - "- `intersect_polygon`: intersect polygon with grid, method depends on whether 'structured' or 'strtree' is passed at intialization.\n", - "- `plot_point`: plot intersect result for point\n", - "- `plot_polygon`: plot intersect result for polygons\n", - "- `plot_polyline`: plot intersect result for linestrings" + "The GridIntersect class is constructed by passing a flopy modelgrid object to the constructor. There are options users can select to change how the intersection is calculated.\n", + "\n", + "- `method`: either `\"vertex\"` (default) or `\"structured\"`. If `\"structured\"` is passed, the intersections are performed using structured methods. These methods use information about the regular grid to limit the search space for intersection calculations. \n", + "- `rtree`: either `True` (default) or `False`, only read when `method=\"vertex\"`. When True, an STR-tree is built, which allows for fast spatial queries. Building the STR-tree does take some time however. Setting the option to False avoids building the STR-tree but requires the intersection calculation to essentially loop through all grid cells.\n", + "\n", + "In general the default option is robust (it always works) and fast and is therefore recommended in most situations. If you are working with a structured grid, then the `method=\"structured\"` can speed up intersection operations (especially for points and linestrings) with the added advantage of not having to build an STR-tree. In some cases with vertex grids, it might not be worth your time building the STR-tree, in which case it can be avoided by passing `rtree=False`.\n", + "\n", + "The important methods in the GridIntersect object are:\n", + "- `intersects()`: returns cellids for gridcells that intersect a shape\n", + "- `intersect_point()`: for intersecting the modelgrid with point geometries\n", + "- `intersect_linestring()`: for intersecting the modelgrid with linestrings\n", + "- `intersect_polygon()`: for intersecting the modelgrid with polygons\n", + "- `plot_point()`: for plotting point intersection results\n", + "- `plot_linestring()`: for plotting linestring intersection results\n", + "- `plot_polygon()`: for plotting polygon intersection results\n", + "\n", + "In the following sections examples of intersections are shown for structured and vertex grids for different types of shapes (Polygon, LineString and Point)." ] }, { @@ -135,7 +123,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -145,7 +133,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -157,22 +145,22 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 5, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -197,11 +185,12 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ - "p = Polygon(shell=[(15, 15), (20, 50), (35, 80.), (80, 50), (80, 40), (40, 5), (15, 12)], \n", + "p = Polygon(shell=[(15, 15), (20, 50), (35, 80.), (80, 50), \n", + " (80, 40), (40, 5), (15, 12)], \n", " holes=[[(25, 25), (25, 45), (45, 45), (45, 25)]])" ] }, @@ -209,16 +198,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Create GridIntersect class" + "Create the GridIntersect class for our modelgrid. The keyword arguments are shown below, but as these are the default options, they do not need to be passed necesssarily." ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ - "ix = GridIntersect(sgr)" + "ix = GridIntersect(sgr, method=\"vertex\", rtree=True)" ] }, { @@ -228,6 +217,23 @@ "Do the intersect operation for a polygon" ] }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6.21 ms ± 866 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" + ] + } + ], + "source": [ + "%timeit ix.intersect_polygon(p)" + ] + }, { "cell_type": "code", "execution_count": 8, @@ -237,35 +243,51 @@ "result = ix.intersect_polygon(p)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The results are returned as a numpy.recarray containing several fields based on the intersection performed. An explanation of the data in each of the possible fields is given below:\n", + "- **cellids**: contains the cell ids of the intersected grid cells\n", + "- **vertices**: contains the vertices of the intersected shape\n", + "- **areas**: contains the area of the polygon in that grid cell (only for polygons)\n", + "- **lenghts**: contains the length of the linestring in that grid cell (only for linestrings)\n", + "- **ixshapes**: contains the shapely object representing the intersected shape (useful for plotting the result)\n", + "\n", + "Looking at the first few entries of the results of the polygon intersection (convert to pandas.DataFrame for prettier formatting)" + ] + }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "9.01 ms ± 334 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" - ] + "data": { + "text/plain": [ + "rec.array([((2, 3), (((30.0, 70.0), (35.0, 80.0), (40.0, 76.66666666666667), (40.0, 70.0), (30.0, 70.0)),), 66.66666667, ),\n", + " ((2, 4), (((40.0, 76.66666666666667), (50.0, 70.0), (40.0, 70.0), (40.0, 76.66666666666667)),), 33.33333333, ),\n", + " ((3, 2), (((25.0, 60.0), (30.0, 70.0), (30.0, 60.0), (25.0, 60.0)),), 25. , ),\n", + " ((3, 3), (((30.0, 70.0), (40.0, 70.0), (40.0, 60.0), (30.0, 60.0), (30.0, 70.0)),), 100. , ),\n", + " ((3, 4), (((40.0, 70.0), (50.0, 70.0), (50.0, 60.0), (40.0, 60.0), (40.0, 70.0)),), 100. , )],\n", + " dtype=[('cellids', 'O'), ('vertices', 'O'), ('areas', '),\n", - " ((2, 4), (((40.0, 76.66666666666667), (50.0, 70.0), (40.0, 70.0), (40.0, 76.66666666666667)),), 33.33333333, ),\n", - " ((3, 2), (((25.0, 60.0), (30.0, 70.0), (30.0, 60.0), (25.0, 60.0)),), 25. , ),\n", - " ((3, 3), (((30.0, 70.0), (40.0, 70.0), (40.0, 60.0), (30.0, 60.0), (30.0, 70.0)),), 100. , ),\n", - " ((3, 4), (((40.0, 70.0), (50.0, 70.0), (50.0, 60.0), (40.0, 60.0), (40.0, 70.0)),), 100. , ),\n", - " ((3, 5), (((50.0, 70.0), (60.0, 63.333333333333336), (60.0, 60.0), (50.0, 60.0), (50.0, 70.0)),), 66.66666667, ),\n", - " ((3, 6), (((60.0, 63.333333333333336), (65.0, 60.0), (60.0, 60.0), (60.0, 63.333333333333336)),), 8.33333333, ),\n", - " ((4, 2), (((20.0, 50.0), (25.0, 60.0), (30.0, 60.0), (30.0, 50.0), (20.0, 50.0)),), 75. , ),\n", - " ((4, 3), (((30.0, 60.0), (40.0, 60.0), (40.0, 50.0), (30.0, 50.0), (30.0, 60.0)),), 100. , ),\n", - " ((4, 4), (((40.0, 60.0), (50.0, 60.0), (50.0, 50.0), (40.0, 50.0), (40.0, 60.0)),), 100. , ),\n", - " ((4, 5), (((50.0, 60.0), (60.0, 60.0), (60.0, 50.0), (50.0, 50.0), (50.0, 60.0)),), 100. , ),\n", - " ((4, 6), (((65.0, 60.0), (70.0, 56.666666666666664), (70.0, 50.0), (60.0, 50.0), (60.0, 60.0), (65.0, 60.0)),), 91.66666667, ),\n", - " ((4, 7), (((70.0, 56.666666666666664), (80.0, 50.0), (70.0, 50.0), (70.0, 56.666666666666664)),), 33.33333333, ),\n", - " ((5, 1), (((18.571428571428573, 40.0), (20.0, 50.0), (20.0, 40.0), (18.571428571428573, 40.0)),), 7.14285714, ),\n", - " ((5, 2), (((30.0, 45.0), (25.0, 45.0), (25.0, 40.0), (20.0, 40.0), (20.0, 50.0), (30.0, 50.0), (30.0, 45.0)),), 75. , ),\n", - " ((5, 3), (((40.0, 45.0), (30.0, 45.0), (30.0, 50.0), (40.0, 50.0), (40.0, 45.0)),), 50. , ),\n", - " ((5, 4), (((45.0, 40.0), (45.0, 45.0), (40.0, 45.0), (40.0, 50.0), (50.0, 50.0), (50.0, 40.0), (45.0, 40.0)),), 75. , ),\n", - " ((5, 5), (((50.0, 50.0), (60.0, 50.0), (60.0, 40.0), (50.0, 40.0), (50.0, 50.0)),), 100. , ),\n", - " ((5, 6), (((60.0, 50.0), (70.0, 50.0), (70.0, 40.0), (60.0, 40.0), (60.0, 50.0)),), 100. , ),\n", - " ((5, 7), (((80.0, 50.0), (80.0, 40.0), (70.0, 40.0), (70.0, 50.0), (80.0, 50.0)),), 100. , ),\n", - " ((6, 1), (((17.142857142857142, 30.0), (18.571428571428573, 40.0), (20.0, 40.0), (20.0, 30.0), (17.142857142857142, 30.0)),), 21.42857143, ),\n", - " ((6, 2), (((25.0, 40.0), (25.0, 30.0), (20.0, 30.0), (20.0, 40.0), (25.0, 40.0)),), 50. , ),\n", - " ((6, 4), (((45.0, 30.0), (45.0, 40.0), (50.0, 40.0), (50.0, 30.0), (45.0, 30.0)),), 50. , ),\n", - " ((6, 5), (((50.0, 40.0), (60.0, 40.0), (60.0, 30.0), (50.0, 30.0), (50.0, 40.0)),), 100. , ),\n", - " ((6, 6), (((70.0, 31.25), (68.57142857142857, 30.0), (60.0, 30.0), (60.0, 40.0), (70.0, 40.0), (70.0, 31.25)),), 99.10714286, ),\n", - " ((6, 7), (((80.0, 40.0), (70.0, 31.25), (70.0, 40.0), (80.0, 40.0)),), 43.75 , ),\n", - " ((7, 1), (((15.714285714285714, 20.0), (17.142857142857142, 30.0), (20.0, 30.0), (20.0, 20.0), (15.714285714285714, 20.0)),), 35.71428571, ),\n", - " ((7, 2), (((25.0, 30.0), (25.0, 25.0), (30.0, 25.0), (30.0, 20.0), (20.0, 20.0), (20.0, 30.0), (25.0, 30.0)),), 75. , ),\n", - " ((7, 3), (((30.0, 25.0), (40.0, 25.0), (40.0, 20.0), (30.0, 20.0), (30.0, 25.0)),), 50. , ),\n", - " ((7, 4), (((40.0, 25.0), (45.0, 25.0), (45.0, 30.0), (50.0, 30.0), (50.0, 20.0), (40.0, 20.0), (40.0, 25.0)),), 75. , ),\n", - " ((7, 5), (((60.0, 22.5), (57.142857142857146, 20.0), (50.0, 20.0), (50.0, 30.0), (60.0, 30.0), (60.0, 22.5)),), 96.42857143, ),\n", - " ((7, 6), (((68.57142857142857, 30.0), (60.0, 22.5), (60.0, 30.0), (68.57142857142857, 30.0)),), 32.14285714, ),\n", - " ((8, 1), (((15.0, 15.0), (15.714285714285714, 20.0), (20.0, 20.0), (20.0, 10.6), (15.0, 12.0), (15.0, 15.0)),), 41.71428571, ),\n", - " ((8, 2), (((22.142857142857142, 10.0), (20.0, 10.6), (20.0, 20.0), (30.0, 20.0), (30.0, 10.0), (22.142857142857142, 10.0)),), 99.35714286, ),\n", - " ((8, 3), (((30.0, 20.0), (40.0, 20.0), (40.0, 10.0), (30.0, 10.0), (30.0, 20.0)),), 100. , ),\n", - " ((8, 4), (((50.0, 13.75), (45.714285714285715, 10.0), (40.0, 10.0), (40.0, 20.0), (50.0, 20.0), (50.0, 13.75)),), 91.96428571, ),\n", - " ((8, 5), (((57.142857142857146, 20.0), (50.0, 13.75), (50.0, 20.0), (57.142857142857146, 20.0)),), 22.32142857, ),\n", - " ((9, 2), (((30.0, 7.8), (22.142857142857142, 10.0), (30.0, 10.0), (30.0, 7.8)),), 8.64285714, ),\n", - " ((9, 3), (((40.0, 5.0), (30.0, 7.8), (30.0, 10.0), (40.0, 10.0), (40.0, 5.0)),), 36. , ),\n", - " ((9, 4), (((45.714285714285715, 10.0), (40.0, 5.0), (40.0, 10.0), (45.714285714285715, 10.0)),), 14.28571429, )],\n", - " dtype=[('cellids', 'O'), ('vertices', 'O'), ('areas', '" ] @@ -355,15 +417,19 @@ } ], "source": [ + "# create a figure and plot the grid\n", "fig, ax = plt.subplots(1, 1, figsize=(8, 8))\n", "sgr.plot(ax=ax)\n", + "\n", + "# the intersection object contains some helpful plotting commands\n", "ix.plot_polygon(result, ax=ax)\n", "\n", - "# only cells that intersect with shape\n", + "# add black x at cell centers\n", "for irow, icol in result.cellids:\n", " h2, = ax.plot(sgr.xcellcenters[0, icol], sgr.ycellcenters[irow, 0], \n", " \"kx\", label=\"centroids of intersected gridcells\")\n", - " \n", + "\n", + "# add legend\n", "ax.legend([h2], [i.get_label() for i in [h2]], loc=\"best\");" ] }, @@ -376,64 +442,68 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "ixs = GridIntersect(sgr, method=\"structured\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The methods are optimized for structured grids, but for certain types of polygons there is no benefit (as can be seen in this example)." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "9.06 ms ± 1.38 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" + ] + } + ], + "source": [ + "%timeit ixs.intersect_polygon(p)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The result is the same as before:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "rec.array([((2, 3), (((30.0, 70.0), (35.0, 80.0), (40.0, 76.66666666666667), (40.0, 70.0), (30.0, 70.0)),), 66.66666667, ),\n", - " ((2, 4), (((40.0, 76.66666666666667), (50.0, 70.0), (40.0, 70.0), (40.0, 76.66666666666667)),), 33.33333333, ),\n", - " ((3, 2), (((25.0, 60.0), (30.0, 70.0), (30.0, 60.0), (25.0, 60.0)),), 25. , ),\n", - " ((3, 3), (((30.0, 70.0), (40.0, 70.0), (40.0, 60.0), (30.0, 60.0), (30.0, 70.0)),), 100. , ),\n", - " ((3, 4), (((40.0, 70.0), (50.0, 70.0), (50.0, 60.0), (40.0, 60.0), (40.0, 70.0)),), 100. , ),\n", - " ((3, 5), (((50.0, 70.0), (60.0, 63.333333333333336), (60.0, 60.0), (50.0, 60.0), (50.0, 70.0)),), 66.66666667, ),\n", - " ((3, 6), (((60.0, 63.333333333333336), (65.0, 60.0), (60.0, 60.0), (60.0, 63.333333333333336)),), 8.33333333, ),\n", - " ((4, 2), (((20.0, 50.0), (25.0, 60.0), (30.0, 60.0), (30.0, 50.0), (20.0, 50.0)),), 75. , ),\n", - " ((4, 3), (((30.0, 60.0), (40.0, 60.0), (40.0, 50.0), (30.0, 50.0), (30.0, 60.0)),), 100. , ),\n", - " ((4, 4), (((40.0, 60.0), (50.0, 60.0), (50.0, 50.0), (40.0, 50.0), (40.0, 60.0)),), 100. , ),\n", - " ((4, 5), (((50.0, 60.0), (60.0, 60.0), (60.0, 50.0), (50.0, 50.0), (50.0, 60.0)),), 100. , ),\n", - " ((4, 6), (((65.0, 60.0), (70.0, 56.666666666666664), (70.0, 50.0), (60.0, 50.0), (60.0, 60.0), (65.0, 60.0)),), 91.66666667, ),\n", - " ((4, 7), (((70.0, 56.666666666666664), (80.0, 50.0), (70.0, 50.0), (70.0, 56.666666666666664)),), 33.33333333, ),\n", - " ((5, 1), (((18.571428571428573, 40.0), (20.0, 50.0), (20.0, 40.0), (18.571428571428573, 40.0)),), 7.14285714, ),\n", - " ((5, 2), (((30.0, 45.0), (25.0, 45.0), (25.0, 40.0), (20.0, 40.0), (20.0, 50.0), (30.0, 50.0), (30.0, 45.0)),), 75. , ),\n", - " ((5, 3), (((40.0, 45.0), (30.0, 45.0), (30.0, 50.0), (40.0, 50.0), (40.0, 45.0)),), 50. , ),\n", - " ((5, 4), (((45.0, 40.0), (45.0, 45.0), (40.0, 45.0), (40.0, 50.0), (50.0, 50.0), (50.0, 40.0), (45.0, 40.0)),), 75. , ),\n", - " ((5, 5), (((50.0, 50.0), (60.0, 50.0), (60.0, 40.0), (50.0, 40.0), (50.0, 50.0)),), 100. , ),\n", - " ((5, 6), (((60.0, 50.0), (70.0, 50.0), (70.0, 40.0), (60.0, 40.0), (60.0, 50.0)),), 100. , ),\n", - " ((5, 7), (((80.0, 50.0), (80.0, 40.0), (70.0, 40.0), (70.0, 50.0), (80.0, 50.0)),), 100. , ),\n", - " ((6, 1), (((17.142857142857142, 30.0), (18.571428571428573, 40.0), (20.0, 40.0), (20.0, 30.0), (17.142857142857142, 30.0)),), 21.42857143, ),\n", - " ((6, 2), (((25.0, 40.0), (25.0, 30.0), (20.0, 30.0), (20.0, 40.0), (25.0, 40.0)),), 50. , ),\n", - " ((6, 4), (((45.0, 30.0), (45.0, 40.0), (50.0, 40.0), (50.0, 30.0), (45.0, 30.0)),), 50. , ),\n", - " ((6, 5), (((50.0, 40.0), (60.0, 40.0), (60.0, 30.0), (50.0, 30.0), (50.0, 40.0)),), 100. , ),\n", - " ((6, 6), (((70.0, 31.25), (68.57142857142857, 30.0), (60.0, 30.0), (60.0, 40.0), (70.0, 40.0), (70.0, 31.25)),), 99.10714286, ),\n", - " ((6, 7), (((80.0, 40.0), (70.0, 31.25), (70.0, 40.0), (80.0, 40.0)),), 43.75 , ),\n", - " ((7, 1), (((15.714285714285714, 20.0), (17.142857142857142, 30.0), (20.0, 30.0), (20.0, 20.0), (15.714285714285714, 20.0)),), 35.71428571, ),\n", - " ((7, 2), (((25.0, 30.0), (25.0, 25.0), (30.0, 25.0), (30.0, 20.0), (20.0, 20.0), (20.0, 30.0), (25.0, 30.0)),), 75. , ),\n", - " ((7, 3), (((30.0, 25.0), (40.0, 25.0), (40.0, 20.0), (30.0, 20.0), (30.0, 25.0)),), 50. , ),\n", - " ((7, 4), (((40.0, 25.0), (45.0, 25.0), (45.0, 30.0), (50.0, 30.0), (50.0, 20.0), (40.0, 20.0), (40.0, 25.0)),), 75. , ),\n", - " ((7, 5), (((60.0, 22.5), (57.142857142857146, 20.0), (50.0, 20.0), (50.0, 30.0), (60.0, 30.0), (60.0, 22.5)),), 96.42857143, ),\n", - " ((7, 6), (((68.57142857142857, 30.0), (60.0, 22.5), (60.0, 30.0), (68.57142857142857, 30.0)),), 32.14285714, ),\n", - " ((8, 1), (((15.0, 15.0), (15.714285714285714, 20.0), (20.0, 20.0), (20.0, 10.6), (15.0, 12.0), (15.0, 15.0)),), 41.71428571, ),\n", - " ((8, 2), (((22.142857142857142, 10.0), (20.0, 10.6), (20.0, 20.0), (30.0, 20.0), (30.0, 10.0), (22.142857142857142, 10.0)),), 99.35714286, ),\n", - " ((8, 3), (((30.0, 20.0), (40.0, 20.0), (40.0, 10.0), (30.0, 10.0), (30.0, 20.0)),), 100. , ),\n", - " ((8, 4), (((50.0, 13.75), (45.714285714285715, 10.0), (40.0, 10.0), (40.0, 20.0), (50.0, 20.0), (50.0, 13.75)),), 91.96428571, ),\n", - " ((8, 5), (((57.142857142857146, 20.0), (50.0, 13.75), (50.0, 20.0), (57.142857142857146, 20.0)),), 22.32142857, ),\n", - " ((9, 2), (((30.0, 7.8), (22.142857142857142, 10.0), (30.0, 10.0), (30.0, 7.8)),), 8.64285714, ),\n", - " ((9, 3), (((40.0, 5.0), (30.0, 7.8), (30.0, 10.0), (40.0, 10.0), (40.0, 5.0)),), 36. , ),\n", - " ((9, 4), (((45.714285714285715, 10.0), (40.0, 5.0), (40.0, 10.0), (45.714285714285715, 10.0)),), 14.28571429, )],\n", + "rec.array([((2, 3), (((30.0, 70.0), (35.0, 80.0), (40.0, 76.66666666666667), (40.0, 70.0), (30.0, 70.0)),), 66.66666667, ),\n", + " ((2, 4), (((40.0, 76.66666666666667), (50.0, 70.0), (40.0, 70.0), (40.0, 76.66666666666667)),), 33.33333333, ),\n", + " ((3, 2), (((25.0, 60.0), (30.0, 70.0), (30.0, 60.0), (25.0, 60.0)),), 25. , ),\n", + " ((3, 3), (((30.0, 70.0), (40.0, 70.0), (40.0, 60.0), (30.0, 60.0), (30.0, 70.0)),), 100. , ),\n", + " ((3, 4), (((40.0, 70.0), (50.0, 70.0), (50.0, 60.0), (40.0, 60.0), (40.0, 70.0)),), 100. , )],\n", " dtype=[('cellids', 'O'), ('vertices', 'O'), ('areas', '" ] @@ -520,45 +597,28 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "ixs = GridIntersect(sgr, method=\"structured\")" + ] + }, + { + "cell_type": "code", + "execution_count": 22, "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "rec.array([((9, 1), list([[(20.0, 4.888888888888889), (10.0, 2.4444444444444446)]]), 10.29443095, list([])),\n", - " ((0, 7), list([[(80.0, 92.3076923076923), (77.27272727272728, 90.0)]]), 3.57259854, list([])),\n", - " ((1, 6), list([[(70.0, 83.84615384615384), (65.45454545454545, 80.0)]]), 5.9543309 , list([])),\n", - " ((9, 4), list([[(40.90909090909091, 10.0), (40.0, 9.777777777777779)]]), 0.93585736, list([])),\n", - " ((2, 5), list([[(60.0, 75.38461538461539), (53.63636363636364, 70.0)]]), 8.33606326, list([])),\n", - " ((8, 5), list([[(60.0, 14.666666666666666), (50.0, 12.222222222222221)]]), 10.29443095, list([])),\n", - " ((9, 0), list([[(10.0, 2.4444444444444446), (0.0, 0.0)]]), 10.29443095, list([])),\n", - " ((4, 4), list([[(41.81818181818182, 60.0), (40.0, 58.46153846153846)]]), 2.38173236, list([])),\n", - " ((3, 4), list([[(50.0, 66.92307692307692), (41.81818181818182, 60.0)]]), 10.71779561, list([])),\n", - " ((8, 6), list([[(70.0, 17.11111111111111), (60.0, 14.666666666666666)]]), 10.29443095, list([])),\n", - " ((2, 6), list([[(65.45454545454545, 80.0), (60.0, 75.38461538461539)]]), 7.14519708, list([])),\n", - " ((9, 3), list([[(40.0, 9.777777777777779), (30.0, 7.333333333333334)]]), 10.29443095, list([])),\n", - " ((8, 7), list([[(80.0, 19.555555555555557), (70.0, 17.11111111111111)]]), 10.29443095, list([])),\n", - " ((0, 8), list([[(89.0909090909091, 100.0), (80.0, 92.3076923076923)]]), 11.90866179, list([])),\n", - " ((3, 5), list([[(53.63636363636364, 70.0), (50.0, 66.92307692307692)]]), 4.76346472, list([])),\n", - " ((9, 2), list([[(30.0, 7.333333333333334), (20.0, 4.888888888888889)]]), 10.29443095, list([])),\n", - " ((8, 8), list([[(81.81818181818181, 20.0), (80.0, 19.555555555555557)]]), 1.87171472, list([])),\n", - " ((4, 3), list([[(40.0, 58.46153846153846), (30.0, 50.0)]]), 13.09952797, list([])),\n", - " ((1, 7), list([[(77.27272727272728, 90.0), (70.0, 83.84615384615384)]]), 9.52692944, list([])),\n", - " ((7, 8), list([[(90.0, 22.0), (81.81818181818181, 20.0)]]), 8.42271623, list([])),\n", - " ((8, 4), list([[(50.0, 12.222222222222221), (40.90909090909091, 10.0)]]), 9.35857359, list([]))],\n", - " dtype=[('cellids', 'O'), ('vertices', 'O'), ('lengths', '),\n", + " ((8, 0), ((10.0, 10.0),), ),\n", + " ((9, 4), ((50.0, 0.0),), )],\n", + " dtype=[('cellids', 'O'), ('vertices', 'O'), ('ixshapes', 'O')])" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "result = ix.intersect_point(mp)\n", + "result" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAeQAAAHWCAYAAACmHPpfAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nO3dfZSXdZ3/8ecnQBDUFMidbCzwLN3gONwk3mRhI2olpOYaZVsypscOJ6vdNvsx7WE1nKzYTrpqi4djy9DWSUe8Xbv5lTitUpsCYa6Bv2PeIcoIgRo3yp3v3x/zZQSZgWG+M3w/1/h8nMOZ+V7f6+Y111zDaz7XdX2/kyICSZJUWW+pdABJkmQhS5KUBQtZkqQMWMiSJGXAQpYkKQMWsiRJGdhnIaeU/iOltCal9Ogu04amlH6dUnq89PGI0vSUUroupfTnlNIjKaXxvRlekqS+oisj5Cbgo2+YNgNYGBGjgIWlxwAfA0aV/l0KzOmZmJIk9W37LOSIuB9Y/4bJ5wDzS5/PB87dZfqPos3vgcNTSm/vqbCSJPVV3b2G/DcRsRqg9PHI0vR3AM/uMt+q0jRJkrQX/Xt4famDaR2+N2dK6VLaTmszePDg9x955JEdzZadbdu2ATBgwIAKJ9m3ImWFYuUtUlYoVl6z9p4i5S1SVmjL+9xzz/0lIt7W3XV0t5BfSCm9PSJWl05JrylNXwUcvct81cDzHa0gIuYCcwFGjhwZTz31VDejHFhNTU0A1NfXVzRHVxQpKxQrb5GyQrHymrX3FClvkbJCW96LLrromXLW0d1T1ncD00qfTwPu2mX6haW7rU8CXt55aluSJHVunyPklNJPgQ8Dw1NKq4ArgO8AzSmli4GVwCdLs/8cOAv4M7AZuKgXMkuS1Ofss5Aj4oJOnprUwbwBfLHcUJIkvdn09E1dkrSHbdu2sWrVKl599dV9znvssccCsGLFit6OVbYiZYVi5c0566BBg6iuru7xG84sZEm9btWqVRx66KGMGDGClDp6Mcbr/vKXvwAwfPjwAxGtLEXKCsXKm2vWiGDdunWsWrWKkSNH9ui6fS9rSb3u1VdfZdiwYfssYyl3KSWGDRvWpbM9+8tClnRAWMbqK3rrWLaQJamLXnrpJf793/+9W8t+4AMf6HB6fX09CxYsKCcWW7Zs4fTTT2fs2LHccsstuz33L//yL9x77717Xf43v/kNv/vd78rK0F3d3faIESPaT2uXs+0pU6YAba8jvuyyy8paX7ksZElZuf7661m0aNFu01paWpg9e3aFEr1ub4W8Y8eOvS7bm4W3bNkytm3bxsMPP8ynPvWp3Z6bNWsWp59++l6X704pbt++fb9z9tS2+yoLWVJWxo0bxyWXXEJLSwvQVsZTp05lwoQJZa33Rz/6EbW1tYwZM4bPfe5zAKxdu5a/+7u/Y8KECUyYMIHf/va3AFx55ZV8/vOf58Mf/jDHHHMM1113HQAzZszgiSeeYOzYsVx++eX89re/5dxzz+Uzn/kMxx13HADf//73qampoaamhmuvvbZ9+4cccgjQdlPQZZddxujRo5k8eTJr1qxpn2fGjBmMHj2a2tpavva1r+3xNaxfv55zzz2X2tpaTjrpJB555BHWrFnDZz/7WR5++GHGjh3LE088sdsyu47Ax48fz3e/+13Gjx/Pcccdx2OPPcbTTz/NjTfeyDXXXMPYsWN54IEH9rpfLr30Us4880wuvPBC/vSnP3HCCScwduxYamtrefzxxwH48Y9/3D79C1/4QvsvK7/85S8ZP348Y8aMYdKkSXvd9hlnnMEZZ5zRvu1169Zx5plnMm7cOL7whS/Q9irbPb1xGwCbNm3i85//PBMmTGDcuHHcddddHS6706233kpNTQ1jxoxh4sSJe523R0VExf+NGDEiimLevHkxb968SsfokiJljShW3iJljah83uXLl3d53rVr18Ydd9wRw4cPj5kzZ8bw4cPjvvvuK2v7jz76aLz73e+OtWvXRkTEunXrIiLiggsuiAceeCAiIp555pl473vfGxERV1xxRZx88snx6quvxtq1a2Po0KGxdevWeOqpp+LYY49tX++dd94ZgwcPjieffDIiIpYsWRI1NTWxcePG2LBhQ4wePTr+8Ic/RETEkCFDIiLitttui9NPPz22b98ezz33XLz1rW+NW2+9NdatWxfvfve747XXXouIiBdffHGPr+Oyyy6LK6+8MiIiFi5cGGPGjImIiJaWlpg8eXKHX/u0adPi1ltvjYiIo48+Oq6++uqIiPjBD34QF198cfvX+6//+q/ty+xtv4wfPz42b97cnufHP/5xRERs2bIlNm/eHMuXL48pU6bE1q1bIyJi+vTpMX/+/FizZk1UV1e376ud34POtr127dpYtmxZ+7a/9KUvxTe/+c2IiLjnnnsCaP9+7tTZNhoaGuI///M/2/frqFGjYuPGjbvtt3nz5sUXv/jFiIioqamJVatWdfp9iNjzmJ43b14AS6KMLvRlT5Ky88EPfpDp06dz1VVXMXPmTOrq6spa33333cf555/f/hKaoUOHAnDvvfeyfPny9vn++te/smHDBgAmT57MwIEDGThwIEceeSQvvPBCh+seN25c+8tfFi1axCc+8QmGDBkCwHnnnccDDzzAuHHj2ue///77ueCCC+jXrx9HHXUUp512GgCHHXYYgwYN4pJLLmHy5Mnt1zZ3tWjRIm677TYATjvtNNatW8fLL7+8X/ti53rf//73c/vtt3c4z972y9lnn83BBx8MwMknn8y3vvUtVq1axXnnnceoUaNYuHAhS5cubT+j8corr3DkkUfy+9//nokTJ7bvq53fg862vfOU+M5t33///e15J0+ezBFHHLHHsp1t41e/+hV333033/ve94C2u/5XrlzZ6T465ZRTqK+vZ+rUqZx33nmdztfTLGRJ2Vm0aBFz5sxh5syZzJkzh7q6urJKOSI6vDP2tdde43/+53/aC2ZXAwcObP+8X79+nV4zHTx48G7b6YqOsvTv35+HHnqIhQsXcvPNN3PDDTdw33337fF1dGVde3PQQQcBe/+a9rZfdv6yAfCZz3yGE088kZ/97Gd85CMf4aabbiIimDZtGt/+9rd3W+7uu+/uUtad2960aROw++uQ97V8Z9/niOC2227jPe95z27TO/sl68Ybb+TBBx/kZz/7GWPHjuXhhx9m2LBh+8xeLq8hS8rKokWLuOSSS2hubmbWrFk0NzczderU9mvK3TFp0iSam5tZt24d0HYtFuDMM8/khhtuaJ/v4Ycf3ut6Dj300PaRYkcmTpzInXfeyebNm9m0aRN33HEHH/rQh/aY5+abb2bHjh2sXr26/evauHEjL7/8MmeddRbXXntth1kmTpzIT37yE6DtZqjhw4dz2GGHdWEP7N0bv66u7pcnn3ySY445hi9/+cucffbZPPLII0yaNIkFCxa0Xxtfv349zzzzDCeffDL//d//zc6/7Lfze9DVbe/6tf/iF7/gxRdf3CNPZ9v4yEc+wvXXX9/+C82yZcv2uj+eeOIJTjzxRGbNmsXw4cN59tln9zp/T7GQJWVl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\n", "text/plain": [ "
" ] @@ -627,26 +719,50 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "ixs = GridIntersect(sgr, method=\"structured\")" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "176 µs ± 3.71 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n" + ] + } + ], + "source": [ + "%timeit ixs.intersect_point(mp)" + ] + }, + { + "cell_type": "code", + "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "rec.array([((9, 4), ),\n", - " ((5, 4), ),\n", - " ((8, 0), )],\n", + "rec.array([((9, 4), ),\n", + " ((5, 4), ),\n", + " ((8, 0), )],\n", " dtype=[('cellids', 'O'), ('ixshapes', 'O')])" ] }, - "execution_count": 21, + "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "ixs = GridIntersect(sgr, method=\"structured\")\n", - "# pd.DataFrame(ixs.intersect_point(mp))\n", "ixs.intersect_point(mp)" ] }, @@ -654,12 +770,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## [Triangular Grid](#top)" + "## [Vertex Grid](#top)" ] }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 30, "metadata": {}, "outputs": [], "source": [ @@ -685,22 +801,22 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 23, + "execution_count": 31, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -726,7 +842,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 32, "metadata": {}, "outputs": [], "source": [ @@ -735,7 +851,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 33, "metadata": {}, "outputs": [], "source": [ @@ -744,12 +860,12 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 34, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -782,7 +898,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 35, "metadata": {}, "outputs": [], "source": [ @@ -791,12 +907,12 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 36, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -828,7 +944,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 37, "metadata": {}, "outputs": [], "source": [ @@ -837,18 +953,18 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "rec.array([(1, ((10.0, 10.0), (45.0, 45.0)), ),\n", - " (4, ((50.0, 0.0),), )],\n", + "rec.array([(1, ((10.0, 10.0), (45.0, 45.0)), ),\n", + " (4, ((50.0, 0.0),), )],\n", " dtype=[('cellids', 'O'), ('vertices', 'O'), ('ixshapes', 'O')])" ] }, - "execution_count": 30, + "execution_count": 38, "metadata": {}, "output_type": "execute_result" } @@ -859,12 +975,12 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 39, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -887,248 +1003,6 @@ " \n", "ax.legend([h2], [i.get_label() for i in [h2]], loc=\"best\");" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## [Tests](#top)\n", - "Tests are written for Points, LineStrings and Polygons for both rectangular (regular) grids, triangular grids, and rotated and offset regular grids." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "# !pytest --cov-report term --cov gridintersect ../../autotest/t065_test_gridintersect.py " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## [Timings](#top)\n", - "Comparing performance for the different methods in a large grid. Some helper functions are defined below" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "def ix_shapely_point(nrnc, npoints=100):\n", - " results = []\n", - " delc = 1000/nrnc * np.ones(nrnc, dtype=np.float)\n", - " delr = 1000/nrnc * np.ones(nrnc, dtype=np.float)\n", - " sgr = fgrid.StructuredGrid(delc, delr, top=None, botm=None)\n", - " ix = GridIntersect(sgr)\n", - " points = np.random.random((npoints, 2)) * 1000\n", - " for p in [Point(x, y) for x, y in points]:\n", - " results.append(ix.intersect_point(p))\n", - " return np.concatenate(results, axis=0)\n", - "\n", - "\n", - "def ix_structured_point(nrnc, npoints=100):\n", - " results = []\n", - " delc = 1000/nrnc * np.ones(nrnc, dtype=np.float)\n", - " delr = 1000/nrnc * np.ones(nrnc, dtype=np.float)\n", - " sgr = fgrid.StructuredGrid(delc, delr, top=None, botm=None)\n", - " ix = GridIntersect(sgr, method=\"structured\")\n", - " points = np.random.random((npoints, 2)) * 1000\n", - " for p in [Point(x, y) for x, y in points]:\n", - " results.append(ix.intersect_point(p))\n", - " return np.concatenate(results, axis=0)\n", - "\n", - "\n", - "def ix_shapely_linestring(nrnc, ls=None):\n", - " if ls is None:\n", - " ls = LineString([(0, 0), (nrnc/3, nrnc)])\n", - " delc = 1000/nrnc * np.ones(nrnc, dtype=np.float)\n", - " delr = 1000/nrnc * np.ones(nrnc, dtype=np.float)\n", - " sgr = fgrid.StructuredGrid(delc, delr, top=None, botm=None)\n", - " ix = GridIntersect(sgr)\n", - " return ix.intersect_linestring(ls)\n", - "\n", - "\n", - "def ix_structured_linestring(nrnc, ls=None):\n", - " if ls is None:\n", - " ls = LineString([(0, 0), (nrnc/3, nrnc)])\n", - " delc = 1000/nrnc * np.ones(nrnc, dtype=np.float)\n", - " delr = 1000/nrnc * np.ones(nrnc, dtype=np.float)\n", - " sgr = fgrid.StructuredGrid(delc, delr, top=None, botm=None)\n", - " ix = GridIntersect(sgr, method=\"structured\")\n", - " return ix.intersect_linestring(ls)\n", - "\n", - "\n", - "def ix_shapely_polygon(nrnc, p=Polygon([(10, 10), (540, 430), (730, 80), (250, 0)])):\n", - " delc = 1000/nrnc * np.ones(nrnc, dtype=np.float)\n", - " delr = 1000/nrnc * np.ones(nrnc, dtype=np.float)\n", - " sgr = fgrid.StructuredGrid(delc, delr, top=None, botm=None)\n", - " ix = GridIntersect(sgr)\n", - " return ix.intersect_polygon(p)\n", - "\n", - "\n", - "def ix_structured_polygon(nrnc, p=Polygon([(10, 10), (540, 430), (730, 80), (250, 0)])):\n", - " delc = 1000/nrnc * np.ones(nrnc, dtype=np.float)\n", - " delr = 1000/nrnc * np.ones(nrnc, dtype=np.float)\n", - " sgr = fgrid.StructuredGrid(delc, delr, top=None, botm=None)\n", - " ix = GridIntersect(sgr, method=\"structured\")\n", - " return ix.intersect_polygon(p)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Below are some results of `%timeit` runs. The listed times are for intersections in a 1000 x 1000 structured grid on a Intel Core i7 (8th gen). To keep the notebook running quickly in the autotests, the grid is currently set to 10 x 10. " - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [], - "source": [ - "# nrnc = 1000 # no rows and columns\n", - "nrnc = 10 # save time when testing notebook" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For point intersections, most of the time required by the shapely approach is needed to build the STR-tree (~15 s). Obviously, the pure numpy approach used in structured mode is unbeatable. Not having to build the STR-tree saves a significant amount of time for large grids." - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "18.9 ms ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)\n" - ] - } - ], - "source": [ - "%timeit -n 1 -r 1 ix_shapely_point(nrnc, npoints=100)" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "11.4 ms ± 516 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" - ] - } - ], - "source": [ - "%timeit ix_structured_point(nrnc, npoints=100)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For linestrings, following the linestring through the grid (in structured mode) reduces the amount of intersection calls by a significant amount. This is where the downside of the STR-tree query is obvious. The bounding box of the linestring covers about one third of the grid. The query only reduces the search-space by 2/3 leaving ~333k cells to try to intersect with. On top of the building of the STR-tree the intersection calls take another ~15 seconds.\n", - "\n", - "(Cutting the linestring into pieces would probably improve performance.)" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "6.53 ms ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)\n" - ] - } - ], - "source": [ - "%timeit -n 1 -r 1 ix_shapely_linestring(nrnc)" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "794 µs ± 37.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n" - ] - } - ], - "source": [ - "%timeit ix_structured_linestring(nrnc)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For Polygons the difference between structured mode and shapely mode is less obvious. Building the STR-tree (\\~15s) and doing the intersect (\\~20s) takes a little bit longer than performing the intersection in structured mode. However, note that intersecting with a second similarly sized polygon in shapely mode will only require ~20s, whereas in structured mode the required time will remain ~30 seconds. \n", - "\n", - "For repeated intersections with Polygons, the shapely method might be preferred over the structured method." - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "13.8 ms ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)\n" - ] - } - ], - "source": [ - "%timeit -n 1 -r 1 ix_shapely_polygon(nrnc)" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "13.3 ms ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)\n" - ] - } - ], - "source": [ - "%timeit -n 1 -r 1 ix_structured_polygon(nrnc)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { @@ -1147,9 +1021,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 4 -} +} \ No newline at end of file diff --git a/flopy/utils/__init__.py b/flopy/utils/__init__.py index 679e06989..c6ba87960 100644 --- a/flopy/utils/__init__.py +++ b/flopy/utils/__init__.py @@ -46,4 +46,4 @@ from .mtlistfile import MtListBudget from .optionblock import OptionBlock from .rasters import Raster -from .gridintersect import GridIntersect,ModflowGridIndices \ No newline at end of file +from .gridintersect import GridIntersect, ModflowGridIndices \ No newline at end of file diff --git a/flopy/utils/gridintersect.py b/flopy/utils/gridintersect.py index a6ac3f016..1df9aec0b 100644 --- a/flopy/utils/gridintersect.py +++ b/flopy/utils/gridintersect.py @@ -1,1293 +1,1477 @@ -import numpy as np - -try: - import matplotlib.pyplot as plt -except ModuleNotFoundError: - plt = None - print("matplotlib is needed for grid intersect operations! Please " + - "matplotlib if you need to use grid intersect functionality.") -from .geometry import transform - -try: - from shapely.geometry import (MultiPoint, Point, Polygon, box, - GeometryCollection) - from shapely.strtree import STRtree - from shapely.affinity import translate, rotate -except ModuleNotFoundError: - print("Shapely is needed for grid intersect operations! Please install " + - "shapely if you need to use grid intersect functionality.") - - -def parse_shapely_ix_result(collection, ix_result, shptyps=None): - """ - Recursive function for parsing shapely intersection results. - Returns a list of shapely shapes matching shptyp - - Parameters - ---------- - collection : list - state variable for storing result, generally - an empty list - ix_result : shapely.geometry type - any shapely intersection result - shptyp : str, list of str, or None, optional - if None (default), return all types of shapes. - if str, return shapes of that type, if list of str, - return all types in list - - Returns - ------- - collection : list - list containing shapely geometries of type shptyp - - """ - # convert shptyps to list if needed - if isinstance(shptyps, str): - shptyps = [shptyps] - elif shptyps is None: - shptyps = [None] - - # if empty - if ix_result.is_empty: - return collection - # base case: geom_type is partial or exact match to shptyp - elif ix_result.geom_type in shptyps: - collection.append(ix_result) - return collection - # recursion for collections - elif hasattr(ix_result, "geoms"): - for ishp in ix_result: - parse_shapely_ix_result(collection, ishp, shptyps=shptyps) - # if collecting all types - elif shptyps[0] is None: - return collection.append(ix_result) - return collection - - -class GridIntersect: - """ - Class for intersecting shapely shapes (Point, Linestring, Polygon, - or their Multi variants) with MODFLOW grids. Contains optimized search - routines for structured grids. - - Notes - ----- - - The STR-tree query is based on the bounding box of the shape or - collection, if the bounding box of the shape covers nearly the entire - grid, the query won't be able to limit the search space much resulting - in slower performance. Therefore, it is sometimes faster to intersect - each individual shape in a collection than it is to intersect with the - whole collection at once. - - Building the STRtree can take a while for large grids. Once built the - intersect routines (for individual shapes) should be pretty fast. - - The optimized routines for structured grids will generally outperform - the shapely routines because of the reduced overhead of building and - parsing the queried STR-tree. For Polygons, shapely is sometimes faster - than the optimized structured routines. - - """ - - def __init__(self, mfgrid, method="strtree"): - """ - Intersect shapes (Point, Linestring, Polygon) with a - modflow grid. - - Parameters - ---------- - mfgrid : flopy modflowgrid - MODFLOW grid as implemented in flopy - method : str, optional - either "strtree" which builds an STRTree (most flexible) - or "structured" which uses optimized methods that only work - for structured grids, by default "strtree" - - """ - - self.mfgrid = mfgrid - - if method == "strtree": - if mfgrid.grid_type == "structured": - self.gridshapes = self._rect_grid_to_shape_list() - elif mfgrid.grid_type == "unstructured": - raise NotImplementedError() - elif mfgrid.grid_type == "vertex": - self.gridshapes = self._vtx_grid_to_shape_list() - - self.strtree = STRtree(self.gridshapes) - - self.intersect_point = self._intersect_point_shapely - self.intersect_linestring = self._intersect_linestring_shapely - self.intersect_polygon = self._intersect_polygon_shapely - - elif method == "structured" and mfgrid.grid_type == "structured": - self.strtree = None - self.intersect_point = self._intersect_point_structured - self.intersect_linestring = self._intersect_linestring_structured - self.intersect_polygon = self._intersect_polygon_structured - - else: - raise NotImplementedError( - "Method 'structured' only works for structured grids.") - - def _rect_grid_to_shape_list(self): - """ - internal method, convert structured grid to list of - shapely polygons - - Returns - ------- - list - list of shapely Polygons - - """ - shplist = [] - for i in range(self.mfgrid.nrow): - for j in range(self.mfgrid.ncol): - xy = self.mfgrid.get_cell_vertices(i, j) - p = Polygon(xy) - p.name = (i, j) - shplist.append(p) - return shplist - - def _usg_grid_to_shape_list(self): - """ - internal method, convert unstructred grid to list of shapely - polygons - - Returns - ------- - list - list of shapely Polygons - """ - raise NotImplementedError() - - def _vtx_grid_to_shape_list(self): - """ - internal method, convert vertex grid to list of shapely polygons - - Returns - ------- - list - list of shapely Polygons - - """ - - shplist = [] - if isinstance(self.mfgrid._cell2d, np.recarray): - for icell in self.mfgrid._cell2d.icell2d: - points = [] - icverts = ["icvert_{}".format(i) for i in - range(self.mfgrid._cell2d["ncvert"][icell])] - for iv in self.mfgrid._cell2d[icverts][icell]: - points.append((self.mfgrid._vertices.xv[iv], - self.mfgrid._vertices.yv[iv])) - # close the polygon, if necessary - if points[0] != points[-1]: - points.append(points[0]) - p = Polygon(points) - p.name = icell - shplist.append(p) - elif isinstance(self.mfgrid._cell2d, list): - for icell in range(len(self.mfgrid._cell2d)): - points = [] - for iv in self.mfgrid._cell2d[icell][-3:]: - points.append((self.mfgrid._vertices[iv][1], - self.mfgrid._vertices[iv][2])) - # close the polygon, if necessary - if points[0] != points[-1]: - points.append(points[0]) - p = Polygon(points) - p.name = icell - shplist.append(p) - return shplist - - @staticmethod - def _sort_strtree_result(shapelist): - """ - internal method, sort strtree query result by node id - - Parameters - ---------- - shapelist : list - list of shapely Polygons - - Returns - ------- - list - sorted list of Polygons - - """ - - def sort_key(o): - return o.name - - shapelist.sort(key=sort_key) - return shapelist - - def _intersect_point_shapely(self, shp, sort_by_cellid=True): - """ - intersect grid with Point or MultiPoint - - Parameters - ---------- - shp : Point or MultiPoint - shapely Point or MultiPoint to intersect with grid. Note, - it is generally faster to loop over a MultiPoint and intersect - per point than to intersect a MultiPoint directly. - sort_by_cellid : bool, optional - flag whether to sort cells by id, used to ensure node - with lowest id is returned, by default True - - Returns - ------- - numpy.recarray - a record array containing information about the intersection - - """ - ixshapes = self.strtree.query(shp) - if sort_by_cellid: - ixshapes = self._sort_strtree_result(ixshapes) - - isectshp = [] - cellids = [] - vertices = [] - parsed_points = [] # for keeping track of points - - # loop over cells returned by spatial query - for r in ixshapes: - # do intersection - intersect = shp.intersection(r) - # parse result per Point - collection = parse_shapely_ix_result( - [], intersect, shptyps=["Point"]) - # loop over intersection result and store information - cell_verts = [] - cell_shps = [] - for c in collection: - verts = c.__geo_interface__["coordinates"] - # avoid returning multiple cells for points on boundaries - if verts in parsed_points: - continue - parsed_points.append(verts) - cell_shps.append(c) # collect only new points - cell_verts.append(verts) - # if any new ix found - if len(cell_shps) > 0: - # combine new points in MultiPoint - isectshp.append(MultiPoint(cell_shps) if len(cell_shps) > 1 - else cell_shps[0]) - vertices.append(tuple(cell_verts)) - cellids.append(r.name) - - rec = np.recarray(len(isectshp), - names=["cellids", "vertices", "ixshapes"], - formats=["O", "O", "O"]) - rec.ixshapes = isectshp - rec.vertices = vertices - rec.cellids = cellids - - return rec - - def _intersect_linestring_shapely(self, shp, keepzerolengths=False, - sort_by_cellid=True): - """ - intersect with LineString or MultiLineString - - Parameters - ---------- - shp : shapely.geometry.LineString or MultiLineString - LineString to intersect with the grid - keepzerolengths : bool, optional - keep linestrings with length zero, default is False - sort_by_cellid : bool, optional - flag whether to sort cells by id, used to ensure node - with lowest id is returned, by default True - - Returns - ------- - numpy.recarray - a record array containing information about the intersection - - """ - result = self.strtree.query(shp) - if sort_by_cellid: - result = self._sort_strtree_result(result) - - # initialize empty lists for storing results - isectshp = [] - cellids = [] - vertices = [] - lengths = [] - - # loop over cells returned by spatial query - for r in result: - # do intersection - intersect = shp.intersection(r) - # parse result - collection = parse_shapely_ix_result( - [], intersect, shptyps=["LineString", "MultiLineString"]) - # loop over intersection result and store information - for c in collection: - verts = c.__geo_interface__["coordinates"] - # test if linestring was already processed (if on boundary) - if verts in vertices: - continue - # if keep zero don't check length - if not keepzerolengths: - if c.length == 0.: - continue - isectshp.append(c) - lengths.append(c.length) - vertices.append(verts) - cellids.append(r.name) - - rec = np.recarray(len(isectshp), - names=["cellids", "vertices", "lengths", "ixshapes"], - formats=["O", "O", "f8", "O"]) - rec.ixshapes = isectshp - rec.vertices = vertices - rec.lengths = lengths - rec.cellids = cellids - - return rec - - def _intersect_polygon_shapely(self, shp, sort_by_cellid=True): - """ - intersect with Polygon or MultiPolygon - - Parameters - ---------- - shp : shapely.geometry.Polygon or MultiPolygon - shape to intersect with the grid - sort_by_cellid : bool, optional - flag whether to sort cells by id, used to ensure node - with lowest id is returned, by default True - - Returns - ------- - numpy.recarray - a record array containing information about the intersection - - """ - ixshapes = self.strtree.query(shp) - if sort_by_cellid: - ixshapes = self._sort_strtree_result(ixshapes) - - isectshp = [] - cellids = [] - vertices = [] - areas = [] - - # loop over cells returned by spatial query - for r in ixshapes: - # do intersection - intersect = shp.intersection(r) - # parse result - collection = parse_shapely_ix_result( - [], intersect, shptyps=["Polygon", "MultiPolygon"]) - # loop over intersection result and store information - for c in collection: - # don't store intersections with 0 area - if c.area == 0.: - continue - verts = c.__geo_interface__["coordinates"] - isectshp.append(c) - areas.append(c.area) - vertices.append(verts) - cellids.append(r.name) - - rec = np.recarray(len(isectshp), - names=["cellids", "vertices", "areas", "ixshapes"], - formats=["O", "O", "f8", "O"]) - rec.ixshapes = isectshp - rec.vertices = vertices - rec.areas = areas - rec.cellids = cellids - - return rec - - def _intersect_point_structured(self, shp): - """ - intersection method for intersecting points with structured grids - - Parameters - ---------- - shp : shapely.geometry.Point or MultiPoint - point shape to intersect with grid - - Returns - ------- - numpy.recarray - a record array containing information about the intersection - - """ - nodelist = [] - - Xe, Ye = self.mfgrid.xyedges - - try: - iter(shp) - except TypeError: - shp = [shp] - - ixshapes = [] - for p in shp: - # if grid is rotated or offset transform point to local coords - if (self.mfgrid.angrot != 0. or self.mfgrid.xoffset != 0. - or self.mfgrid.yoffset != 0.): - rx, ry = transform(p.x, p.y, self.mfgrid.xoffset, - self.mfgrid.yoffset, - self.mfgrid.angrot_radians, - inverse=True) - else: - rx = p.x - ry = p.y - - # two dimensional point - jpos = ModflowGridIndices.find_position_in_array(Xe, rx) - ipos = ModflowGridIndices.find_position_in_array(Ye, ry) - - if jpos is not None and ipos is not None: - nodelist.append((ipos, jpos)) - ixshapes.append(p) - - # three dimensional point - if p._ndim == 3: - # find k - kpos = ModflowGridIndices.find_position_in_array( - self.mfgrid.botm[:, ipos, jpos], p.z) - if kpos is not None: - nodelist.append((kpos, ipos, jpos)) - - # remove duplicates - tempnodes = [] - tempshapes = [] - for node, ixs in zip(nodelist, ixshapes): - if node not in tempnodes: - tempnodes.append(node) - tempshapes.append(ixs) - else: - # TODO: not sure if this is correct - tempshapes[-1] = MultiPoint([tempshapes[-1], ixs]) - - ixshapes = tempshapes - nodelist = tempnodes - - rec = np.recarray(len(nodelist), names=["cellids", "ixshapes"], - formats=["O", "O"]) - rec.cellids = nodelist - rec.ixshapes = ixshapes - return rec - - def _intersect_linestring_structured(self, shp, keepzerolengths=False): - """ - method for intersecting linestrings with structured grids - - Parameters - ---------- - shp : shapely.geometry.Linestring or MultiLineString - linestring to intersect with grid - keepzerolengths : bool, optional - if True keep intersection results with length=0, in - other words, grid cells the linestring does not cross - but does touch, by default False - - Returns - ------- - numpy.recarray - a record array containing information about the intersection - - """ - # get local extent of grid - if (self.mfgrid.angrot != 0. or self.mfgrid.xoffset != 0. - or self.mfgrid.yoffset != 0.): - xmin = np.min(self.mfgrid.xyedges[0]) - xmax = np.max(self.mfgrid.xyedges[0]) - ymin = np.min(self.mfgrid.xyedges[1]) - ymax = np.max(self.mfgrid.xyedges[1]) - else: - xmin, xmax, ymin, ymax = self.mfgrid.extent - pl = box(xmin, ymin, xmax, ymax) - - # rotate and translate linestring to local coords - if (self.mfgrid.xoffset != 0. or self.mfgrid.yoffset != 0.): - shp = translate(shp, xoff=-self.mfgrid.xoffset, - yoff=-self.mfgrid.yoffset) - if self.mfgrid.angrot != 0.: - shp = rotate(shp, -self.mfgrid.angrot, origin=(0., 0.)) - - # clip line to mfgrid bbox - lineclip = shp.intersection(pl) - - if lineclip.length == 0.: # linestring does not intersect modelgrid - return np.recarray(0, names=["cellids", "vertices", - "lengths", "ixshapes"], - formats=["O", "O", "f8", "O"]) - if lineclip.geom_type is 'MultiLineString': # there are multiple lines - nodelist, lengths, vertices = [], [], [] - ixshapes = [] - for ls in lineclip: - n, l, v, ix = self._get_nodes_intersecting_linestring(ls) - nodelist += n - lengths += l - # if necessary, transform coordinates back to real - # world coordinates - if (self.mfgrid.angrot != 0. or self.mfgrid.xoffset != 0. - or self.mfgrid.yoffset != 0.): - v_realworld = [] - for pt in v: - rx, ry = transform([pt[0]], [pt[1]], - self.mfgrid.xoffset, - self.mfgrid.yoffset, - self.mfgrid.angrot_radians, - inverse=False) - v_realworld.append([rx, ry]) - ix_realworld = rotate( - ix, self.mfgrid.angrot, origin=(0., 0.)) - ix_realworld = translate( - ix_realworld, self.mfgrid.xoffset, self.mfgrid.yoffset) - else: - v_realworld = v - ix_realworld = ix - vertices += v_realworld - ixshapes += ix_realworld - else: # linestring is fully within grid - nodelist, lengths, vertices, ixshapes = \ - self._get_nodes_intersecting_linestring( - lineclip) - # if necessary, transform coordinates back to real - # world coordinates - if (self.mfgrid.angrot != 0. or self.mfgrid.xoffset != 0. - or self.mfgrid.yoffset != 0.): - v_realworld = [] - for pt in vertices: - rx, ry = transform([pt[0]], [pt[1]], self.mfgrid.xoffset, - self.mfgrid.yoffset, - self.mfgrid.angrot_radians, - inverse=False) - v_realworld.append([rx, ry]) - vertices = v_realworld - - ix_shapes_realworld = [] - for ixs in ixshapes: - ixs = rotate(ixs, self.mfgrid.angrot, origin=(0., 0.)) - ixs = translate(ixs, self.mfgrid.xoffset, - self.mfgrid.yoffset) - ix_shapes_realworld.append(ixs) - ixshapes = ix_shapes_realworld - - # bundle linestrings in same cell - tempnodes = [] - templengths = [] - tempverts = [] - tempshapes = [] - unique_nodes = list(set(nodelist)) - if len(unique_nodes) < len(nodelist): - for inode in unique_nodes: - templengths.append( - sum([l for l, i in zip(lengths, nodelist) if i == inode])) - tempverts.append( - [v for v, i in zip(vertices, nodelist) if i == inode]) - tempshapes.append( - [ix for ix, i in zip(ixshapes, nodelist) if i == inode]) - - nodelist = unique_nodes - lengths = templengths - vertices = tempverts - ixshapes = tempshapes - - # eliminate any nodes that have a zero length - if not keepzerolengths: - tempnodes = [] - templengths = [] - tempverts = [] - tempshapes = [] - for i, _ in enumerate(nodelist): - if lengths[i] > 0: - tempnodes.append(nodelist[i]) - templengths.append(lengths[i]) - tempverts.append(vertices[i]) - tempshapes.append(ixshapes[i]) - nodelist = tempnodes - lengths = templengths - vertices = tempverts - ixshapes = tempshapes - - rec = np.recarray(len(nodelist), - names=["cellids", "vertices", "lengths", "ixshapes"], - formats=["O", "O", "f8", "O"]) - rec.vertices = vertices - rec.lengths = lengths - rec.cellids = nodelist - rec.ixshapes = ixshapes - - return rec - - def _get_nodes_intersecting_linestring(self, linestring): - """ - helper function, intersect the linestring with the a structured - grid and return a list of node indices and the length of the - line in that node. - - Parameters - ---------- - linestring: shapely.geometry.LineString or MultiLineString - shape to intersect with the grid - - Returns - ------- - nodelist, lengths, vertices: lists - lists containing node ids, lengths of intersects and the - start and end points of the intersects - - """ - nodelist = [] - lengths = [] - vertices = [] - ixshapes = [] - - # start at the beginning of the line - x, y = linestring.xy - - # linestring already in local coords but - # because intersect_point does transform again - # we transform back to real world here if necessary - if (self.mfgrid.angrot != 0. or self.mfgrid.xoffset != 0. - or self.mfgrid.yoffset != 0.): - x0, y0 = transform([x[0]], [y[0]], self.mfgrid.xoffset, - self.mfgrid.yoffset, self.mfgrid.angrot_radians, - inverse=False) - else: - x0 = [x[0]] - y0 = [y[0]] - - (i, j) = self.intersect_point(Point(x0[0], y0[0])).cellids[0] - Xe, Ye = self.mfgrid.xyedges - xmin = Xe[j] - xmax = Xe[j + 1] - ymax = Ye[i] - ymin = Ye[i + 1] - pl = box(xmin, ymin, xmax, ymax) - intersect = linestring.intersection(pl) - # if linestring starts in cell, exits, and re-enters - # a MultiLineString is returned. - ixshapes.append(intersect) - length = intersect.length - lengths.append(length) - if intersect.geom_type == "MultiLineString": - x, y = [], [] - for igeom in intersect.geoms: - x.append(igeom.xy[0]) - y.append(igeom.xy[1]) - x = np.concatenate(x) - y = np.concatenate(y) - else: - x = intersect.xy[0] - y = intersect.xy[1] - verts = [(ixy[0], ixy[1]) for ixy in zip(x, y)] - vertices.append(verts) - nodelist.append((i, j)) - - n = 0 - while True: - (i, j) = nodelist[n] - node, length, verts, ixshape = \ - self._check_adjacent_cells_intersecting_line( - linestring, (i, j), nodelist) - - for inode, ilength, ivert, ix in zip(node, length, verts, ixshape): - if inode is not None: - if ivert not in vertices: - nodelist.append(inode) - lengths.append(ilength) - vertices.append(ivert) - ixshapes.append(ix) - - if n == len(nodelist) - 1: - break - n += 1 - - return nodelist, lengths, vertices, ixshapes - - def _check_adjacent_cells_intersecting_line(self, linestring, i_j, - nodelist): - """ - helper method that follows a line through a structured grid - - Parameters - ---------- - linestring : shapely.geometry.LineString - shape to intersect with the grid - i_j : tuple - tuple containing (nrow, ncol) - nodelist : list of tuples - list of node ids that have already been added - as intersections - - Returns - ------- - node, length, verts: lists - lists containing nodes, lengths and vertices of - intersections with adjacent cells relative to the - current cell (i, j) - - """ - i, j = i_j - - Xe, Ye = self.mfgrid.xyedges - - node = [] - length = [] - verts = [] - ixshape = [] - - # check to left - if j > 0: - ii = i - jj = j - 1 - if (ii, jj) not in nodelist: - xmin = Xe[jj] - xmax = Xe[jj + 1] - ymax = Ye[ii] - ymin = Ye[ii + 1] - pl = box(xmin, ymin, xmax, ymax) - if linestring.intersects(pl): - intersect = linestring.intersection(pl) - ixshape.append(intersect) - length.append(intersect.length) - if intersect.geom_type == "MultiLineString": - x, y = [], [] - for igeom in intersect.geoms: - x.append(igeom.xy[0]) - y.append(igeom.xy[1]) - x = np.concatenate(x) - y = np.concatenate(y) - else: - x = intersect.xy[0] - y = intersect.xy[1] - verts.append([(ixy[0], ixy[1]) - for ixy in zip(*intersect.xy)]) - node.append((ii, jj)) - - # check to right - if j < self.mfgrid.ncol - 1: - ii = i - jj = j + 1 - if (ii, jj) not in nodelist: - xmin = Xe[jj] - xmax = Xe[jj + 1] - ymax = Ye[ii] - ymin = Ye[ii + 1] - pl = box(xmin, ymin, xmax, ymax) - if linestring.intersects(pl): - intersect = linestring.intersection(pl) - ixshape.append(intersect) - length.append(intersect.length) - if intersect.geom_type == "MultiLineString": - x, y = [], [] - for igeom in intersect.geoms: - x.append(igeom.xy[0]) - y.append(igeom.xy[1]) - x = np.concatenate(x) - y = np.concatenate(y) - else: - x = intersect.xy[0] - y = intersect.xy[1] - verts.append([(ixy[0], ixy[1]) - for ixy in zip(*intersect.xy)]) - node.append((ii, jj)) - - # check to back - if i > 0: - ii = i - 1 - jj = j - if (ii, jj) not in nodelist: - xmin = Xe[jj] - xmax = Xe[jj + 1] - ymax = Ye[ii] - ymin = Ye[ii + 1] - pl = box(xmin, ymin, xmax, ymax) - if linestring.intersects(pl): - intersect = linestring.intersection(pl) - ixshape.append(intersect) - length.append(intersect.length) - if intersect.geom_type == "MultiLineString": - x, y = [], [] - for igeom in intersect.geoms: - x.append(igeom.xy[0]) - y.append(igeom.xy[1]) - x = np.concatenate(x) - y = np.concatenate(y) - else: - x = intersect.xy[0] - y = intersect.xy[1] - verts.append([(ixy[0], ixy[1]) for ixy in - zip(*intersect.xy)]) - node.append((ii, jj)) - - # check to front - if i < self.mfgrid.nrow - 1: - ii = i + 1 - jj = j - if (ii, jj) not in nodelist: - xmin = Xe[jj] - xmax = Xe[jj + 1] - ymax = Ye[ii] - ymin = Ye[ii + 1] - pl = box(xmin, ymin, xmax, ymax) - if linestring.intersects(pl): - intersect = linestring.intersection(pl) - ixshape.append(intersect) - length.append(intersect.length) - if intersect.geom_type == "MultiLineString": - x, y = [], [] - for igeom in intersect.geoms: - x.append(igeom.xy[0]) - y.append(igeom.xy[1]) - x = np.concatenate(x) - y = np.concatenate(y) - else: - x = intersect.xy[0] - y = intersect.xy[1] - verts.append([(ixy[0], ixy[1]) for ixy in zip(x, y)]) - node.append((ii, jj)) - - return node, length, verts, ixshape - - def _intersect_rectangle_structured(self, rectangle): - """ - intersect a rectangle with a structured grid to retrieve - node ids of intersecting grid cells. - - Note: only works in local coordinates (i.e. non-rotated grid - with origin at (0, 0)) - - Parameters - ---------- - rectangle : list of tuples - list of lower-left coordinate and upper-right - coordinate: [(xmin, ymin), (xmax, ymax)] - - Returns - ------- - nodelist: list of tuples - list of tuples containing node ids with which - the rectangle intersects - - """ - - nodelist = [] - - # return if rectangle does not contain any cells - if (self.mfgrid.angrot != 0. or self.mfgrid.xoffset != 0. - or self.mfgrid.yoffset != 0.): - minx = np.min(self.mfgrid.xyedges[0]) - maxx = np.max(self.mfgrid.xyedges[0]) - miny = np.min(self.mfgrid.xyedges[1]) - maxy = np.max(self.mfgrid.xyedges[1]) - local_extent = [minx, maxx, miny, maxy] - else: - local_extent = self.mfgrid.extent - - xmin, xmax, ymin, ymax = local_extent - bgrid = box(xmin, ymin, xmax, ymax) - (rxmin, rymin), (rxmax, rymax) = rectangle - b = box(rxmin, rymin, rxmax, rymax) - - if not b.intersects(bgrid): - # return with nodelist as an empty list - return [] - - Xe, Ye = self.mfgrid.xyedges - - jmin = ModflowGridIndices.find_position_in_array(Xe, xmin) - if jmin is None: - if xmin <= Xe[0]: - jmin = 0 - elif xmin >= Xe[-1]: - jmin = self.mfgrid.ncol - 1 - - jmax = ModflowGridIndices.find_position_in_array(Xe, xmax) - if jmax is None: - if xmax <= Xe[0]: - jmax = 0 - elif xmax >= Xe[-1]: - jmax = self.mfgrid.ncol - 1 - - imin = ModflowGridIndices.find_position_in_array(Ye, ymax) - if imin is None: - if ymax >= Ye[0]: - imin = 0 - elif ymax <= Ye[-1]: - imin = self.mfgrid.nrow - 1 - - imax = ModflowGridIndices.find_position_in_array(Ye, ymin) - if imax is None: - if ymin >= Ye[0]: - imax = 0 - elif ymin <= Ye[-1]: - imax = self.mfgrid.nrow - 1 - - for i in range(imin, imax + 1): - for j in range(jmin, jmax + 1): - nodelist.append((i, j)) - - return nodelist - - def _intersect_polygon_structured(self, shp): - """ - intersect polygon with a structured grid. Uses - bounding box of the Polygon to limit search space. - - Parameters - ---------- - shp : shapely.geometry.Polygon - polygon to intersect with the grid - - Returns - ------- - numpy.recarray - a record array containing information about the intersection - - """ - - # initialize the result lists - nodelist = [] - areas = [] - vertices = [] - ixshapes = [] - - # transform polygon to local grid coordinates - if (self.mfgrid.xoffset != 0. or self.mfgrid.yoffset != 0.): - shp = translate(shp, xoff=-self.mfgrid.xoffset, - yoff=-self.mfgrid.yoffset) - if self.mfgrid.angrot != 0.: - shp = rotate(shp, -self.mfgrid.angrot, origin=(0., 0.)) - - # use the bounds of the polygon to restrict the cell search - minx, miny, maxx, maxy = shp.bounds - rectangle = ((minx, miny), (maxx, maxy)) - nodes = self._intersect_rectangle_structured(rectangle) - - for (i, j) in nodes: - if (self.mfgrid.angrot != 0. or self.mfgrid.xoffset != 0. - or self.mfgrid.yoffset != 0.): - cell_coords = [(self.mfgrid.xyedges[0][j], - self.mfgrid.xyedges[1][i]), - (self.mfgrid.xyedges[0][j + 1], - self.mfgrid.xyedges[1][i]), - (self.mfgrid.xyedges[0][j + 1], - self.mfgrid.xyedges[1][i + 1]), - (self.mfgrid.xyedges[0][j], - self.mfgrid.xyedges[1][i + 1])] - else: - cell_coords = self.mfgrid.get_cell_vertices(i, j) - node_polygon = Polygon(cell_coords) - if shp.intersects(node_polygon): - intersect = shp.intersection(node_polygon) - if intersect.area > 0.: - nodelist.append((i, j)) - areas.append(intersect.area) - - # if necessary, transform coordinates back to real - # world coordinates - if (self.mfgrid.angrot != 0. or self.mfgrid.xoffset != 0. - or self.mfgrid.yoffset != 0.): - v_realworld = [] - for pt in intersect.__geo_interface__["coordinates"]: - rx, ry = transform([pt[0]], [pt[1]], - self.mfgrid.xoffset, - self.mfgrid.yoffset, - self.mfgrid.angrot_radians, - inverse=False) - v_realworld.append([rx, ry]) - intersect_realworld = rotate(intersect, - self.mfgrid.angrot, - origin=(0., 0.)) - intersect_realworld = translate(intersect_realworld, - self.mfgrid.xoffset, - self.mfgrid.yoffset) - else: - v_realworld = intersect.__geo_interface__[ - "coordinates"] - intersect_realworld = intersect - ixshapes.append(intersect_realworld) - vertices.append(v_realworld) - - rec = np.recarray(len(nodelist), - names=["cellids", "vertices", "areas", "ixshapes"], - formats=["O", "O", "f8", "O"]) - rec.vertices = vertices - rec.areas = areas - rec.cellids = nodelist - rec.ixshapes = ixshapes - - return rec - - @staticmethod - def plot_polygon(rec, ax=None, **kwargs): - """ - method to plot the polygon intersection results from - the resulting numpy.recarray. - - Note: only works when recarray has 'intersects' column! - - Parameters - ---------- - rec : numpy.recarray - record array containing intersection results - (the resulting shapes) - ax : matplotlib.pyplot.axes, optional - axes to plot onto, if not provided, creates a new figure - **kwargs: - passed to the plot function - - Returns - ------- - ax: matplotlib.pyplot.axes - returns the axes handle - - """ - try: - from descartes import PolygonPatch - except ModuleNotFoundError: - msg = 'descartes package needed for plotting polygons' - if plt is None: - msg = 'matplotlib and descartes packages needed for ' + \ - 'plotting polygons' - raise ModuleNotFoundError(msg) - - if plt is None: - msg = 'matplotlib package needed for plotting polygons' - raise ModuleNotFoundError(msg) - - if ax is None: - _, ax = plt.subplots() - - for i, ishp in enumerate(rec.ixshapes): - ppi = PolygonPatch(ishp, facecolor="C{}".format(i % 10), **kwargs) - ax.add_patch(ppi) - - return ax - - @staticmethod - def plot_linestring(rec, ax=None, **kwargs): - """ - method to plot the linestring intersection results from - the resulting numpy.recarray. - - Note: only works when recarray has 'intersects' column! - - Parameters - ---------- - rec : numpy.recarray - record array containing intersection results - (the resulting shapes) - ax : matplotlib.pyplot.axes, optional - axes to plot onto, if not provided, creates a new figure - **kwargs: - passed to the plot function - - Returns - ------- - ax: matplotlib.pyplot.axes - returns the axes handle - - """ - if plt is None: - msg = 'matplotlib package needed for plotting polygons' - raise ModuleNotFoundError(msg) - - if ax is None: - _, ax = plt.subplots() - - for i, ishp in enumerate(rec.ixshapes): - if ishp.type == "MultiLineString": - for part in ishp: - ax.plot(part.xy[0], part.xy[1], ls="-", - c="C{}".format(i % 10), **kwargs) - else: - ax.plot(ishp.xy[0], ishp.xy[1], ls="-", - c="C{}".format(i % 10), **kwargs) - - return ax - - @staticmethod - def plot_point(rec, ax=None, **kwargs): - """ - method to plot the point intersection results from - the resulting numpy.recarray. - - Note: only works when recarray has 'intersects' column! - - Parameters - ---------- - rec : numpy.recarray - record array containing intersection results - ax : matplotlib.pyplot.axes, optional - axes to plot onto, if not provided, creates a new figure - **kwargs: - passed to the scatter function - - Returns - ------- - ax: matplotlib.pyplot.axes - returns the axes handle - - """ - if plt is None: - msg = 'matplotlib package needed for plotting polygons' - raise ModuleNotFoundError(msg) - - if ax is None: - _, ax = plt.subplots() - - x, y = [], [] - geo_coll = GeometryCollection(list(rec.ixshapes)) - collection = parse_shapely_ix_result([], geo_coll, ["Point"]) - for c in collection: - x.append(c.x) - y.append(c.y) - ax.scatter(x, y, **kwargs) - - return ax - - -class ModflowGridIndices: - """ - Collection of methods that can be used to find cell indices for a - structured, but irregularly spaced MODFLOW grid. - """ - - @staticmethod - def find_position_in_array(arr, x): - """ - If arr has x positions for the left edge of a cell, then - return the cell index containing x. - - Parameters - ---------- - arr : A one dimensional array (such as Xe) that contains - coordinates for the left cell edge. - - x : float - The x position to find in arr. - - """ - jpos = None - - if x == arr[-1]: - return len(arr) - 2 - - if x < min(arr[0], arr[-1]): - return None - - if x > max(arr[0], arr[-1]): - return None - - # go through each position - for j in range(len(arr) - 1): - xl = arr[j] - xr = arr[j + 1] - frac = (x - xl) / (xr - xl) - if 0. <= frac <= 1.0: - # if min(xl, xr) <= x < max(xl, xr): - jpos = j - return jpos - - return jpos - - @staticmethod - def kij_from_nodenumber(nodenumber, nlay, nrow, ncol): - """ - Convert the modflow node number to a zero-based layer, row and column - format. Return (k0, i0, j0). - - Parameters - ---------- - nodenumber: int - The cell nodenumber, ranging from 1 to number of - nodes. - nlay: int - The number of layers. - nrow: int - The number of rows. - ncol: int - The number of columns. - - """ - if nodenumber > nlay * nrow * ncol: - raise Exception('Error in function kij_from_nodenumber...') - n = nodenumber - 1 - k = int(n / nrow / ncol) - i = int((n - k * nrow * ncol) / ncol) - j = n - k * nrow * ncol - i * ncol - return (k, i, j) - - @staticmethod - def nodenumber_from_kij(k, i, j, nrow, ncol): - """ - Calculate the nodenumber using the zero-based layer, row, and column - values. The first node has a value of 1. - - Parameters - ---------- - k : int - The model layer number as a zero-based value. - i : int - The model row number as a zero-based value. - j : int - The model column number as a zero-based value. - nrow : int - The number of model rows. - ncol : int - The number of model columns. - """ - return k * nrow * ncol + i * ncol + j + 1 - - @staticmethod - def nn0_from_kij(k, i, j, nrow, ncol): - """ - Calculate the zero-based nodenumber using the zero-based layer, row, - and column values. The first node has a value of 0. - - Parameters - ---------- - k : int - The model layer number as a zero-based value. - i : int - The model row number as a zero-based value. - j : int - The model column number as a zero-based value. - nrow : int - The number of model rows. - ncol : int - The number of model columns. - """ - return k * nrow * ncol + i * ncol + j - - @staticmethod - def kij_from_nn0(n, nlay, nrow, ncol): - """ - Convert the node number to a zero-based layer, row and column - format. Return (k0, i0, j0). - - Parameters - ---------- - nodenumber : int - The cell nodenumber, ranging from 0 to number of - nodes - 1. - nlay : int - The number of layers. - nrow : int - The number of rows. - ncol : int - The number of columns. - - """ - if n > nlay * nrow * ncol: - raise Exception('Error in function kij_from_nodenumber...') - k = int(n / nrow / ncol) - i = int((n - k * nrow * ncol) / ncol) - j = n - k * nrow * ncol - i * ncol - return (k, i, j) +import numpy as np +try: + import matplotlib.pyplot as plt +except ModuleNotFoundError: + plt = None + +from .geometry import transform + +try: + from shapely.geometry import (MultiPoint, Point, Polygon, box, + GeometryCollection) + from shapely.strtree import STRtree + from shapely.affinity import translate, rotate + from shapely.prepared import prep + shply = True +except ModuleNotFoundError: + shply = False + + +def parse_shapely_ix_result(collection, ix_result, shptyps=None): + """Recursive function for parsing shapely intersection results. Returns a + list of shapely shapes matching shptyp. + + Parameters + ---------- + collection : list + state variable for storing result, generally + an empty list + ix_result : shapely.geometry type + any shapely intersection result + shptyp : str, list of str, or None, optional + if None (default), return all types of shapes. + if str, return shapes of that type, if list of str, + return all types in list + + Returns + ------- + collection : list + list containing shapely geometries of type shptyp + """ + # convert shptyps to list if needed + if isinstance(shptyps, str): + shptyps = [shptyps] + elif shptyps is None: + shptyps = [None] + + # if empty + if ix_result.is_empty: + return collection + # base case: geom_type is partial or exact match to shptyp + elif ix_result.geom_type in shptyps: + collection.append(ix_result) + return collection + # recursion for collections + elif hasattr(ix_result, "geoms"): + for ishp in ix_result: + parse_shapely_ix_result(collection, ishp, shptyps=shptyps) + # if collecting all types + elif shptyps[0] is None: + return collection.append(ix_result) + return collection + + +class GridIntersect: + """Class for intersecting shapely shapes (Point, Linestring, Polygon, or + their Multi variants) with MODFLOW grids. Contains optimized search + routines for structured grids. + + Notes + ----- + - The STR-tree query is based on the bounding box of the shape or + collection, if the bounding box of the shape covers nearly the entire + grid, the query won't be able to limit the search space much, resulting + in slower performance. Therefore, it can sometimes be faster to + intersect each individual shape in a collection than it is to intersect + with the whole collection at once. + - Building the STR-tree can take a while for large grids. Once built the + intersect routines (for individual shapes) should be pretty fast. It + is possible to perform intersects without building the STR-tree by + setting `rtree=False`. + - The optimized routines for structured grids will often outperform + the shapely routines because of the reduced overhead of building and + parsing the STR-tree. However, for polygons the STR-tree implementation + is often faster than the optimized structured routines, especially + for larger grids. + """ + + def __init__(self, mfgrid, method=None, rtree=True): + """Intersect shapes (Point, Linestring, Polygon) with a modflow grid. + + Parameters + ---------- + mfgrid : flopy modflowgrid + MODFLOW grid as implemented in flopy + method : str, optional + default is None, which determines intersection method based on + the grid type. Options are either 'vertex' which uses shapely + interesection operations or 'structured' which uses optimized + methods that only work for structured grids + rtree : bool, optional + whether to build an STR-Tree, default is True. If False no + STR-tree is built (which saves some time), but intersects will + loop through all model gridcells (which is generally slower). + Only read when `method='vertex'`. + """ + if not shply: + msg = ("Shapely is needed for grid intersect operations! " + "Please install shapely if you need to use grid intersect " + "functionality.") + raise ModuleNotFoundError(msg) + + self.mfgrid = mfgrid + if method is None: + # determine method from grid_type + self.method = self.mfgrid.grid_type + else: + # set method + self.method = method + self.rtree = rtree + + if self.method == "vertex": + # set method to get gridshapes depending on grid type + self._set_method_get_gridshapes() + + # build STR-tree if specified + if self.rtree: + self.strtree = STRtree(self._get_gridshapes()) + + # set interesection methods + self.intersect_point = self._intersect_point_shapely + self.intersect_linestring = self._intersect_linestring_shapely + self.intersect_polygon = self._intersect_polygon_shapely + + elif self.method == "structured" and mfgrid.grid_type == "structured": + self.intersect_point = self._intersect_point_structured + self.intersect_linestring = self._intersect_linestring_structured + self.intersect_polygon = self._intersect_polygon_structured + + else: + raise NotImplementedError( + "Method '{0}' not recognized!".format) + + def _set_method_get_gridshapes(self): + """internal method, set self._get_gridshapes to the certain method for + obtaining gridcells.""" + # Set method for obtaining grid shapes + if self.mfgrid.grid_type == "structured": + self._get_gridshapes = self._rect_grid_to_shape_generator + elif self.mfgrid.grid_type == "vertex": + self._get_gridshapes = self._vtx_grid_to_shape_generator + elif self.mfgrid.grid_type == "unstructured": + raise NotImplementedError() + + def _rect_grid_to_shape_generator(self): + """internal method, generator yielding shapely polygons for structured + grid cells. + + Returns + ------- + generator : + generator of shapely Polygons + """ + for i in range(self.mfgrid.nrow): + for j in range(self.mfgrid.ncol): + xy = self.mfgrid.get_cell_vertices(i, j) + p = Polygon(xy) + p.name = (i, j) + yield p + + def _usg_grid_to_shape_generator(self): + """internal method, convert unstructred grid to list of shapely + polygons. + + Returns + ------- + list + list of shapely Polygons + """ + raise NotImplementedError() + + def _vtx_grid_to_shape_generator(self): + """internal method, generator yielding shapely polygons for vertex + grids. + + Returns + ------- + generator : + generator of shapely Polygons + """ + # for cell2d rec-arrays + if isinstance(self.mfgrid._cell2d, np.recarray): + for icell in self.mfgrid._cell2d.icell2d: + points = [] + icverts = ["icvert_{}".format(i) for i in + range(self.mfgrid._cell2d["ncvert"][icell])] + for iv in self.mfgrid._cell2d[icverts][icell]: + points.append((self.mfgrid._vertices.xv[iv], + self.mfgrid._vertices.yv[iv])) + # close the polygon, if necessary + if points[0] != points[-1]: + points.append(points[0]) + p = Polygon(points) + p.name = icell + yield p + # for cell2d lists + elif isinstance(self.mfgrid._cell2d, list): + for icell in range(len(self.mfgrid._cell2d)): + points = [] + for iv in self.mfgrid._cell2d[icell][-3:]: + points.append((self.mfgrid._vertices[iv][1], + self.mfgrid._vertices[iv][2])) + # close the polygon, if necessary + if points[0] != points[-1]: + points.append(points[0]) + p = Polygon(points) + p.name = icell + yield p + + def _rect_grid_to_shape_list(self): + """internal method, list of shapely polygons for structured grid cells. + + Returns + ------- + list : + list of shapely Polygons + """ + return list(self._rect_grid_to_shape_generator()) + + def _usg_grid_to_shape_list(self): + """internal method, convert unstructred grid to list of shapely + polygons. + + Returns + ------- + list + list of shapely Polygons + """ + raise NotImplementedError() + + def _vtx_grid_to_shape_list(self): + """internal method, list of shapely polygons for vertex grids. + + Returns + ------- + list : + list of shapely Polygons + """ + return list(self._vtx_grid_to_shape_generator()) + + def query_grid(self, shp): + """Perform spatial query on grid with shapely geometry. If no spatial + query is possible returns all grid cells. + + Parameters + ---------- + shp : shapely.geometry + shapely geometry + + Returns + ------- + list or generator expression + list or generator containing grid cells in query result + """ + if self.rtree: + result = self.strtree.query(shp) + else: + # no spatial query + result = self._get_gridshapes() + return result + + @staticmethod + def filter_query_result(qresult, shp): + """Filter query result to obtain grid cells that intersect with shape. + Used to (further) reduce query result to cells that definitely + intersect with shape. + + Parameters + ---------- + qresult : iterable + query result, iterable of polygons + shp : shapely.geometry + shapely geometry that is prepared and used to filter + query result + + Returns + ------- + qfiltered + filter or generator containing polygons that intersect with shape + """ + # prepare shape for efficient batch intersection check + prepshp = prep(shp) + # get only gridcells that intersect + qfiltered = filter(prepshp.intersects, qresult) + return qfiltered + + @staticmethod + def sort_gridshapes(shape_iter): + """Sort query result by node id. + + Parameters + ---------- + shape_iter : iterable + list or iterable of gridcells + + Returns + ------- + list + sorted list of gridcells + """ + if not isinstance(shape_iter, list): + shapelist = list(shape_iter) + else: + shapelist = shape_iter + + def sort_key(o): + return o.name + shapelist.sort(key=sort_key) + return shapelist + + def _intersect_point_shapely(self, shp, sort_by_cellid=True): + """intersect grid with Point or MultiPoint. + + Parameters + ---------- + shp : Point or MultiPoint + shapely Point or MultiPoint to intersect with grid. Note, + it is generally faster to loop over a MultiPoint and intersect + per point than to intersect a MultiPoint directly. + sort_by_cellid : bool, optional + flag whether to sort cells by id, used to ensure node + with lowest id is returned, by default True + + Returns + ------- + numpy.recarray + a record array containing information about the intersection + """ + # query grid + qresult = self.query_grid(shp) + # prepare shape for efficient batch intersection check + prepshp = prep(shp) + # get only gridcells that intersect + qfiltered = filter(prepshp.intersects, qresult) + + # sort cells to ensure lowest cell ids are returned + if sort_by_cellid: + qfiltered = self.sort_gridshapes(qfiltered) + + isectshp = [] + cellids = [] + vertices = [] + parsed_points = [] # for keeping track of points + + # loop over cells returned by filtered spatial query + for r in qfiltered: + name = r.name + # do intersection + intersect = shp.intersection(r) + # parse result per Point + collection = parse_shapely_ix_result( + [], intersect, shptyps=["Point"]) + # loop over intersection result and store information + cell_verts = [] + cell_shps = [] + for c in collection: + verts = c.__geo_interface__["coordinates"] + # avoid returning multiple cells for points on boundaries + if verts in parsed_points: + continue + parsed_points.append(verts) + cell_shps.append(c) # collect only new points + cell_verts.append(verts) + # if any new ix found + if len(cell_shps) > 0: + # combine new points in MultiPoint + isectshp.append(MultiPoint(cell_shps) if len(cell_shps) > 1 + else cell_shps[0]) + vertices.append(tuple(cell_verts)) + cellids.append(name) + + rec = np.recarray(len(isectshp), + names=["cellids", "vertices", "ixshapes"], + formats=["O", "O", "O"]) + rec.ixshapes = isectshp + rec.vertices = vertices + rec.cellids = cellids + + return rec + + def _intersect_linestring_shapely(self, shp, keepzerolengths=False, + sort_by_cellid=True): + """intersect with LineString or MultiLineString. + + Parameters + ---------- + shp : shapely.geometry.LineString or MultiLineString + LineString to intersect with the grid + keepzerolengths : bool, optional + keep linestrings with length zero, default is False + sort_by_cellid : bool, optional + flag whether to sort cells by id, used to ensure node + with lowest id is returned, by default True + + Returns + ------- + numpy.recarray + a record array containing information about the intersection + """ + # query grid + qresult = self.query_grid(shp) + # filter result further if possible (only strtree and filter methods) + qfiltered = self.filter_query_result(qresult, shp) + # sort cells to ensure lowest cell ids are returned + if sort_by_cellid: + qfiltered = self.sort_gridshapes(qfiltered) + + # initialize empty lists for storing results + isectshp = [] + cellids = [] + vertices = [] + lengths = [] + + # loop over cells returned by filtered spatial query + for r in qfiltered: + name = r.name + # do intersection + intersect = shp.intersection(r) + # parse result + collection = parse_shapely_ix_result( + [], intersect, shptyps=["LineString", "MultiLineString"]) + # loop over intersection result and store information + for c in collection: + verts = c.__geo_interface__["coordinates"] + # test if linestring was already processed (if on boundary) + if verts in vertices: + continue + # if keep zero don't check length + if not keepzerolengths: + if c.length == 0.: + continue + isectshp.append(c) + lengths.append(c.length) + vertices.append(verts) + cellids.append(name) + + rec = np.recarray(len(isectshp), + names=["cellids", "vertices", "lengths", "ixshapes"], + formats=["O", "O", "f8", "O"]) + rec.ixshapes = isectshp + rec.vertices = vertices + rec.lengths = lengths + rec.cellids = cellids + + return rec + + def _intersect_polygon_shapely(self, shp, sort_by_cellid=True): + """intersect with Polygon or MultiPolygon. + + Parameters + ---------- + shp : shapely.geometry.Polygon or MultiPolygon + shape to intersect with the grid + sort_by_cellid : bool, optional + flag whether to sort cells by id, used to ensure node + with lowest id is returned, by default True + + Returns + ------- + numpy.recarray + a record array containing information about the intersection + """ + # query grid + qresult = self.query_grid(shp) + # filter result further if possible (only strtree and filter methods) + qfiltered = self.filter_query_result(qresult, shp) + # sort cells to ensure lowest cell ids are returned + if sort_by_cellid: + qfiltered = self.sort_gridshapes(qfiltered) + + isectshp = [] + cellids = [] + vertices = [] + areas = [] + + # loop over cells returned by filtered spatial query + for r in qfiltered: + name = r.name + # do intersection + intersect = shp.intersection(r) + # parse result + collection = parse_shapely_ix_result( + [], intersect, shptyps=["Polygon", "MultiPolygon"]) + # loop over intersection result and store information + for c in collection: + # don't store intersections with 0 area + if c.area == 0.: + continue + verts = c.__geo_interface__["coordinates"] + isectshp.append(c) + areas.append(c.area) + vertices.append(verts) + cellids.append(name) + + rec = np.recarray(len(isectshp), + names=["cellids", "vertices", "areas", "ixshapes"], + formats=["O", "O", "f8", "O"]) + rec.ixshapes = isectshp + rec.vertices = vertices + rec.areas = areas + rec.cellids = cellids + + return rec + + def intersects(self, shp): + """Return cellIDs for shapes that intersect with shape. + + Parameters + ---------- + shp : shapely.geometry + shape to intersect with the grid + + Returns + ------- + rec : numpy.recarray + a record array containing cell IDs of the gridcells + the shape intersects with + """ + # query grid + qresult = self.query_grid(shp) + # filter result further if possible (only strtree and filter methods) + qfiltered = self.filter_query_result(qresult, shp) + # get cellids + cids = [cell.name for cell in qfiltered] + # build rec-array + rec = np.recarray(len(cids), + names=["cellids"], + formats=["O"]) + rec.cellids = cids + return rec + + def _intersect_point_structured(self, shp): + """intersection method for intersecting points with structured grids. + + Parameters + ---------- + shp : shapely.geometry.Point or MultiPoint + point shape to intersect with grid + + Returns + ------- + numpy.recarray + a record array containing information about the intersection + """ + nodelist = [] + + Xe, Ye = self.mfgrid.xyedges + + try: + iter(shp) + except TypeError: + shp = [shp] + + ixshapes = [] + for p in shp: + # if grid is rotated or offset transform point to local coords + if (self.mfgrid.angrot != 0. or self.mfgrid.xoffset != 0. + or self.mfgrid.yoffset != 0.): + rx, ry = transform(p.x, p.y, self.mfgrid.xoffset, + self.mfgrid.yoffset, + self.mfgrid.angrot_radians, + inverse=True) + else: + rx = p.x + ry = p.y + + # two dimensional point + jpos = ModflowGridIndices.find_position_in_array(Xe, rx) + ipos = ModflowGridIndices.find_position_in_array(Ye, ry) + + if jpos is not None and ipos is not None: + nodelist.append((ipos, jpos)) + ixshapes.append(p) + + # three dimensional point + if p._ndim == 3: + # find k + kpos = ModflowGridIndices.find_position_in_array( + self.mfgrid.botm[:, ipos, jpos], p.z) + if kpos is not None: + nodelist.append((kpos, ipos, jpos)) + + # remove duplicates + tempnodes = [] + tempshapes = [] + for node, ixs in zip(nodelist, ixshapes): + if node not in tempnodes: + tempnodes.append(node) + tempshapes.append(ixs) + else: + # TODO: not sure if this is correct + tempshapes[-1] = MultiPoint([tempshapes[-1], ixs]) + + ixshapes = tempshapes + nodelist = tempnodes + + rec = np.recarray(len(nodelist), names=["cellids", "ixshapes"], + formats=["O", "O"]) + rec.cellids = nodelist + rec.ixshapes = ixshapes + return rec + + def _intersect_linestring_structured(self, shp, keepzerolengths=False): + """method for intersecting linestrings with structured grids. + + Parameters + ---------- + shp : shapely.geometry.Linestring or MultiLineString + linestring to intersect with grid + keepzerolengths : bool, optional + if True keep intersection results with length=0, in + other words, grid cells the linestring does not cross + but does touch, by default False + + Returns + ------- + numpy.recarray + a record array containing information about the intersection + """ + # get local extent of grid + if (self.mfgrid.angrot != 0. or self.mfgrid.xoffset != 0. + or self.mfgrid.yoffset != 0.): + xmin = np.min(self.mfgrid.xyedges[0]) + xmax = np.max(self.mfgrid.xyedges[0]) + ymin = np.min(self.mfgrid.xyedges[1]) + ymax = np.max(self.mfgrid.xyedges[1]) + else: + xmin, xmax, ymin, ymax = self.mfgrid.extent + pl = box(xmin, ymin, xmax, ymax) + + # rotate and translate linestring to local coords + if (self.mfgrid.xoffset != 0. or self.mfgrid.yoffset != 0.): + shp = translate(shp, xoff=-self.mfgrid.xoffset, + yoff=-self.mfgrid.yoffset) + if self.mfgrid.angrot != 0.: + shp = rotate(shp, -self.mfgrid.angrot, origin=(0., 0.)) + + # clip line to mfgrid bbox + lineclip = shp.intersection(pl) + + if lineclip.length == 0.: # linestring does not intersect modelgrid + return np.recarray(0, names=["cellids", "vertices", + "lengths", "ixshapes"], + formats=["O", "O", "f8", "O"]) + if lineclip.geom_type == 'MultiLineString': # there are multiple lines + nodelist, lengths, vertices = [], [], [] + ixshapes = [] + for ls in lineclip: + n, l, v, ix = self._get_nodes_intersecting_linestring(ls) + nodelist += n + lengths += l + # if necessary, transform coordinates back to real + # world coordinates + if (self.mfgrid.angrot != 0. or self.mfgrid.xoffset != 0. + or self.mfgrid.yoffset != 0.): + v_realworld = [] + for pt in v: + rx, ry = transform([pt[0]], [pt[1]], + self.mfgrid.xoffset, + self.mfgrid.yoffset, + self.mfgrid.angrot_radians, + inverse=False) + v_realworld.append([rx, ry]) + ix_realworld = rotate( + ix, self.mfgrid.angrot, origin=(0., 0.)) + ix_realworld = translate( + ix_realworld, self.mfgrid.xoffset, self.mfgrid.yoffset) + else: + v_realworld = v + ix_realworld = ix + vertices += v_realworld + ixshapes += ix_realworld + else: # linestring is fully within grid + nodelist, lengths, vertices, ixshapes = \ + self._get_nodes_intersecting_linestring( + lineclip) + # if necessary, transform coordinates back to real + # world coordinates + if (self.mfgrid.angrot != 0. or self.mfgrid.xoffset != 0. + or self.mfgrid.yoffset != 0.): + v_realworld = [] + for pt in vertices: + rx, ry = transform([pt[0]], [pt[1]], self.mfgrid.xoffset, + self.mfgrid.yoffset, + self.mfgrid.angrot_radians, + inverse=False) + v_realworld.append([rx, ry]) + vertices = v_realworld + + ix_shapes_realworld = [] + for ixs in ixshapes: + ixs = rotate(ixs, self.mfgrid.angrot, origin=(0., 0.)) + ixs = translate(ixs, self.mfgrid.xoffset, + self.mfgrid.yoffset) + ix_shapes_realworld.append(ixs) + ixshapes = ix_shapes_realworld + + # bundle linestrings in same cell + tempnodes = [] + templengths = [] + tempverts = [] + tempshapes = [] + unique_nodes = list(set(nodelist)) + if len(unique_nodes) < len(nodelist): + for inode in unique_nodes: + templengths.append( + sum([l for l, i in zip(lengths, nodelist) if i == inode])) + tempverts.append( + [v for v, i in zip(vertices, nodelist) if i == inode]) + tempshapes.append( + [ix for ix, i in zip(ixshapes, nodelist) if i == inode]) + + nodelist = unique_nodes + lengths = templengths + vertices = tempverts + ixshapes = tempshapes + + # eliminate any nodes that have a zero length + if not keepzerolengths: + tempnodes = [] + templengths = [] + tempverts = [] + tempshapes = [] + for i, _ in enumerate(nodelist): + if lengths[i] > 0: + tempnodes.append(nodelist[i]) + templengths.append(lengths[i]) + tempverts.append(vertices[i]) + tempshapes.append(ixshapes[i]) + nodelist = tempnodes + lengths = templengths + vertices = tempverts + ixshapes = tempshapes + + rec = np.recarray(len(nodelist), + names=["cellids", "vertices", "lengths", "ixshapes"], + formats=["O", "O", "f8", "O"]) + rec.vertices = vertices + rec.lengths = lengths + rec.cellids = nodelist + rec.ixshapes = ixshapes + + return rec + + def _get_nodes_intersecting_linestring(self, linestring): + """helper function, intersect the linestring with the a structured grid + and return a list of node indices and the length of the line in that + node. + + Parameters + ---------- + linestring: shapely.geometry.LineString or MultiLineString + shape to intersect with the grid + + Returns + ------- + nodelist, lengths, vertices: lists + lists containing node ids, lengths of intersects and the + start and end points of the intersects + """ + nodelist = [] + lengths = [] + vertices = [] + ixshapes = [] + + # start at the beginning of the line + x, y = linestring.xy + + # linestring already in local coords but + # because intersect_point does transform again + # we transform back to real world here if necessary + if (self.mfgrid.angrot != 0. or self.mfgrid.xoffset != 0. + or self.mfgrid.yoffset != 0.): + x0, y0 = transform([x[0]], [y[0]], self.mfgrid.xoffset, + self.mfgrid.yoffset, self.mfgrid.angrot_radians, + inverse=False) + else: + x0 = [x[0]] + y0 = [y[0]] + + (i, j) = self.intersect_point(Point(x0[0], y0[0])).cellids[0] + Xe, Ye = self.mfgrid.xyedges + xmin = Xe[j] + xmax = Xe[j + 1] + ymax = Ye[i] + ymin = Ye[i + 1] + pl = box(xmin, ymin, xmax, ymax) + intersect = linestring.intersection(pl) + # if linestring starts in cell, exits, and re-enters + # a MultiLineString is returned. + ixshapes.append(intersect) + length = intersect.length + lengths.append(length) + if intersect.geom_type == "MultiLineString": + x, y = [], [] + for igeom in intersect.geoms: + x.append(igeom.xy[0]) + y.append(igeom.xy[1]) + x = np.concatenate(x) + y = np.concatenate(y) + else: + x = intersect.xy[0] + y = intersect.xy[1] + verts = [(ixy[0], ixy[1]) for ixy in zip(x, y)] + vertices.append(verts) + nodelist.append((i, j)) + + n = 0 + while True: + (i, j) = nodelist[n] + node, length, verts, ixshape = \ + self._check_adjacent_cells_intersecting_line( + linestring, (i, j), nodelist) + + for inode, ilength, ivert, ix in zip(node, length, verts, ixshape): + if inode is not None: + if ivert not in vertices: + nodelist.append(inode) + lengths.append(ilength) + vertices.append(ivert) + ixshapes.append(ix) + + if n == len(nodelist) - 1: + break + n += 1 + + return nodelist, lengths, vertices, ixshapes + + def _check_adjacent_cells_intersecting_line(self, linestring, i_j, + nodelist): + """helper method that follows a line through a structured grid. + + Parameters + ---------- + linestring : shapely.geometry.LineString + shape to intersect with the grid + i_j : tuple + tuple containing (nrow, ncol) + nodelist : list of tuples + list of node ids that have already been added + as intersections + + Returns + ------- + node, length, verts: lists + lists containing nodes, lengths and vertices of + intersections with adjacent cells relative to the + current cell (i, j) + """ + i, j = i_j + + Xe, Ye = self.mfgrid.xyedges + + node = [] + length = [] + verts = [] + ixshape = [] + + # check to left + if j > 0: + ii = i + jj = j - 1 + if (ii, jj) not in nodelist: + xmin = Xe[jj] + xmax = Xe[jj + 1] + ymax = Ye[ii] + ymin = Ye[ii + 1] + pl = box(xmin, ymin, xmax, ymax) + if linestring.intersects(pl): + intersect = linestring.intersection(pl) + ixshape.append(intersect) + length.append(intersect.length) + if intersect.geom_type == "MultiLineString": + x, y = [], [] + for igeom in intersect.geoms: + x.append(igeom.xy[0]) + y.append(igeom.xy[1]) + x = np.concatenate(x) + y = np.concatenate(y) + else: + x = intersect.xy[0] + y = intersect.xy[1] + verts.append([(ixy[0], ixy[1]) + for ixy in zip(*intersect.xy)]) + node.append((ii, jj)) + + # check to right + if j < self.mfgrid.ncol - 1: + ii = i + jj = j + 1 + if (ii, jj) not in nodelist: + xmin = Xe[jj] + xmax = Xe[jj + 1] + ymax = Ye[ii] + ymin = Ye[ii + 1] + pl = box(xmin, ymin, xmax, ymax) + if linestring.intersects(pl): + intersect = linestring.intersection(pl) + ixshape.append(intersect) + length.append(intersect.length) + if intersect.geom_type == "MultiLineString": + x, y = [], [] + for igeom in intersect.geoms: + x.append(igeom.xy[0]) + y.append(igeom.xy[1]) + x = np.concatenate(x) + y = np.concatenate(y) + else: + x = intersect.xy[0] + y = intersect.xy[1] + verts.append([(ixy[0], ixy[1]) + for ixy in zip(*intersect.xy)]) + node.append((ii, jj)) + + # check to back + if i > 0: + ii = i - 1 + jj = j + if (ii, jj) not in nodelist: + xmin = Xe[jj] + xmax = Xe[jj + 1] + ymax = Ye[ii] + ymin = Ye[ii + 1] + pl = box(xmin, ymin, xmax, ymax) + if linestring.intersects(pl): + intersect = linestring.intersection(pl) + ixshape.append(intersect) + length.append(intersect.length) + if intersect.geom_type == "MultiLineString": + x, y = [], [] + for igeom in intersect.geoms: + x.append(igeom.xy[0]) + y.append(igeom.xy[1]) + x = np.concatenate(x) + y = np.concatenate(y) + else: + x = intersect.xy[0] + y = intersect.xy[1] + verts.append([(ixy[0], ixy[1]) for ixy in + zip(*intersect.xy)]) + node.append((ii, jj)) + + # check to front + if i < self.mfgrid.nrow - 1: + ii = i + 1 + jj = j + if (ii, jj) not in nodelist: + xmin = Xe[jj] + xmax = Xe[jj + 1] + ymax = Ye[ii] + ymin = Ye[ii + 1] + pl = box(xmin, ymin, xmax, ymax) + if linestring.intersects(pl): + intersect = linestring.intersection(pl) + ixshape.append(intersect) + length.append(intersect.length) + if intersect.geom_type == "MultiLineString": + x, y = [], [] + for igeom in intersect.geoms: + x.append(igeom.xy[0]) + y.append(igeom.xy[1]) + x = np.concatenate(x) + y = np.concatenate(y) + else: + x = intersect.xy[0] + y = intersect.xy[1] + verts.append([(ixy[0], ixy[1]) for ixy in zip(x, y)]) + node.append((ii, jj)) + + return node, length, verts, ixshape + + def _intersect_rectangle_structured(self, rectangle): + """intersect a rectangle with a structured grid to retrieve node ids of + intersecting grid cells. + + Note: only works in local coordinates (i.e. non-rotated grid + with origin at (0, 0)) + + Parameters + ---------- + rectangle : list of tuples + list of lower-left coordinate and upper-right + coordinate: [(xmin, ymin), (xmax, ymax)] + + Returns + ------- + nodelist: list of tuples + list of tuples containing node ids with which + the rectangle intersects + """ + + nodelist = [] + + # return if rectangle does not contain any cells + if (self.mfgrid.angrot != 0. or self.mfgrid.xoffset != 0. + or self.mfgrid.yoffset != 0.): + minx = np.min(self.mfgrid.xyedges[0]) + maxx = np.max(self.mfgrid.xyedges[0]) + miny = np.min(self.mfgrid.xyedges[1]) + maxy = np.max(self.mfgrid.xyedges[1]) + local_extent = [minx, maxx, miny, maxy] + else: + local_extent = self.mfgrid.extent + + xmin, xmax, ymin, ymax = local_extent + bgrid = box(xmin, ymin, xmax, ymax) + (rxmin, rymin), (rxmax, rymax) = rectangle + b = box(rxmin, rymin, rxmax, rymax) + + if not b.intersects(bgrid): + # return with nodelist as an empty list + return [] + + Xe, Ye = self.mfgrid.xyedges + + jmin = ModflowGridIndices.find_position_in_array(Xe, xmin) + if jmin is None: + if xmin <= Xe[0]: + jmin = 0 + elif xmin >= Xe[-1]: + jmin = self.mfgrid.ncol - 1 + + jmax = ModflowGridIndices.find_position_in_array(Xe, xmax) + if jmax is None: + if xmax <= Xe[0]: + jmax = 0 + elif xmax >= Xe[-1]: + jmax = self.mfgrid.ncol - 1 + + imin = ModflowGridIndices.find_position_in_array(Ye, ymax) + if imin is None: + if ymax >= Ye[0]: + imin = 0 + elif ymax <= Ye[-1]: + imin = self.mfgrid.nrow - 1 + + imax = ModflowGridIndices.find_position_in_array(Ye, ymin) + if imax is None: + if ymin >= Ye[0]: + imax = 0 + elif ymin <= Ye[-1]: + imax = self.mfgrid.nrow - 1 + + for i in range(imin, imax + 1): + for j in range(jmin, jmax + 1): + nodelist.append((i, j)) + + return nodelist + + def _intersect_polygon_structured(self, shp): + """intersect polygon with a structured grid. Uses bounding box of the + Polygon to limit search space. + + Notes + ----- + If performance is slow, try setting the method to 'vertex' + in the GridIntersect object. For polygons this is often + faster. + + Parameters + ---------- + shp : shapely.geometry.Polygon + polygon to intersect with the grid + + Returns + ------- + numpy.recarray + a record array containing information about the intersection + """ + + # initialize the result lists + nodelist = [] + areas = [] + vertices = [] + ixshapes = [] + + # transform polygon to local grid coordinates + if (self.mfgrid.xoffset != 0. or self.mfgrid.yoffset != 0.): + shp = translate(shp, xoff=-self.mfgrid.xoffset, + yoff=-self.mfgrid.yoffset) + if self.mfgrid.angrot != 0.: + shp = rotate(shp, -self.mfgrid.angrot, origin=(0., 0.)) + + # use the bounds of the polygon to restrict the cell search + minx, miny, maxx, maxy = shp.bounds + rectangle = ((minx, miny), (maxx, maxy)) + nodes = self._intersect_rectangle_structured(rectangle) + + for (i, j) in nodes: + if (self.mfgrid.angrot != 0. or self.mfgrid.xoffset != 0. + or self.mfgrid.yoffset != 0.): + cell_coords = [(self.mfgrid.xyedges[0][j], + self.mfgrid.xyedges[1][i]), + (self.mfgrid.xyedges[0][j + 1], + self.mfgrid.xyedges[1][i]), + (self.mfgrid.xyedges[0][j + 1], + self.mfgrid.xyedges[1][i + 1]), + (self.mfgrid.xyedges[0][j], + self.mfgrid.xyedges[1][i + 1])] + else: + cell_coords = self.mfgrid.get_cell_vertices(i, j) + node_polygon = Polygon(cell_coords) + if shp.intersects(node_polygon): + intersect = shp.intersection(node_polygon) + if intersect.area > 0.: + nodelist.append((i, j)) + areas.append(intersect.area) + + # if necessary, transform coordinates back to real + # world coordinates + if (self.mfgrid.angrot != 0. or self.mfgrid.xoffset != 0. + or self.mfgrid.yoffset != 0.): + v_realworld = [] + if intersect.geom_type.startswith("Multi"): + for ipoly in intersect: + v_realworld += \ + self._transform_geo_interface_polygon( + ipoly) + else: + v_realworld += \ + self._transform_geo_interface_polygon( + intersect) + intersect_realworld = rotate(intersect, + self.mfgrid.angrot, + origin=(0., 0.)) + intersect_realworld = translate(intersect_realworld, + self.mfgrid.xoffset, + self.mfgrid.yoffset) + else: + v_realworld = intersect.__geo_interface__[ + "coordinates"] + intersect_realworld = intersect + ixshapes.append(intersect_realworld) + vertices.append(v_realworld) + + rec = np.recarray(len(nodelist), + names=["cellids", "vertices", "areas", "ixshapes"], + formats=["O", "O", "f8", "O"]) + rec.vertices = vertices + rec.areas = areas + rec.cellids = nodelist + rec.ixshapes = ixshapes + + return rec + + def _transform_geo_interface_polygon(self, polygon): + """Internal method, helper function to transform geometry + __geo_interface__. + + Used for translating intersection result coordinates back into + real-world coordinates. + + Parameters + ---------- + polygon : shapely.geometry.Polygon + polygon to transform coordinates for + + Returns + ------- + geom_list : list + list containing transformed coordinates in same structure as + the original __geo_interface__. + """ + + if polygon.geom_type.startswith("Multi"): + raise TypeError("Does not support Multi geometries!") + + geom_list = [] + for coords in polygon.__geo_interface__["coordinates"]: + geoms = [] + try: + # test depth of list/tuple + _ = coords[0][0][0] + if len(coords) == 2: + shell, holes = coords + else: + raise ValueError("Cannot parse __geo_interface__") + except TypeError: + shell = coords + holes = None + except Exception as e: + raise e + # transform shell coordinates + shell_pts = [] + for pt in shell: + rx, ry = transform([pt[0]], [pt[1]], + self.mfgrid.xoffset, + self.mfgrid.yoffset, + self.mfgrid.angrot_radians, + inverse=False) + shell_pts.append((rx, ry)) + geoms.append(shell_pts) + # transform holes coordinates if necessary + if holes: + holes_pts = [] + for pt in holes: + rx, ry = transform([pt[0]], [pt[1]], + self.mfgrid.xoffset, + self.mfgrid.yoffset, + self.mfgrid.angrot_radians, + inverse=False) + holes_pts.append((rx, ry)) + geoms.append(holes_pts) + # append (shells, holes) to transformed coordinates list + geom_list.append(tuple(geoms)) + return geom_list + + @staticmethod + def plot_polygon(rec, ax=None, **kwargs): + """method to plot the polygon intersection results from the resulting + numpy.recarray. + + Note: only works when recarray has 'intersects' column! + + Parameters + ---------- + rec : numpy.recarray + record array containing intersection results + (the resulting shapes) + ax : matplotlib.pyplot.axes, optional + axes to plot onto, if not provided, creates a new figure + **kwargs: + passed to the plot function + + Returns + ------- + ax: matplotlib.pyplot.axes + returns the axes handle + """ + try: + from descartes import PolygonPatch + except ModuleNotFoundError: + msg = 'descartes package needed for plotting polygons' + if plt is None: + msg = 'matplotlib and descartes packages needed for ' + \ + 'plotting polygons' + raise ModuleNotFoundError(msg) + + if plt is None: + msg = 'matplotlib package needed for plotting polygons' + raise ModuleNotFoundError(msg) + + if ax is None: + _, ax = plt.subplots() + + for i, ishp in enumerate(rec.ixshapes): + if "facecolor" in kwargs: + fc = kwargs.pop("facecolor") + else: + fc = "C{}".format(i % 10) + ppi = PolygonPatch(ishp, facecolor=fc, **kwargs) + ax.add_patch(ppi) + + return ax + + @staticmethod + def plot_linestring(rec, ax=None, **kwargs): + """method to plot the linestring intersection results from the + resulting numpy.recarray. + + Note: only works when recarray has 'intersects' column! + + Parameters + ---------- + rec : numpy.recarray + record array containing intersection results + (the resulting shapes) + ax : matplotlib.pyplot.axes, optional + axes to plot onto, if not provided, creates a new figure + **kwargs: + passed to the plot function + + Returns + ------- + ax: matplotlib.pyplot.axes + returns the axes handle + """ + if plt is None: + msg = 'matplotlib package needed for plotting polygons' + raise ModuleNotFoundError(msg) + + if ax is None: + _, ax = plt.subplots() + + for i, ishp in enumerate(rec.ixshapes): + if "c" in kwargs: + c = kwargs.pop("c") + elif "color" in kwargs: + c = kwargs.pop("color") + else: + c = "C{}".format(i % 10) + if ishp.type == "MultiLineString": + for part in ishp: + ax.plot(part.xy[0], part.xy[1], ls="-", + c=c, **kwargs) + else: + ax.plot(ishp.xy[0], ishp.xy[1], ls="-", + c=c, **kwargs) + + return ax + + @staticmethod + def plot_point(rec, ax=None, **kwargs): + """method to plot the point intersection results from the resulting + numpy.recarray. + + Note: only works when recarray has 'intersects' column! + + Parameters + ---------- + rec : numpy.recarray + record array containing intersection results + ax : matplotlib.pyplot.axes, optional + axes to plot onto, if not provided, creates a new figure + **kwargs: + passed to the scatter function + + Returns + ------- + ax: matplotlib.pyplot.axes + returns the axes handle + """ + if plt is None: + msg = 'matplotlib package needed for plotting polygons' + raise ModuleNotFoundError(msg) + + if ax is None: + _, ax = plt.subplots() + + x, y = [], [] + geo_coll = GeometryCollection(list(rec.ixshapes)) + collection = parse_shapely_ix_result([], geo_coll, ["Point"]) + for c in collection: + x.append(c.x) + y.append(c.y) + ax.scatter(x, y, **kwargs) + + return ax + + +class ModflowGridIndices: + """Collection of methods that can be used to find cell indices for a + structured, but irregularly spaced MODFLOW grid.""" + + @staticmethod + def find_position_in_array(arr, x): + """If arr has x positions for the left edge of a cell, then return the + cell index containing x. + + Parameters + ---------- + arr : A one dimensional array (such as Xe) that contains + coordinates for the left cell edge. + + x : float + The x position to find in arr. + """ + jpos = None + + if x == arr[-1]: + return len(arr) - 2 + + if x < min(arr[0], arr[-1]): + return None + + if x > max(arr[0], arr[-1]): + return None + + # go through each position + for j in range(len(arr) - 1): + xl = arr[j] + xr = arr[j + 1] + frac = (x - xl) / (xr - xl) + if 0. <= frac <= 1.0: + # if min(xl, xr) <= x < max(xl, xr): + jpos = j + return jpos + + return jpos + + @staticmethod + def kij_from_nodenumber(nodenumber, nlay, nrow, ncol): + """Convert the modflow node number to a zero-based layer, row and + column format. Return (k0, i0, j0). + + Parameters + ---------- + nodenumber: int + The cell nodenumber, ranging from 1 to number of + nodes. + nlay: int + The number of layers. + nrow: int + The number of rows. + ncol: int + The number of columns. + """ + if nodenumber > nlay * nrow * ncol: + raise Exception('Error in function kij_from_nodenumber...') + n = nodenumber - 1 + k = int(n / nrow / ncol) + i = int((n - k * nrow * ncol) / ncol) + j = n - k * nrow * ncol - i * ncol + return (k, i, j) + + @staticmethod + def nodenumber_from_kij(k, i, j, nrow, ncol): + """Calculate the nodenumber using the zero-based layer, row, and column + values. The first node has a value of 1. + + Parameters + ---------- + k : int + The model layer number as a zero-based value. + i : int + The model row number as a zero-based value. + j : int + The model column number as a zero-based value. + nrow : int + The number of model rows. + ncol : int + The number of model columns. + """ + return k * nrow * ncol + i * ncol + j + 1 + + @staticmethod + def nn0_from_kij(k, i, j, nrow, ncol): + """Calculate the zero-based nodenumber using the zero-based layer, row, + and column values. The first node has a value of 0. + + Parameters + ---------- + k : int + The model layer number as a zero-based value. + i : int + The model row number as a zero-based value. + j : int + The model column number as a zero-based value. + nrow : int + The number of model rows. + ncol : int + The number of model columns. + """ + return k * nrow * ncol + i * ncol + j + + @staticmethod + def kij_from_nn0(n, nlay, nrow, ncol): + """Convert the node number to a zero-based layer, row and column + format. Return (k0, i0, j0). + + Parameters + ---------- + nodenumber : int + The cell nodenumber, ranging from 0 to number of + nodes - 1. + nlay : int + The number of layers. + nrow : int + The number of rows. + ncol : int + The number of columns. + """ + if n > nlay * nrow * ncol: + raise Exception('Error in function kij_from_nodenumber...') + k = int(n / nrow / ncol) + i = int((n - k * nrow * ncol) / ncol) + j = n - k * nrow * ncol - i * ncol + return (k, i, j)