0

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. attribute table

btsouterrains.geao informations informations btsouterrains..geoson roads.schp informationsroads 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.

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Browse other questions tagged or ask your own question.