Vairāk

Kā izveidot vairākus QGIS slāņus no vairākiem teksta failiem?

Kā izveidot vairākus QGIS slāņus no vairākiem teksta failiem?


Man ir daži simti txt failu (katrs attēlo upes gultnes profila līniju), kas QGIS jāielādē kā (punktu) slāņi. Daļējs piemērs:

4504764.8331;5374251.3024;397.8871;2 4504764.7761;5374250.8056;397.8555;2 4504764.7191;5374250.3089;397.8295;2 4504764.6621;5374249.8121;397.8149;2 4504764.6051;5374249.3154;397.7977;2 4504764.5481;5374248.8186;397.7725;2

Tas darbojas manuāli (slānis -> pievienot norobežotu teksta slāni, pēc tam pārdēvēt kolonnas pēc importēšanas), taču, ņemot vērā apjomu, es to visu nevaru izdarīt ar rokām.

Šeit es atradu līdzīgu divus gadus vecu jautājumu: Kā vienā solī importēt vairākus teksta failus, bet "izveidot vienkārša teksta failu ar nosaukumu .vrt fails katram no csv failiem" neizklausās tik persicīgi. Failiem trūkst arī galvenes rindiņas, bet es zinu formātu: "X; Y; Z; klasifikācija".

Vai ir kāds veids, kā to izdarīt, nekodējot teksta ģeneratoru šiem vrt failiem un neievietojot galvenes rindiņas visos csvs?


Pieņemot, ka visi jūsu teksta faili atrodas vienā direktorijā, varat palaist šo koda fragmentu QGIS Python konsolē, lai faili tiktu ielādēti kā atsevišķi slāņi QGIS:

importēt os.path, glob layer = [] failam glob.glob ('/tmp/xy/*. txt'): # Mainīt šo bāzes ceļu uri = "file: ///" + file + "? delimiter = %s & xField =%s & yField =%s & useHeader = no & crs = epsg: 3116 "%("; "," field_1 "," field_2 ") vlayer = QgsVectorLayer (uri, os.path.basename (fails)," delimitedtext ") atskaņotājs. addAttributeAlias ​​(0, 'X') vlayer.addAttributeAlias ​​(1, 'Y') vlayer.addAttributeAlias ​​(2, 'Z') vlayer.addAttributeAlias ​​(3, 'klasifikācija') slāņi.append (vlayer) QgsMapLayerRegistry.inst. addMapLayers (slāņi)

Kā redzat, tas darbojas GNU/Linux ceļiem, es nezinu, kā uri (konkrēti faila ceļam) vajadzētu izskatīties sistēmā Windows. Pielāgojiet arī crs savam gadījumam.

Es arī gribēju jums pastāstīt, kā automātiski mainīt lauku nosaukumus, taču šķiet, ka uz norobežotiem tekstiem balstītus slāņus nevar rediģēt. Es domāju, ka viss, ko jūs varat darīt, ir piešķirt kolonnām aizstājvārdus, kā to dara kods.


Apvienojiet visus teksta failus Windows direktorijā ar kopēšanas komandu:

kopēt *.txt river.txt

Operētājsistēmā Linux izmantojiet komandu cat (concatenate):

kaķis *> river.txt

Pēc tam apvienotā teksta faila QGIS izmantojiet pogu Pievienot norobežotu teksta slāni.


Atbilde no @GermanCarrillo man noderēja un ietaupīja daudz laika.

Ar teksta failu, kas ir strukturēts šādi: laiks [s], austrums [m], ziemeļaustrums [m], augstums [m], rullītis [gr.], Augstums [leņķis], pagrieziens 170258,002391,332731.5085,5794908.7794,46.1642, 0.409501631306, -5.248541020385,0.684043081908

Kods, kas man darbojās operētājsistēmā Windows, ir šāds:

importēt os.path, glob layer = [] failam glob.glob ('C:/Projects/2829/locations/20160524/*. txt'): # Mainīt šo bāzes ceļu uri = "file: ///" + file + "? delimiter =%s & xField =%s & yField =%s & useHeader = no & crs = epsg: 28355"%(",", "field_2", "field_3") vlayer = QgsVectorLayer (uri, os.path.basename (fails), "delimitedtext") vlayer.addAttributeAlias ​​(1, 'X') vlayer.addAttributeAlias ​​(2, 'Y') layer.append (vlayer) QgsMapLayerRegistry.instance (). addMapLayers (slāņi)

Es gribētu kaut ko pievienot Germán Carrillo atbildei. Logiem un QGIS 2.18.9 viņa kods man darbojas perfekti. Es tikko pievienoju koda rindiņu, lai identificētu ceļu logos:

pathName = r'put/your/path/here/spearated/by/slīpsvītras/'

Jūs varat nokopēt+ielīmēt savu ceļu no Windows mapes un mainīt slīpsvītras uz slīpsvītrām / pirms tā kopēšanas uz pathName.

Pēc tam jūs vienkārši maināt rindu, kā norādīts tālāk

failam glob.glob (pathName+'*. txt'):

Ceru tas palīdzēs


no @nitrofruit @GermánCarrillo

Pārveidots QGIS 3:

importēt os.path, glob no qgis.core importēt QgsProject, QgsVectorLayer layer = [] failam glob.glob ('C:/filepath/*. txt'): # Mainiet šo bāzes ceļu un mainiet slīpsvītras, lai pārsūtītu slīpsvītras uri = "file: ///" + file + "? delimiter =%s & xField =%s & yField =%s & useHeader = no & crs = epsg: 28355"%(",", "field_2", "field_3") #(delimetrs, XField, YField ) #1. kolonna failā ir 1. sleja vlayer = QgsVectorLayer (uri, os.path.basename (fails), "norobežots teksts") vlayer.setFieldAlias ​​(1, 'X') #šāda kolonnu secība: 0, 1, 2 utt. vlayer.setFieldAlias ​​(2, 'Y') slāņi.append (vlayer) QgsProject.instance ().

Es pielāgoju Germán Carrillo kodu xyz failu importēšanai (es to izmantoju upes šķērsgriezumu importēšanai).

Tā kā manu profilu tabulu laukus atdala vairākas atstarpes, kā rezultātā tiek pievienotas vairākas tukšas kolonnas, ja kā decimāldaļu atdalītāju izmantoju "", es pievienoju koda gabalu, lai atstarpes aizstātu ar komatu (secīgas atstarpes tiek aizstātas ar vienu koma). Pārējā daļā es izmantoju to pašu procedūru, kas aprakstīta Germana Karriljo ziņojumā, lai importētu šķērsprofilus.

importēt os.path, glob slāņi = [] profile = 0 directory = 'X:/My/Working/Directory/' # Mainiet šo pamata ceļu uz failu glob.glob (direktorijs+'*. xyz'): f = open ( fails, 'r') lines = f.readlines () f.close () new_file = directory+'PT _'+str (profile+1)+'. xyz' fw = open (new_file, 'w') l rindās : fw.write (re.sub (" s +", ",", l.strip ()) + ' n') fw.close () uri = "fails: ///" + jauns_fails + "? norobežotājs =%s & xField =%s & yField =%s & useHeader = no & crs = epsg: 3943 "%(", "," field_2 "," field_3 ") vlayer = QgsVectorLayer (uri, os.path.basename (fails)," delimitedtext ") vlayer .setFieldAlias ​​(0, 'id') vlayer.setFieldAlias ​​(1, 'X') vlayer.setFieldAlias ​​(2, 'Y') vlayer.setFieldAlias ​​(3, 'Y') layer.append (vlayer) profils += 1 QgsProject .instance (). addMapLayers (slāņi)

Kā redzams QGIS 3:

  • addAttributeAlias ir aizstāts ar setFieldAlias
  • QgsMapLayerRegistry ir aizstāts ar QgsProject

Zem manu krusta profilu sākotnējās struktūras:

1 1950459.685 2218176.491 37.574 0 2 1950468.259 2218173.250 37.466 0 3 1950471.806 2218171.910 37.466 0 4 1950474.013 2218171.076 35.000 0 5 1950477.754 2218169.662 35.000 0 6 1950480.095 2218168.777 36.465 0 7 1950483.372 2218167.539 36.465 0 8 1950495.173 2218163.079 37.214 0

Un iegūto tabulu pēc sloksnes funkcija katrā rindā.

1,1950459.685,2218176.491,37.574,0 2,1950468.259,2218173.250,37.466,0 3,1950471.806,2218171.910,37.466,0 4,1950474.013,2218171.076,35.000,0 5,1950477.754,2218169.662,35.000,0 6,1950480.095,2218168.777,36.465,0 7,1950483.372,2218167.539,36.465,0 8,1950495.173,2218163.079,37.214,0

Iespējams, ir daži uzlabojumi, ko var izdarīt, bet vismaz man tas darbojas.


Saglabājiet vairākus objektus no vektora faila atsevišķos failos, izmantojot Inkscape/OS/Freeware

Man ir lejupielādēts vektora fails (AI formāts). Fails satur vienkāršus dažādu suņu šķirņu vektoru attēlus. Esmu ielādējis failu inkScape, atgrupējis tos un vēlos veidu, kā katru suņu vektoru saglabāt kā atsevišķu failu. Vai ir kāds veids, kā to automatizēt, izmantojot Inkscape vai kādu citu OS/Freeware rīku? Pretējā gadījumā man būs jāizvēlas katrs un Saglabāt kā. Jebkura palīdzība ir visaugstāk novērtēta!

ATJAUNINĀT Paldies JSBueno par padomiem par faktiskā SVG faila rediģēšanu. Es nesapratu, ka SVG ir tikai XML fails. Man vajadzētu būt iespējai viegli izstaigāt failu un eksportēt katru suni kā atsevišķu failu. Tas, starp citu, būs daudz ātrāk nekā to darīt, izmantojot saskarni, kas bija šīs ziņas mērķis. Paldies visiem par padomu.


2 atbildes 2

To var viegli izdarīt, izmantojot iebūvēto skriptu “Slāņu eksportēšana uz failiem”. Vienkārši dodieties uz Fails -& gt Skripti -& gt Slāņu eksportēšana uz failiem.

Ir iespēja apgriezt slāņus, kas katru slāni eksportēs tādā izmērā, kas atbilst tā saturam, vai sākotnējā dokumenta izmērā, ja tas ir izslēgts.

Cik es zinu, jūs to nevarat izdarīt īpaši viedajiem objektiem, bet jūs varat eksportēt tikai redzamos slāņus, tāpēc vienkārši izveidojiet viedos objektus par vienīgajiem redzamajiem slāņiem pirms skripta palaišanas, ja ir citi slāņi, kas jums nav nepieciešami eksportēt.

Varat arī izmantot iebūvēto Photoshop ģeneratora rīku. To varat atrast sadaļā File & gt Generate & gt Image Assets.

Tādējādi tiks eksportēts katrs slānis vai slāņu grupa, kurai ir faila nosaukums (piemēram: Layer0001.png, layer3.jpg).

Starp vairākām šī rīka piedāvātajām iespējām ir tas, ka jūs pat varat eksportēt gan grupu, gan visus slāņus iekšpusē vai pat eksportēt vairākus failus ar dažādu formātu un izšķirtspēju no viena slāņa.

Tā ir laba iespēja, ja vēlaties to eksportēt un atjaunināt reālā laikā. Jums pat nav jāiet uz izvēlnēm, tas ir tikai automātiski.


4 atbildes 4

Vēl viens risinājums vienas komandas atkārtošanai ar dažādiem parametriem ir paralēles izmantošana.

Izveidojiet ar tabulāciju norobežotu failu sample.txt, kas satur paraugu nosaukumus un informāciju par jūsu lasīšanas grupām, piemēram:

Tad jūs varat izmantot paralēli šādi:

Katrai rindai paraugos.txt tiek sākts jauns process, aizstājot <1> un <2> ar vērtībām šīs rindas 1. un 2. slejā.

To varētu izdarīt kaut kas līdzīgs šim:

Viens trūkums ir tas, ka tas apstrādās failus viens pēc otra. Ja jums ir kopa, jūs varētu vēlēties tos visus palaist vienlaikus, lai viss būtu ātrāk. Ja jums ir SLURM kopa, varat izmantot darba masīvu, lai veiktu kaut ko līdzīgu.

Ja jums ir paraugu saraksts teksta failā, varat mēģināt aizstāt paraugu masīva komandu iepriekšējā skriptā ar kaut ko līdzīgu šim:

Tas darbosies tikai tad, ja paraugi ir uzskaitīti vienā rindā, atdalīti ar atstarpi. Jums var būt nepieciešams tālāk apstrādāt paraugu failu, lai tos iegūtu šajā formātā, vai izmantot komandu bash readarray.

ja jums ir atkārtota darbplūsma, es ļoti iesaku apskatīt tādas darbplūsmas pārvaldības sistēmas kā snakemake. Esmu arī uzrakstījis nelielu pamācību par biostars par šo tēmu, kas varētu jums noderēt.

Varat izveidot skriptu argumentu nodošanai šādi:

Tagad, ja palaižat bash script.sh paraugu lib, tad paraugs un lib būs skripts kā argumenti attiecīgi $ <1> un $ <2>. Tad viss, kas jums nepieciešams, ir cilpa argumentu nodošanai skriptam:

Varat izmantot nohup, lai palaistu katru paraugu fonā un turpinātu nākamo. Tas būtībā katru komandu iesniegs kā atsevišķu darbu, lai to palaistu citā kodolā. Tie tiks drukāti atsevišķos žurnāla failos sample.out, nevis terminālī. Tas arī turpinās darboties, pat ja atvienosities no SSH vai aizvērsit termināli.

Jums tas jādara tikai vienas vītnes procesiem. Vairāku pavedienu procesiem vai atmiņas ietilpīgiem darbiem tas no mašīnas prasīs daudz. Pat ja tas nav koplietots serveris, tas darbosies slikti, ja atmiņa beigsies un atmiņa būs “jāmaina”, rakstot diskā. Tāpēc vislabāk tos iesniegt pa vienam (iepriekš) vai izmantot kopu ar darba plānotāju.


Aizstāt vairākus vārdus vairākos failos

Es izmantoju sistēmu Windows 7. Man ir jāaizstāj vairāki vairāku vārdu gadījumi vairākos teksta failos.

Piemēram, pieņemsim, ka ir 20 faili. Man ir jāatrod vārdu saraksts un vārdi, ar kuriem tos aizstāt. Pieņemsim, ka atradumu sarakstā ir tādi vārdi kā "12345678", "ABCDEFGH" utt. Aizstāšanas sarakstā ir tādi vārdi kā "76892", "A563" utt.

Katrā failā man ir jāaizstāj katrs vārds manā atrašanas sarakstā ar vārdu aizstāšanas sarakstā. Kā redzat, atrašanas sarakstā un aizstāšanas sarakstā nav tieša modeļa.

Tā vietā, lai to darītu manuāli pa vienam, vai ir kāds veids, kā to izdarīt ātri, izmantojot kādu utilītu (jābūt bezmaksas)? Es to varu izdarīt programmatiski, bet es meklēju atbildi, nerakstot nevienu kodu. Ja starp sarakstu Atrast un sarakstu Aizstāt būtu bijis modelis, es būtu varējis izmantot regulārās izteiksmes, taču nav modeļa.

Piemērs būs noderīgs. Pat izmantojot funkciju TextPad Find in Files, es nedomāju, ka tas ir iespējams, jo nav modeļa. Šajā forumā esmu meklējis vairākus pavedienus, taču daudzas atbildes vai nu attiecas uz makro vai PowerShell utilītas rakstīšanu vai regulāro izteiksmju izmantošanu utt. Es ceru, ka moderatori to nav atzīmējuši kā dublikātu.


Īsā atbilde

mkdir ņem vairākus argumentus, vienkārši palaidiet

Jūs varat izmantot sarakstus, lai izveidotu direktorijus, un tas var kļūt diezgan savvaļas.

Daži piemēri, lai liktu cilvēkiem par to domāt:

  1. 50 katalogi no sa1 līdz sa50
  2. tas pats, bet katrs no direktorijiem turēs 50 reizes no sax1 līdz sax50 (-p izveidos vecāku direktorijus, ja tie neeksistē.
  3. 26 katalogi no a12345 līdz z12345
  4. ar komatu atdalīts saraksts veido 1., 2. un 3. numuru.
  5. 10 katalogi no testa01 līdz testam10.
  6. tāds pats kā 4, bet ar pašreizējo datumu kā direktoriju un 1,2,3 tajā.
  7. tāds pats kā 4, bet ar pašreizējo lietotāju kā direktoriju un 1,2,3 tajā.

Tātad, ja es to pareizi sapratu un vēlaties izveidot dažus direktorijus un tajos jaunus katalogus, varat rīkoties šādi:

un iegūt sa1, sa2. sa10 un katrā 1., 2. un 3. dirsā.

Tas ir ļoti vienkārši, ļauj izveidot direktoriju struktūru, piemēram:

To var izdarīt vienā komandā, piemēram:

Esiet piesardzīgs, lai neievadītu nevienu atstarpi

Izveidojiet vajadzīgo direktoriju nosaukumu sarakstu, atdalot komatu vietā, izmantojot rindiņu pārtraukumus. Saglabājiet šo sarakstu.

Tagad jūsu sarakstā vajadzētu būt visiem nosauktajiem direktorijiem.

Kaut kas tamlīdzīgs? (paldies muru par drukas padomu)

Lietošanas ērtībai varat to iesaiņot funkcijā:

Tātad jūs vēlaties ar komatiem atdalītu direktoriju nosaukumu sarakstu? To var izdarīt.

Apvalks + kodols

Tā kā visi publicē zīmuļus, šeit ir arī mans (mkdir + parametru aizstāšana plus + čaulas novirzīšana).

AWK ir teksta apstrādes valoda, taču tai ir ļoti jauka sistēmas () funkcija, kas izsauks noklusējuma apvalku un palaidīs iekavās iekļauto komandu [s] (tai jābūt virknei).

Vai arī jūs varētu noņemt, izmantojot funkciju gsub (), un zvanīšanas sistēmu ("mkdir"), taču tā var būt problēma, ja vēlaties izveidot direktorijus ar atstarpēm to nosaukumā


3 atbildes 3

Es domāju, ka joprojām ir nepilnības manā izpratnē par to, ko DP vēlas, jo:

  • valodas grūtības
  • DP piemērs neietver "vairākus rezultātus", kā minēts komentāros

Neskatoties uz to, es jautāšu.

Mathematica ir vairākas izvades iesaiņošanas veidlapas, kas vienā rindā grupēs vairākus objektus. Es domāju, ka jūsu gadījumā Row varētu būt jūsu meklētā forma.

Rindas un stila izmantošana ļauj vienā rindā izvietot un formatēt vairākus gandrīz jebkura veida objektus, ne tikai virknes. Jūs varat ietīt rindu galvenajā stilā un ignorēt galveno stilu jebkuram atsevišķam objektam.


Lai izveidotu CSV failu ar teksta redaktoru, vispirms izvēlieties iecienītāko teksta redaktoru, piemēram, Notepad vai vim, un atveriet jaunu failu. Pēc tam ievadiet teksta datus, kurus vēlaties saturēt failā, atdalot katru vērtību ar komatu un katru rindu ar jaunu rindu.

Saglabājiet šo failu ar paplašinājumu .csv. Pēc tam failu var atvērt, izmantojot Microsoft Excel vai citu izklājlapu programmu. Tas izveidotu datu tabulu, kas līdzīga šim:

Nosaukums1 2. sadaļa Nosaukums3
viens divi trīs
piemērs1 piemērs2 piemērs3

Iekš CSV izveidotajā failā, atsevišķi datu lauki tika atdalīti ar komatiem. Bet ko darīt, ja pašos datos ir komati?

Ja datu lauki jūsu CSV failā ir komati, varat tos aizsargāt, iekļaujot šos datu laukus pēdiņās ("). Komati, kas ir daļa no jūsu datiem, tiek turēti atsevišķi no komatiem, kas norobežo pašus laukus.

Piemēram, pieņemsim, ka viens no mūsu teksta laukiem ir lietotāja izveidots apraksts, kurā aprakstā ir atļauti komati. Ja mūsu dati izskatītos šādi:

Svins Nosaukums Tālrunis Piezīmes
Džims Greisons Vecākais menedžeris (555)761-2385 Runāja otrdien, viņš ir ieinteresēts
Preskilla Vinstona Attīstības direktors (555)218-3981 teica nākamnedēļ piezvanīt vēlreiz
Melisa Potere Kontu vadītājs (555)791-3471 Neinteresē, deva nodošanu

Lai slejas "Piezīmes" saglabātu komatus, šos laukus varam iekļaut pēdiņās. Piemēram:

Kā redzat, pēdiņas ietver tikai tos laukus, kuros ir komati.

Tas pats attiecas uz rindām, kas var būt daļa no jūsu lauka datiem. Visi lauki, kuros datu rindās ir jauna rindiņa, ir jāiekļauj pēdiņās.

Ja jūsu laukos kā dati ir iekļautas pēdiņas, iekšējās pēdiņas ir jādubulto, lai tās varētu pareizi interpretēt. Piemēram, ņemot vērā šādus datus:

Spēlētājs Pozīcija Segvārdi Aktīvie gadi
Skipijs Pētersons Pirmā bāze "Zilais suns", "Burvis" 1908-1913
Buds Grimsbijs Centra lauks "Pļāvējs", "Gargalvis" 1910-1917
Vic Crumb Īsā pietura "Fat Vic", "Icy Hot" 1911-1912

Mēs to varam attēlot CSV failā šādi:

Šeit viss datu lauks ir iekļauts pēdiņās, un pirms iekšējām pēdiņām (aiz tām) tiek ievietota papildu pēdiņa.

Šeit ir noteikumi par to, kā dati jāformatē CSV failā no IETF dokumenta RFC 4180. Šajos piemēros "CRLF"tiek izmantots, lai attēlotu pārvadājuma atgriešanos un līnijas plūsmu (kas kopā veido jaunu līniju).

    Katram ierakstam (datu rindai) jābūt atsevišķā rindā, kas norobežota ar rindas pārtraukumu. Piemēram:


Vienkāršai salikšanai vienā rindā vai kolonnā pietiek ar konvertēšanas rīka pievienošanas opciju. Ņemiet vērā, ka -append savieno visus attēlus vertikāli, izveidojot vienu kolonnu ar n rindas, un +pievienojiet savienojumus horizontāli, izveidojot vienu rindu ar n kolonnas.

Lai iegūtu precīzāku izkārtojuma kontroli, mums būs nepieciešams montāžas rīks. montāžas režīma salikšana salīmēs ievades attēlus kopā, piemēram, pievienošanas opciju, un -tile 1x kontrolē piemērojamo izkārtojumu.

flīze seko formātam kolonnas& reizesrindas, bet, iespējams, trūkst abas puses, un montāža izdomās, kā izpildīt ierobežojumus.

Mēs šeit izmantojam 1x (tieši vienu kolonnu ar jebkuru rindu skaitu), lai iegūtu tādu pašu efektu kā -append. Ja vienreiz nav -tile 1x, tas pievienotos attēliem, piemēram, +append, noklusējuma iestatījums ir -tile x1 (jebkurš kolonnu skaits vienā rindā).


Skatīties video: GIS Lesson 11: WMS. WMTS. WFS in QGIS