Annonce
Pour sa 21ème année, l’association GeoRezo a toujours besoin de vous !
10€ = 1 mois de frais bancaires ; 15€ = 12 mois de nom de domaine ; 30€ = 1 semaine de location des serveurs …
Retrouver nos membres bienfaiteurs
#1 Tue 05 November 2019 14:55
- Njoy
- Participant actif
- Lieu: Lyon
- Date d'inscription: 29 Nov 2018
- Messages: 89
QGIS: Conseils/Infos ?
Bonjour,
Dans le but de déploiement Télécom, j'ai deux couches,
- une couche infrastructure [INFRA.SHP], en vecteurs, avec toutes les infrastructures catégorisées en table attributaire (aérien, souterrain, façade)
- une couche câble [CABLES.SHP], en vecteurs, avec mes capacités de câbles catégorisées en table attributaire
Mes entités (cables) de ma couche [CABLE] sont strictement tracés (je l'espère en tous cas) sur ma couche [INFRA]
Mes entités (cables) de ma couche [CABLE] peuvent être tracés sur une multitude d’élément de ma couche INFRA (un cable commence en aérien, chemine en souterrain et termine en façade par exemple)
Je souhaiterais par un quantitatif de longueur de mes cables par '[CABLE].capacité' et '[INFRA].mode_de_pose'
Exemple :
Capacité1 | Capacité 2 | Capacité3
Souterrain 120m | 423m | 500m
Aerien 190m | 123m | 600m
Facade 453m | 496m | 300m
Quelqu'un saurait m'aider ?
J'ai pas mal de bases en python, et suis ouvert à d'autres propals
Cdt, NJOY
Hors ligne
#2 Thu 07 November 2019 15:55
Re: QGIS: Conseils/Infos ?
Bonjour,
Il faut rapatrier l'info de mode de transport dans câble.
Le plus simple est de créer une couche virtuelle avec la formule :
Code:
with a as ( select c.*, i.mode, st_length(c.geometry) as longueur from cable c, infra i where st_intersects(c.geometry, i.geometry) ) select mode, capacite, sum(longueur) longueur from a group by mode, capacite
geodata au cerema et petits billets en géomatique
Hors ligne
#3 Fri 08 November 2019 10:55
- Njoy
- Participant actif
- Lieu: Lyon
- Date d'inscription: 29 Nov 2018
- Messages: 89
Re: QGIS: Conseils/Infos ?
Bonjour,
Merci pour le retour, j’exécute ce code de quelle manière ?
J'ai fais le test en executant via SQL (boite à outils / executer sql), voici l'erreur qui m'est renvoyée :
2019-11-08T10:54:39 2 Uncaught error while executing algorithm
Traceback (most recent call last):
File "C:/PROGRA~1/QGIS2~1.18/apps/qgis-ltr/./python/plugins\processing\core\GeoAlgorithm.py", line 203, in execute
self.processAlgorithm(progress)
File "C:/PROGRA~1/QGIS2~1.18/apps/qgis-ltr/./python/plugins\processing\algs\qgis\ExecuteSQL.py", line 137, in processAlgorithm
vLayer.crs())
File "C:/PROGRA~1/QGIS2~1.18/apps/qgis-ltr/./python/plugins\processing\core\outputs.py", line 326, in getVectorWriter
crs, options)
File "C:/PROGRA~1/QGIS2~1.18/apps/qgis-ltr/./python/plugins\processing\tools\vector.py", line 600, in __init__
uri = GEOM_TYPE_MAP[geometryType] + "?uuid=" + unicode(uuid.uuid4())
KeyError: 0
cdt
NJOY
Hors ligne
#4 Wed 13 November 2019 10:14
- Njoy
- Participant actif
- Lieu: Lyon
- Date d'inscription: 29 Nov 2018
- Messages: 89
Re: QGIS: Conseils/Infos ?
Bonjour,
Je suis toujours bloqué, je pensais sinon trouver une méthode pour découper mes cables (polylignes) a chaque changement de type d'infrastructure
Quelqu'un saurait m'aider ?
Merci
Hors ligne
#5 Wed 13 November 2019 14:46
Re: QGIS: Conseils/Infos ?
Bonjour,
Dans ma manip' il faut ajouter une couche virtuelle, soit : couche > ajouter une couche virtuelle
La couche changera dynamiquement avec les données qui changent
geodata au cerema et petits billets en géomatique
Hors ligne
#6 Thu 14 November 2019 16:12
- Njoy
- Participant actif
- Lieu: Lyon
- Date d'inscription: 29 Nov 2018
- Messages: 89
Re: QGIS: Conseils/Infos ?
Bonjour,
Merci pour le retour, j'ai réussis à effectuer votre procédure, mais j'ai beaucoup trop de quantité, beaucoup + que la normale
Il se trouve que ça compte toutes les infra touchées et non les infra superposées
cdt
NJOY
Hors ligne
#7 Fri 15 November 2019 11:33
Re: QGIS: Conseils/Infos ?
Pour avoir les infras superposées, vous pourriez utiliser un tampon sur les infras, de cette façon, et utiliser st_contains :
Code:
with a as ( select c.*, i.mode, st_length(c.geometry) as longueur from cable c, infra i where st_contains(st_buffer(i.geometry,10), c.geometry) ) select mode, capacite, sum(longueur) longueur from a group by mode, capacite
geodata au cerema et petits billets en géomatique
Hors ligne
#8 Fri 22 November 2019 14:51
- Njoy
- Participant actif
- Lieu: Lyon
- Date d'inscription: 29 Nov 2018
- Messages: 89
Re: QGIS: Conseils/Infos ?
Bonjour,
Merci pour le retour, j'ai des résultats prometteurs mais toujours éloignés de la réalité,
J'ai quelques interrogations :
Si j'ai plusieurs câbles qui passent sur le même infra, seront-ils bien compté plusieurs fois ?
Le buffer de 10 correspond à quel ordre de grandeur ?
Voici ce que j'obtiens :
cm_typ_imp cb_capafo longueur
SOUTERRAIN 12 269.45
AERIEN 24 89.64
SOUTERRAIN 24 338.91
AERIEN 36 210.40
SOUTERRAIN 36 4.99
SOUTERRAIN 48 9.91
AERIEN 48 216.10
Voici le détail de ma table cable :
Étiquettes de lignes Somme de cb_long
12 1439,44
24 3677,55
36 208,40
48 473,89
96 240,81
144 387,76
Auriez vous des idées ?
J'ai essayé via Pyhton, de correler les points d'origine et extrémité de mes cheminements par rapports au points des cables, mais je suis toujours loin de la réalité, sur cette exercice :
12FO SOUT : 497m
24FO SOUT : 2189m
24FO AERIEN : 7735m
96FO SOUT : 68m
144FO : 296m
Voici le détail du code (très barbare je l'admet) pour la 12FO souterraine :
Code:
## try split pour pose de cables #layer cables layer_cable = str(self.dlg.lineEdit_111.text()) layer_select = QgsMapLayerRegistry.instance().mapLayersByName(layer_cable)[0] #layer cheminement layer_cheminement = str(self.dlg.lineEdit_88.text()) layer_to_select = QgsMapLayerRegistry.instance().mapLayersByName(layer_cheminement)[0] #precision pour simplification geometrie car_prec = 10 long_charX = 16 long_charY = 16 preci_z = float(0.1) preci_zn = float(-0.1) # pour 12fo sout r = 0 lenght = 0 query_cb = '"cb_capafo" = \'12\' and $geometry IS NOT NULL' query_ch = '$geometry IS NOT NULL and ("cm_typ_imp" = \'SOUTERRAIN\' or "cm_typ_imp" = \'IMMEUBLE\')' n = 0 features = layer_select.getFeatures(QgsFeatureRequest().setFilterExpression(query_cb)) for f in features: geom = f.geometry() features2 = layer_to_select.getFeatures(QgsFeatureRequest().setFilterExpression(query_ch)) for feat_to_select in features2: vertices = feat_to_select.geometry().asPolyline() n = len(vertices) vertices_cable = f.geometry().asPolyline() n_cable = len(vertices_cable) geometry_che = feat_to_select.geometry().asPolyline() geometry_cheW = feat_to_select.geometry() geometry_cableZ = f.geometry().asPolyline() pt_geometry_che = geometry_che[0] pt_geometry_che2 = geometry_che[-1] pt_geometry_che_mid = geometry_che[(n-1)/2] cc = 0 valid0 = 0 valid1 = 0 valid2 = 0 save = 0 geom2 = feat_to_select.geometry() if n == 2 : valid0 = 0 valid1 = 0 if geom.contains(geom2): r = r + lenght else : while cc < n_cable: pt_geometry_cableZ = geometry_cableZ[cc] arr_xenr = pt_geometry_cableZ.x() arr_yenr = pt_geometry_cableZ.y() arr_x0 = pt_geometry_che.x() arr_y0 = pt_geometry_che.y() arr_x1 = pt_geometry_che2.x() arr_y1 = pt_geometry_che2.y() if ((preci_zn < (float(str(arr_x0)[0:long_charX]) - float(str(arr_xenr)[0:long_charX])) < preci_z) and (preci_zn < (float(str(arr_y0)[0:long_charY]) - float(str(arr_yenr)[0:long_charY])) < preci_z)): valid0 = 1 if ((preci_zn < (float(str(arr_x1)[0:long_charX]) - float(str(arr_xenr)[0:long_charX])) < preci_z) and (preci_zn < (float(str(arr_y1)[0:long_charY]) - float(str(arr_yenr)[0:long_charY])) < preci_z)): valid1 = 1 cc = cc + 1 if valid0 == 1 and valid1 == 1: r = r + lenght if n > 2 and n <7 : valid0 = 0 valid1 = 0 valid2 = 0 if geom.contains(geom2): r = r + lenght else : while cc < n_cable: pt_geometry_cableZ = geometry_cableZ[cc] arr_xenr = pt_geometry_cableZ.x() arr_yenr = pt_geometry_cableZ.y() arr_x0 = pt_geometry_che.x() arr_y0 = pt_geometry_che.y() arr_x1 = pt_geometry_che2.x() arr_y1 = pt_geometry_che2.y() arr_xmid = pt_geometry_che_mid.x() arr_ymid = pt_geometry_che_mid.y() if ((preci_zn < (float(str(arr_x0)[0:long_charX]) - float(str(arr_xenr)[0:long_charX])) < preci_z) and (preci_zn < (float(str(arr_y0)[0:long_charY]) - float(str(arr_yenr)[0:long_charY])) < preci_z)): valid0 = 1 if ((preci_zn < (float(str(arr_x1)[0:long_charX]) - float(str(arr_xenr)[0:long_charX])) < preci_z) and (preci_zn < (float(str(arr_y1)[0:long_charY]) - float(str(arr_yenr)[0:long_charY])) < preci_z)): valid1 = 1 if ((preci_zn < (float(str(arr_xmid)[0:long_charX]) - float(str(arr_xenr)[0:long_charX])) < preci_z) and (preci_zn < (float(str(arr_ymid)[0:long_charY]) - float(str(arr_yenr)[0:long_charY])) < preci_z)): valid2 = 1 cc = cc + 1 if ((valid0 == 1 and valid1 == 1) or (valid2 == 1 and valid1 == 1) or (valid2 == 1 and valid0 == 1)): r = r + lenght if n > 6 : pt_geometry_che = geometry_che[0] pt_geometry_che2 = geometry_che[n-1] pt_geometry_che5 = geometry_che[n/2] pt_geometry_che_deux = geometry_che[1] pt_geometry_che2_avantder = geometry_che[n-2] pt_geometry_che5_avantmiddle = geometry_che[(n/2)-1] pt_geometry_che5_apresmiddle = geometry_che[(n/2)+1] if ((geom.contains(pt_geometry_che) and geom.contains(pt_geometry_che2)) or (geom.contains(pt_geometry_che5) and geom.contains(pt_geometry_che2)) or (geom.contains(pt_geometry_che) and geom.contains(pt_geometry_che5)) or (geom.contains(pt_geometry_che_deux) and geom.contains(pt_geometry_che5_avantmiddle)) or (geom.contains(pt_geometry_che5_avantmiddle) and geom.contains(pt_geometry_che2_avantder)) or (geom.contains(pt_geometry_che2_avantder) and geom.contains(pt_geometry_che_deux))) or (geom.contains(pt_geometry_che_deux) and geom.contains(pt_geometry_che5_apresmiddle)) or (geom.contains(pt_geometry_che5_apresmiddle) and geom.contains(pt_geometry_che2_avantder)) or (geom.contains(pt_geometry_che5_apresmiddle) and geom.contains(pt_geometry_che5_avantmiddle)): lenght = feat_to_select.geometry().length() r = r + lenght self.dlg.lineEdit_2.setText(str(r))
Dernière modification par Njoy (Fri 22 November 2019 15:00)
Hors ligne