Daha çox

Eyni eynilik olmadığı, ancaq eyni həndəsə olmadığı yerləri bir qatdan ikinciyə yeniləyin


Bir böyük problemim var və dəyəri bir qatdan digər təbəqəyə çatdırmaqdır. Bir milyondan çox əlaqəsi olan bir şəbəkədir və bir cədvəli + 100 000 keçid qatından yeniləməyim lazımdır. QGIS istifadə edirəm və kəsişməyə çalışdım, daha kiçik məlumatlarla üst-üstə düşürəm, amma istədiyim nəticəni əldə edə bilmirəm. İki təbəqənin eynisi həndəsədir, lakin, məsələn, bir təbəqə bir neçə keçid (yol kəsişməsi) ola bilən ikinci təbəqə ilə müqayisədə bir uzun əlaqəyə sahib ola bilər, beləliklə üst-üstə düşür və kəsişmə işə yaramır. "Məkana görə seçin" və "Giriş xüsusiyyətlərini seçim xüsusiyyətlərinə tamamilə daxil et" cəhdini etdim, istədiyim kimi işlədi, amma daha böyük məlumatları sınayanda orada çox saat (və ya bir gecə) oturdu və bilmirəm işləyirsə və ya sadəcə prosesdə dondurulubsa. İstədiyim yalnız məlumatları uyğunlaşdırmaq və dəyərləri bir təbəqədən digərinə yeniləməkdir. Eyni kimlik olmadığı üçün "Qoşul" funksiyasından istifadə edə bilmirəm, əksinə həndəsə uyğunluğunu istifadə etməliyəm. Bu problemin başqa bir yolu varmı?


Python konsolunda işlənmiş (və ya redaktordan icra edilmiş) atributların 6 qat verildiyi halda, 1 qatdakı xüsusiyyətlərə köçürüləcəkdir. Layer 1 ana həndəsəni təmin edən xüsusiyyətləri ehtiva edir. Digər təbəqələrdəki xüsusiyyətlərin həndəsələrinə bərabər olmalı, içərisində olmalı və ya bunlardan ayrılmalıdır.

Layer 1 (yolların zolaq sayına görə fərqlənməsi; atribut: Zolaqlar; xüsusiyyət id ilə müəyyənləşdirilmişdir); bu misalda master həndəsə

Layer 2 ((küçə adına görə fərq; atribut: küçə Adı)

Və sair.

İndi Python kodu:

PyQt4.QtCore idxal QVariant idxal datetime çap 'Başlama:', datetime.datetime.now () # qat almaq; master geometriya layer1 olan layer1 = QgsMapLayerRegistry.instance (). mapLayersByName ('thtn-vbg') [0] layer2 = QgsMapLayerRegistry.instance (). mapLayersByName ('thtn -b) 0] layer3 = QgsMapLayerRegistry.instance (). MapLayersByName ('thtn-vbg_speed') [0] layer4 = QgsMapLayerRegistry.instance (). MapLayersByName ('thtn-vbg_street_name.) 0) layer [). 'thtn-vbg_one_way') [0] layer6 = QgsMapLayerRegistry.instance (). mapLayersByName ('thtn-vbg_urban') [0] # hər bir təbəqə üçün master həndəsəsinə ötürülmə atributunu daxil edin attributes_dict = {layer2: 'KLASS', layer3: 'HTHAST', layer4: 'NAMN', layer5: 'RIKTNING', layer6: 'RLID'} # # satırları seqmentlərə ayırın və bütün seqmentləri bir xüsusiyyət daxil olmaqla # usta həndəsi; qatdakı sətir üçün bərabər, içərisində olan və ya digər həndəsələr seqmentlərindən ayrılmalı = {} qat1.getFeatures (): i üçün c = 1 aralığında (len (line.geometry (). asPolyline ()) - 1): seqmentləri [((line.geometry (). asPolyline () [i] [0], line.geometry (). asPolyline () [i] [1]), (line.geometry (). asPolyline () [i +) 1] [0], line.geometry (). AsPolyline () [i + 1] [1]))] = {'fid': line.id (), 'seq': c} c + = 1 # other the_layer, the_attrib in attributes_dict.items (): the_layer.getFeatures () sətri üçün həndəsələr: i üçün üçündür (len (line.geometry (). asPolyline ()) - 1): key = ((line). həndəsə (). asPolyline () [i] [0], line.geometry (). asPolyline () [i] [1]), (line.geometry (). asPolyline () [i + 1] [0], line.geometry (). asPolyline () [i + 1] [1]))) əgər seqmentlərdə açar: seqmentlər [key] [the_attrib] = line.attribute (the_attrib) print 'Segmentments built:', datetime.datetime.now () # seqmentlər üçün seqment üçün composed = {} həll etmək üçün seqmentlər hazırlayın: fid = seqmentlər [seqment] .get ('fid', Yoxdur) əgər fid: əgər fid kompozisiyada deyilsə: composed [fid] = { } _attributes = [seqmentlər [seqment] ['fid']] _attributes.extend ([seqmentlər [seqment] .get (the_attrib, Yoxdur) the_layer, the_attrib in attributes_dict.items ()]) bəstələnmiş [fid] ['attributes' ] = _başqalar [fid] ['zirvələr'] = [(seqmentlər [seqment] ['seq'], (seqment [0] [0], seqment [0] [1]), (seqment [1] [0 ], seqment [1] [1]))] başqa: tərtib [fid] ['köşeler']. əlavə ((seqmentlər [seqment] ['seq'], (seqment [0] [0], seqment [0] [1]), (seqment [1] [0], seqment [1] [1])))) 'Seqmentlər sifariş edildi' yazdır, datetime.datetime.now () # QGIS qatını atribut qat ilə müəyyənləşdirin qat = QgsVectorLayer ('LineString ? crs = EPSG: 3006 ',' Nəticə ',' yaddaş ') prov = layer.dataProvider () atributları = [QgsField (' fid ', QVariant.Int)] attributes.extend ([QgsField (the_attrib, QVariant.String) the_layer üçün attributes_dict.items ()]) attributes.append (QgsField ('length', QVariant.Double)) prov.addAttributes (attributes) QgsMapLayerRegistry.instance (). addMapLayer (layer) # xüsusiyyətləri xüsusiyyətləri yaradır = [] com.-da bəstələmək üçün layer.startEditing () yarandı: bəstələnmiş [tərtib] ['köşeler']. sort () feat = QgsFeature () təpələr = [QgsPoint (bəstələnmiş [bəstələyən] ['köşeler'] [0] [1] [0], bəstələnmiş [bəstələyən] [' zirvələr '] [0] [1] [1]), QgsPoint (bəstələnmiş [bəstələmək] [' təpələr '] [0] [2] [0], bəstələnmiş [bəstələmək] [' təpələr '] [0] [2] [1])] aralığında idx üçün (1, len (bəstələnmiş [bəstələmək] ['təpələr'])): vertices.append (QgsPoint (bəstələnmiş [bəstələmək] ['təpələr'] [idx] [2] [0] , bəstələnmiş [bəstələmək] ['zirvələr'] [idx] [2] [1])) feat.setGeometry (QgsGeometry.fromPolyline (vertices)) bəstələnmiş [bəstələmək] ['atributlar']. əlavə etmək (feat.geometry (). length ()) feat.setAttributes (bəstələnmiş [compose] ['atributlar']) feats.append (feat) print 'Sətirlər tikildi:', datetime.datetime.now () # nəhayət, yaradılan bütün xüsusiyyətləri əlavə edin və redaktə edin prov.addFeatures (feats) layer.updateExtents () layer.commitChanges () print 'Finished:', datetime.datetime.now ()

Nəticə diskdə saxlaya biləcəyiniz bir yaddaş qatına yazılır. Və bu son nəticə:

Zolaqların sayı ilə simvollaşdırılan və küçə adı ilə işarələnən yollar.

Ssenari 5 qat olmaqla 30.000 xüsusiyyətdən atribut alan 16.000 master xüsusiyyətləri ilə sınaqdan keçirildi. QGIS 2.8.2 ilə 3 yaşlı PC-də işləmə müddəti 1 dəqiqə idi


Videoya baxın: Feza fiqurlari (Oktyabr 2021).