''' @author: olivier.massot, sept. 2018 ''' import shapefile POINT = 1 POLYLINE = 3 POLYGON = 5 SHAPE_NAMES = {1: "POINT", 3:"POLYLIGNE", 5:"POLYGONE"} class ShapeError(IOError): pass class SridError(IOError): pass class ShapeFile(): def __init__(self, path_, srid=None): self.path_ = path_ self.srid = srid def __enter__(self): if not self.path_.isfile(): raise FileNotFoundError("Fichier introuvable") try: self.sf = shapefile.Reader(self.path_) except shapefile.ShapefileException: raise ShapeError("Fichier Shape illisible") if not self.sf.shapeType in (POINT, POLYLINE, POLYGON): raise ShapeError("Type de géométrie non reconnue") # if self.srid is not None: # if not self.sf.srid == self.srid: # raise SridError("Le SRID du fichier doit être '{}'".format(self.srid)) return self def shape(self): return self.sf.shapeType def fields(self): return [f[0] for f in self.sf.fields if f[0] != 'DeletionFlag'] def records(self): for record in self.sf.shapeRecords(): yield record def __exit__(self, exc_type, exc_val, exc_tb): del self.sf