def run(self): if self.state == Node.SUCCESS: return try: with open(self.filename): pass except PermissionError: self.fail('Access denied.') return self.data = PointData() try: for point, attribute in Shapefile.get_points(self.filename): self.data.add_point(point) self.data.add_attribute(attribute) except ShapefileException as e: self.fail(e) return self.data.set_fields(Shapefile.get_all_fields(self.filename)) if self.data.is_empty(): self.fail('the file does not contain any point.') return self.success('The file contains {} point{}.'.format( len(self.data), 's' if len(self.data) > 1 else ''))
def slf_int2d(args): # Read set of points file fields, indices = Shapefile.get_attribute_names(args.in_points) points = [] attributes = [] for point, attribute in Shapefile.get_points(args.in_points, indices): points.append(point) attributes.append(attribute) if not points: logger.critical('The Shapefile does not contain any point.') sys.exit(1) # Read Serafin file with Serafin.Read(args.in_slf, args.lang) as resin: resin.read_header() logger.info(resin.header.summary()) if not resin.header.is_2d: logger.critical('The file has to be a 2D Serafin!') sys.exit(3) resin.get_time() output_header = resin.header.copy() mesh = MeshInterpolator(output_header, True) is_inside, point_interpolators = mesh.get_point_interpolators(points) nb_inside = sum(map(int, is_inside)) if nb_inside == 0: logger.critical('No point inside the mesh.') sys.exit(3) logger.debug( 'The file contains {} point{}. {} point{} inside the mesh'.format( len(points), 's' if len(points) > 1 else '', nb_inside, 's are' if nb_inside > 1 else ' is')) var_IDs = output_header.var_IDs if args.vars is None else args.vars mode = 'w' if args.force else 'x' with open(args.out_csv, mode, newline='') as csvfile: csvwriter = csv.writer(csvfile, delimiter=args.sep) header = ['time_id', 'time'] if args.long: header = header + [ 'point_id', 'point_x', 'point_y', 'variable', 'value' ] else: for pt_id, (x, y) in enumerate(points): for var in var_IDs: header.append( 'Point %d %s (%s|%s)' % (pt_id + 1, var, settings.FMT_COORD.format(x), settings.FMT_COORD.format(y))) csvwriter.writerow(header) for time_index, time in enumerate(tqdm(resin.time, unit='frame')): values = [time_index, time] for var_ID in var_IDs: var = resin.read_var_in_frame(time_index, var_ID) for pt_id, (point, point_interpolator) in enumerate( zip(points, point_interpolators)): if args.long: values_long = values + [str(pt_id + 1)] + [ settings.FMT_COORD.format(x) for x in point ] if point_interpolator is None: if args.long: csvwriter.writerow(values_long + [var_ID, settings.NAN_STR]) else: values.append(settings.NAN_STR) else: (i, j, k), interpolator = point_interpolator int_value = settings.FMT_FLOAT.format( interpolator.dot(var[[i, j, k]])) if args.long: csvwriter.writerow(values_long + [var_ID, int_value]) else: values.append(int_value) if not args.long: csvwriter.writerow(values)
def from_file(filename, label, field_id=None, project_straight_line=False): section_seq = CrossSectionSequence() if filename.endswith('.i3s'): with bk.Read(filename) as in_i3s: in_i3s.read_header() for i, line in enumerate(in_i3s.get_open_polylines()): line_id = i if field_id is None else line.attributes()[ 0] # Use `Value` if field is not None z_array = np.array([(coord[2], ) for coord in line.polyline().coords], dtype=float_vars('Z')) line = line.to_2d() section = CrossSection(line_id, list(line.polyline().coords), label) section.coord.values = z_array section_seq.add_section(section) elif filename.endswith('.shp'): shp_type = shp.get_shape_type(filename) if shp_type in (shapefile.POLYLINEZ, shapefile.POLYLINEM): field_id_index = get_field_index(filename, field_id) for i, line in enumerate(shp.get_open_polylines(filename)): line_id = i if field_id is None else line.attributes( )[field_id_index] z_array = np.array([(coord[2], ) for coord in line.polyline().coords], dtype=float_vars(['Z'])) line = line.to_2d() section = CrossSection(line_id, list(line.polyline().coords), label) section.coord.values = z_array section_seq.add_section(section) elif shp_type in (shapefile.POINT, shapefile.POINTZ): field_id_index = get_field_index(filename, field_id) field_indexes, field_names = [], [] if shp_type == shapefile.POINTZ: field_names.append('Z') for index, name in shp.get_numeric_attribute_names(filename): if name.startswith('Z'): field_indexes.append(index) field_names.append(name) coords, z_layers = [], [] last_point_id = None for i, (point, attributes) in enumerate( shp.get_points(filename, with_z=shp_type == shapefile.POINTZ)): point_id = attributes[ field_id_index] # FIXME: should raise exception if field_id_index is None! if i > 0 and point_id != last_point_id: z_array = np.array(z_layers, dtype=float_vars(field_names)) section = CrossSection(last_point_id, coords, label) section.coord.values = z_array section_seq.add_section(section) coords, z_layers = [], [] coords.append(point[:2]) if shp_type == shapefile.POINTZ: z_layers.append((point[2], ) + tuple(attributes[index] for index in field_indexes)) else: z_layers.append( tuple(attributes[index] for index in field_indexes)) last_point_id = point_id z_array = np.array(z_layers, dtype=float_vars(field_names)) section = CrossSection(last_point_id, coords, label) section.coord.values = z_array section_seq.add_section(section) else: raise TatooineException( "The type of file %s is not POINT[Z] or POLYLINEZ[M]" % filename) else: raise NotImplementedError( "Only shp and i3s formats are supported for cross-sections") if project_straight_line: for section in section_seq: section.project_straight_line() return section_seq