Coverage for pyguymer3/geo/_add_antarcticIceShelves.py: 2%
40 statements
« prev ^ index » next coverage.py v7.9.2, created at 2025-07-08 18:47 +0000
« prev ^ index » next coverage.py v7.9.2, created at 2025-07-08 18:47 +0000
1#!/usr/bin/env python3
3# Define function ...
4def _add_antarcticIceShelves(
5 ax,
6 /,
7 *,
8 debug = __debug__,
9 fov = None,
10 onlyValid = False,
11 repair = False,
12 resolution = "10m",
13):
14 """Add Antarctic ice shelves to a Cartopy axis.
16 Parameters
17 ----------
18 axis : cartopy.mpl.geoaxes.GeoAxesSubplot
19 the axis to add the Antarctic ice shelves to
20 debug : bool, optional
21 print debug messages
22 fov : None or shapely.geometry.polygon.Polygon, optional
23 clip the plotted shapes to the provided field-of-view to work around
24 occaisional MatPlotLib or Cartopy plotting errors when shapes much
25 larger than the field-of-view are plotted
26 onlyValid : bool, optional
27 only add valid Polygons (checks for validity can take a while, if being
28 being called often)
29 repair : bool, optional
30 attempt to repair invalid Polygons
31 resolution : str, optional
32 the resolution of the Antarctic ice shelves
34 Notes
35 -----
36 This function uses `CSS4 named colours
37 <https://matplotlib.org/stable/gallery/color/named_colors.html>`_ .
39 Copyright 2017 Thomas Guymer [1]_
41 References
42 ----------
43 .. [1] PyGuymer3, https://github.com/Guymer/PyGuymer3
44 """
46 # Import standard modules ...
47 import os
48 import urllib
50 # Import special modules ...
51 try:
52 import cartopy
53 cartopy.config.update(
54 {
55 "cache_dir" : os.path.expanduser("~/.local/share/cartopy_cache"),
56 }
57 )
58 except:
59 raise Exception("\"cartopy\" is not installed; run \"pip install --user Cartopy\"") from None
60 try:
61 import matplotlib
62 matplotlib.rcParams.update(
63 {
64 "backend" : "Agg", # NOTE: See https://matplotlib.org/stable/gallery/user_interfaces/canvasagg.html
65 "figure.dpi" : 300,
66 "figure.figsize" : (9.6, 7.2), # NOTE: See https://github.com/Guymer/misc/blob/main/README.md#matplotlib-figure-sizes
67 "font.size" : 8,
68 }
69 )
70 except:
71 raise Exception("\"matplotlib\" is not installed; run \"pip install --user matplotlib\"") from None
72 try:
73 import shapely
74 import shapely.geometry
75 except:
76 raise Exception("\"shapely\" is not installed; run \"pip install --user Shapely\"") from None
78 # Import sub-functions ...
79 from .extract_polys import extract_polys
81 # **************************************************************************
83 # Create suitable colour ...
84 facecolor = matplotlib.colors.to_rgba(matplotlib.colors.CSS4_COLORS["aliceblue"])
85 if debug:
86 print(f"INFO: \"antarctic_ice_shelves_polys\" is ({facecolor[0]:.6f},{facecolor[1]:.6f},{facecolor[2]:.6f},{facecolor[3]:.6f}).")
88 # Find file containing the shapes ...
89 try:
90 sfile = cartopy.io.shapereader.natural_earth(
91 resolution = resolution,
92 category = "physical",
93 name = "antarctic_ice_shelves_polys",
94 )
95 except urllib.error.HTTPError:
96 return
97 if debug:
98 print(f"INFO: \"antarctic_ice_shelves_polys\" is \"{sfile}\".")
100 # Loop over records ...
101 for record in cartopy.io.shapereader.Reader(sfile).records():
102 # Skip bad records ...
103 if not hasattr(record, "geometry"):
104 continue
106 # Create a list of Polygons to plot (taking in to account if the user
107 # provided a field-of-view to clip them by) ...
108 polys = []
109 for poly in extract_polys(
110 record.geometry,
111 onlyValid = onlyValid,
112 repair = repair,
113 ):
114 if fov is None:
115 polys.append(poly)
116 continue
117 if poly.disjoint(fov):
118 continue
119 polys.append(poly.intersection(fov))
121 # Plot geometry ...
122 ax.add_geometries(
123 polys,
124 cartopy.crs.PlateCarree(),
125 edgecolor = "none",
126 facecolor = facecolor,
127 )