def write_shapefile(self, endpoint_data=None, shpname='endpoings.shp', direction='ending', sr=None, epsg=None, **kwargs): """Write particle starting / ending locations to shapefile. endpoint_data : np.recarry Record array of same form as that returned by EndpointFile.get_alldata. (if none, EndpointFile.get_alldata() is exported). shpname : str File path for shapefile direction : str String defining if starting or ending particle locations should be considered. (default is 'ending') sr : flopy.utils.reference.SpatialReference instance Used to scale and rotate Global x,y,z values in MODPATH Endpoint file epsg : int EPSG code for writing projection (.prj) file. If this is not supplied, the proj4 string or epgs code associated with sr will be used. kwargs : keyword arguments to flopy.export.shapefile_utils.recarray2shp """ from flopy.utils.reference import SpatialReference from flopy.utils.geometry import Point from flopy.export.shapefile_utils import recarray2shp epd = endpoint_data.copy() if epd is None: epd = self.get_alldata() if direction.lower() == 'ending': xcol, ycol, zcol = 'x', 'y', 'z' elif direction.lower() == 'starting': xcol, ycol, zcol = 'x0', 'y0', 'z0' else: errmsg = 'flopy.map.plot_endpoint direction must be "ending" ' + \ 'or "starting".' raise Exception(errmsg) if sr is None: sr = SpatialReference() x, y = sr.transform(epd[xcol], epd[ycol]) z = epd[zcol] geoms = [Point(x[i], y[i], z[i]) for i in range(len(epd))] # convert back to one-based for n in self.kijnames: epd[n] += 1 recarray2shp(epd, geoms, shpname=shpname, epsg=epsg, **kwargs)
def write_shapefile(self, pathline_data=None, one_per_particle=True, direction='ending', shpname='endpoings.shp', sr=None, epsg=None, **kwargs): """Write pathlines to shapefile. pathline_data : np.recarry Record array of same form as that returned by EndpointFile.get_alldata. (if none, EndpointFile.get_alldata() is exported). one_per_particle : boolean (default True) True writes a single LineString with a single set of attribute data for each particle. False writes a record/geometry for each pathline segment (each row in the PathLine file). This option can be used to visualize attribute information (time, model layer, etc.) across a pathline in a GIS. direction : str String defining if starting or ending particle locations should be included in shapefile attribute information. Only used if one_per_particle=False. (default is 'ending') shpname : str File path for shapefile sr : flopy.utils.reference.SpatialReference instance Used to scale and rotate Global x,y,z values in MODPATH Endpoint file epsg : int EPSG code for writing projection (.prj) file. If this is not supplied, the proj4 string or epgs code associated with sr will be used. kwargs : keyword arguments to flopy.export.shapefile_utils.recarray2shp """ from flopy.utils.reference import SpatialReference from flopy.utils.geometry import LineString from flopy.export.shapefile_utils import recarray2shp pth = pathline_data if pth is None: pth = self._data.view(np.recarray) pth = pth.copy() pth.sort(order=['particleid', 'time']) if sr is None: sr = SpatialReference() particles = np.unique(pth.particleid) geoms = [] # 1 geometry for each path if one_per_particle: loc_inds = 0 if direction == 'ending': loc_inds = -1 pthdata = [] for pid in particles: ra = pth[pth.particleid == pid] x, y = sr.transform(ra.x, ra.y) z = ra.z geoms.append(LineString(list(zip(x, y, z)))) pthdata.append((pid, ra.particlegroup[0], ra.time.max(), ra.k[loc_inds], ra.i[loc_inds], ra.j[loc_inds])) pthdata = np.array(pthdata, dtype=[('particleid', np.int), ('particlegroup', np.int), ('time', np.float), ('k', np.int), ('i', np.int), ('j', np.int) ]).view(np.recarray) # geometry for each row in PathLine file else: dtype = pth.dtype #pthdata = np.empty((0, len(dtype)), dtype=dtype).view(np.recarray) pthdata = [] for pid in particles: ra = pth[pth.particleid == pid] x, y = sr.transform(ra.x, ra.y) z = ra.z geoms += [LineString([(x[i-1], y[i-1], z[i-1]), (x[i], y[i], z[i])]) for i in np.arange(1, (len(ra)))] #pthdata = np.append(pthdata, ra[1:]).view(np.recarray) pthdata += ra[1:].tolist() pthdata = np.array(pthdata, dtype=dtype).view(np.recarray) # convert back to one-based for n in set(self.kijnames).intersection(set(pthdata.dtype.names)): pthdata[n] += 1 recarray2shp(pthdata, geoms, shpname=shpname, epsg=sr.epsg, **kwargs)