Source code for pyglimer.ccp.plot_utils.line_buffer

import numpy as np
from pyglimer.utils.geo_utils import geo2cart
from pyglimer.utils.geo_utils import cart2geo
from pyglimer.utils.Ra2b import Ra2b
from shapely.geometry import Polygon
from shapely.ops import unary_union


[docs]def line_buffer(lat, lon, delta=1.0): """Creates buffer around geographical line using from pole rotated cap outlines. This is far from perfect, but it does "a" job. There isn't much more that one can and be spherically accurate. As long as the amount of points in the line is fair this should have no problem to immitate a true buffer. Parameters ---------- lat : np.ndarray latitudes lon : np.ndarray longitudes delta : float, optional epicentral distance to line, by default 1.0 Returns ------- np.ndarray Nx2 matrix with coordinates of a polygon that forms a buffer around the line Notes ----- :Authors: Lucas Sawade (lsawade@princeton.edu) :Last Modified: 2021.04.21 20.00 (Lucas Sawade) """ # Buffer circle around z axis r = 1 phi = np.arange(0, 2*np.pi, 2*np.pi/100) theta = delta*np.pi/180 # Circle around z axis in cartesian x = r*np.sin(theta)*np.cos(phi) y = r*np.sin(theta)*np.sin(phi) z = r*np.cos(theta)*np.ones_like(phi) points = np.vstack((x, y, z)) # Get circlse around the local coordinates rcoordset = [] for _lat, _lon in zip(lat, lon): # Convert line coordinates x1 = geo2cart(1, _lat, _lon) # Compute rotation matrix compute the new set of points rpoints = Ra2b((0, 0, 1), x1) @ points # Append x and y coordinates rcoordset.append(cart2geo( rpoints[0, :], rpoints[1, :], rpoints[2, :])) # Generate and combine polygons polygons = [] circles = [] for _i, coords in enumerate(rcoordset): circles.append((coords[2], coords[1])) polygon = Polygon([(_x, _y) for _x, _y in zip(coords[2], coords[1])]) polygons.append(polygon) # Combine from converted points upoly = unary_union(polygons) if upoly.type == 'MultiPolygon': polyplot = [np.array(x.exterior.xy).T for x in upoly.geoms] else: polyplot = [np.array(upoly.exterior.xy).T] return polyplot, circles