I would like to merge a road layer .shp and a BT souterrain.gejoson network layer to create a single layer. This will allow me to form a unified network to calculate the shortest path between two points from two different layers of points (PDL and electrical_substation), using the newly merged layer.
btsouterrains.geao informations roads.schp informations
But when I use 'merge vector layers' and then this code:
from qgis.core import QgsProject, QgsGeometry, QgsFeature, QgsVectorLayer, QgsSymbolLayerUtils
import processing
# Couche PDL, postes électriques et routes
couche_new_point_bt = QgsProject.instance().mapLayersByName('PDL')[0]
couche_postes = QgsProject.instance().mapLayersByName('e_poste_electrique')[0]
couche_routes = QgsProject.instance().mapLayersByName('fusion')[0]
# Vérifier si la couche pdl a des entités sélectionnées
selected_features = couche_new_point_bt.selectedFeatures()
if selected_features:
# Utiliser le premier point sélectionné
point_bt = selected_features[0]
else:
# Sinon, utiliser le dernier point ajouté à la couche
features = [feature for feature in couche_new_point_bt.getFeatures()]
point_bt = features[-1] if features else None
if not point_bt:
raise ValueError("Aucun point BT sélectionné ou présent dans la couche New_Point_BT.")
# Calcule la distance entre le point BT et tous les postes électriques et sélectionne le plus proche
dist_min = float('inf')
id_poste_proche = None
for poste in couche_postes.getFeatures():
dist = point_bt.geometry().distance(poste.geometry())
if dist < dist_min:
dist_min = dist
id_poste_proche = poste.id()
# Trouver les coordonnées du poste électrique le plus proche
poste_proche_feature = couche_postes.getFeature(id_poste_proche)
poste_proche_point = poste_proche_feature.geometry().asPoint()
# Chemin le plus court
params = {
'INPUT': couche_routes.id(),
'START_POINT': f'{point_bt.geometry().asPoint().x()},{point_bt.geometry().asPoint().y()}',
'END_POINT': f'{poste_proche_point.x()},{poste_proche_point.y()}',
'OUTPUT': 'memory:'
}
result = processing.run("qgis:shortestpathpointtopoint", params)
# Créer une nouvelle couche vectorielle pour le résultat
new_couche = result['OUTPUT']
# Personnaliser l'apparence de la couche
symbol = new_couche.renderer().symbol()
symbol.setWidth(1.0) # Définir l'épaisseur de la ligne
symbol.setColor(QgsSymbolLayerUtils.decodeColor('red')) # Définir la couleur de la ligne
new_couche.triggerRepaint() # Rafraîchir l'affichage de la couche
# Renommer la nouvelle couche
new_couche.setName("Raccordement le plus proche")
# Ajouter le résultat comme une nouvelle couche dans QGIS
QgsProject.instance().addMapLayer(new_couche)
from qgis.core import QgsCoordinateReferenceSystem, QgsCoordinateTransform, QgsProject
# Configuration de la transformation de coordonnées
crs_source = QgsCoordinateReferenceSystem("EPSG:4326") # Système source WGS 84
crs_destination = QgsCoordinateReferenceSystem("EPSG:32740") # UTM Zone 40S pour l'île de La Réunion
transform = QgsCoordinateTransform(crs_source, crs_destination, QgsProject.instance())
total_length_meters = 0
for feature in new_couche.getFeatures():
geom = feature.geometry()
geom.transform(transform) # Transformer la géométrie en UTM Zone 40S
total_length_meters += geom.length()
print(f"La longueur du chemin le plus court est : {total_length_meters:.2f} mètres")
it gives me a 'no path' error, even though there is a path visually. I think some data processing work is needed here, but I don't know how to do it.