Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

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 …

Faire un don 

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

MathieuR
Membre
Lieu: aix-en-provence
Date d'inscription: 16 Feb 2009
Messages: 1690
Site web

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

MathieuR
Membre
Lieu: aix-en-provence
Date d'inscription: 16 Feb 2009
Messages: 1690
Site web

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

MathieuR
Membre
Lieu: aix-en-provence
Date d'inscription: 16 Feb 2009
Messages: 1690
Site web

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

 

Pied de page des forums

Powered by FluxBB