Module rok4.vector
Provide class to read informations on vector data from file path or object path
The module contains the following class :
Vector
- Data Vector
Classes
class Vector
-
A data vector
Attributes
path
:str
- path to the file/object
bbox
:Tuple[float, float, float, float]
- bounding rectange in the data projection
layers (List[Tuple[str, int, List[Tuple[str, str]]]]) : Vector layers with their name, their number of objects and their attributes
Expand source code
class Vector: """A data vector Attributes: path (str): path to the file/object bbox (Tuple[float, float, float, float]): bounding rectange in the data projection layers (List[Tuple[str, int, List[Tuple[str, str]]]]) : Vector layers with their name, their number of objects and their attributes """ @classmethod def from_file(cls, path: str, **kwargs) -> "Vector": """Constructor method of a Vector from a file (Shapefile, Geopackage, CSV and GeoJSON) Args: path (str): path to the file/object **csv (Dict[str : str]) : dictionnary of CSV parameters : -srs (str) ("EPSG:2154" if not provided) : spatial reference system of the geometry -column_x (str) ("x" if not provided) : field of the x coordinate -column_y (str) ("y" if not provided) : field of the y coordinate -column_wkt (str) (None if not provided) : field of the WKT of the geometry if WKT use to define coordinate Examples: from rok4.vector import Vector try: vector = Vector.from_file("file://tests/fixtures/ARRONDISSEMENT.shp") vector_csv1 = Vector.from_file("file://tests/fixtures/vector.csv" , csv={"delimiter":";", "column_x":"x", "column_y":"y"}) vector_csv2 = Vector.from_file("file://tests/fixtures/vector2.csv" , csv={"delimiter":";", "column_wkt":"WKT"}) except Exception as e: print(f"Vector creation raises an exception: {exc}") Raises: MissingEnvironmentError: Missing object storage informations StorageError: Storage read issue Exception: Wrong column Exception: Wrong data in column Exception: Wrong format of file Exception: Wrong data in the file """ self = cls() self.path = path path_split = path.split("/") if path_split[0] == "ceph:" or path.endswith(".csv"): if path.endswith(".shp"): with tempfile.TemporaryDirectory() as tmp: tmp_path = tmp + "/" + path_split[-1][:-4] copy(path, "file://" + tmp_path + ".shp") copy(path[:-4] + ".shx", "file://" + tmp_path + ".shx") copy(path[:-4] + ".cpg", "file://" + tmp_path + ".cpg") copy(path[:-4] + ".dbf", "file://" + tmp_path + ".dbf") copy(path[:-4] + ".prj", "file://" + tmp_path + ".prj") dataSource = ogr.Open(tmp_path + ".shp", 0) elif path.endswith(".gpkg"): with tempfile.TemporaryDirectory() as tmp: tmp_path = tmp + "/" + path_split[-1][:-5] copy(path, "file://" + tmp_path + ".gpkg") dataSource = ogr.Open(tmp_path + ".gpkg", 0) elif path.endswith(".geojson"): with tempfile.TemporaryDirectory() as tmp: tmp_path = tmp + "/" + path_split[-1][:-8] copy(path, "file://" + tmp_path + ".geojson") dataSource = ogr.Open(tmp_path + ".geojson", 0) elif path.endswith(".csv"): # Récupération des informations optionnelles if "csv" in kwargs: csv = kwargs["csv"] else: csv = {} if "srs" in csv and csv["srs"] is not None: srs = csv["srs"] else: srs = "EPSG:2154" if "column_x" in csv and csv["column_x"] is not None: column_x = csv["column_x"] else: column_x = "x" if "column_y" in csv and csv["column_y"] is not None: column_y = csv["column_y"] else: column_y = "y" if "column_wkt" in csv: column_wkt = csv["column_wkt"] else: column_wkt = None with tempfile.TemporaryDirectory() as tmp: tmp_path = tmp + "/" + path_split[-1][:-4] name_fich = path_split[-1][:-4] copy(path, "file://" + tmp_path + ".csv") with tempfile.NamedTemporaryFile( mode="w", suffix=".vrt", dir=tmp, delete=False ) as tmp2: vrt_file = "<OGRVRTDataSource>\n" vrt_file += '<OGRVRTLayer name="' + name_fich + '">\n' vrt_file += "<SrcDataSource>" + tmp_path + ".csv</SrcDataSource>\n" vrt_file += "<SrcLayer>" + name_fich + "</SrcLayer>\n" vrt_file += "<LayerSRS>" + srs + "</LayerSRS>\n" if column_wkt is None: vrt_file += ( '<GeometryField encoding="PointFromColumns" x="' + column_x + '" y="' + column_y + '"/>\n' ) else: vrt_file += ( '<GeometryField encoding="WKT" field="' + column_wkt + '"/>\n' ) vrt_file += "</OGRVRTLayer>\n" vrt_file += "</OGRVRTDataSource>" tmp2.write(vrt_file) dataSourceVRT = ogr.Open(tmp2.name, 0) os.remove(tmp2.name) dataSource = ogr.GetDriverByName("ESRI Shapefile").CopyDataSource( dataSourceVRT, tmp_path + "shp" ) else: raise Exception("This format of file cannot be loaded") else: dataSource = ogr.Open(get_osgeo_path(path), 0) multipolygon = ogr.Geometry(ogr.wkbGeometryCollection) try: layer = dataSource.GetLayer() except AttributeError: raise Exception(f"The content of {self.path} cannot be read") layers = [] for i in range(dataSource.GetLayerCount()): layer = dataSource.GetLayer(i) name = layer.GetName() count = layer.GetFeatureCount() layerDefinition = layer.GetLayerDefn() attributes = [] for j in range(layerDefinition.GetFieldCount()): fieldName = layerDefinition.GetFieldDefn(j).GetName() fieldTypeCode = layerDefinition.GetFieldDefn(j).GetType() fieldType = layerDefinition.GetFieldDefn(j).GetFieldTypeName(fieldTypeCode) attributes += [(fieldName, fieldType)] for feature in layer: geom = feature.GetGeometryRef() if geom is not None: multipolygon.AddGeometry(geom) layers += [(name, count, attributes)] self.layers = layers self.bbox = multipolygon.GetEnvelope() return self @classmethod def from_parameters(cls, path: str, bbox: tuple, layers: list) -> "Vector": """Constructor method of a Vector from a parameters Args: path (str): path to the file/object bbox (Tuple[float, float, float, float]): bounding rectange in the data projection layers (List[Tuple[str, int, List[Tuple[str, str]]]]) : Vector layers with their name, their number of objects and their attributes Examples: try : vector = Vector.from_parameters("file://tests/fixtures/ARRONDISSEMENT.shp", (1,2,3,4), [('ARRONDISSEMENT', 14, [('ID', 'String'), ('NOM', 'String'), ('INSEE_ARR', 'String'), ('INSEE_DEP', 'String'), ('INSEE_REG', 'String'), ('ID_AUT_ADM', 'String'), ('DATE_CREAT', 'String'), ('DATE_MAJ', 'String'), ('DATE_APP', 'Date'), ('DATE_CONF', 'Date')])]) except Exception as e: print(f"Vector creation raises an exception: {exc}") """ self = cls() self.path = path self.bbox = bbox self.layers = layers return self
Static methods
def from_file(path: str, **kwargs) ‑> Vector
-
Constructor method of a Vector from a file (Shapefile, Geopackage, CSV and GeoJSON)
Args
path
:str
- path to the file/object
**csv (Dict[str : str]) : dictionnary of CSV parameters : -srs (str) ("EPSG:2154" if not provided) : spatial reference system of the geometry -column_x (str) ("x" if not provided) : field of the x coordinate -column_y (str) ("y" if not provided) : field of the y coordinate -column_wkt (str) (None if not provided) : field of the WKT of the geometry if WKT use to define coordinate
Examples
from rok4.vector import Vector
try: vector = Vector.from_file("file://tests/fixtures/ARRONDISSEMENT.shp") vector_csv1 = Vector.from_file("file://tests/fixtures/vector.csv" , csv={"delimiter":";", "column_x":"x", "column_y":"y"}) vector_csv2 = Vector.from_file("file://tests/fixtures/vector2.csv" , csv={"delimiter":";", "column_wkt":"WKT"})
except Exception as e: print(f"Vector creation raises an exception: {exc}")
Raises
MissingEnvironmentError
- Missing object storage informations
StorageError
- Storage read issue
Exception
- Wrong column
Exception
- Wrong data in column
Exception
- Wrong format of file
Exception
- Wrong data in the file
def from_parameters(path: str, bbox: tuple, layers: list) ‑> Vector
-
Constructor method of a Vector from a parameters
Args
path
:str
- path to the file/object
bbox
:Tuple[float, float, float, float]
- bounding rectange in the data projection
layers (List[Tuple[str, int, List[Tuple[str, str]]]]) : Vector layers with their name, their number of objects and their attributes
Examples
try : vector = Vector.from_parameters("file://tests/fixtures/ARRONDISSEMENT.shp", (1,2,3,4), [('ARRONDISSEMENT', 14, [('ID', 'String'), ('NOM', 'String'), ('INSEE_ARR', 'String'), ('INSEE_DEP', 'String'), ('INSEE_REG', 'String'), ('ID_AUT_ADM', 'String'), ('DATE_CREAT', 'String'), ('DATE_MAJ', 'String'), ('DATE_APP', 'Date'), ('DATE_CONF', 'Date')])])
except Exception as e: print(f"Vector creation raises an exception: {exc}")