Datu dalīšana pa lapām

Lai arī mūsdienās ĢIS datiem vairs nat raksturīgs katrogrāfiskais dalījums pa nomenklatūras lapām, tomēr laiku pa laikam rodas nepieciešamība pēc tām. Ja senāk bija pieņemts datus ne tikai izplatīt, bet arī ražot pa karšu lapām, kas radīja lielas problēmas ar dažādu karšu lapu savietošanu, tad mūsdienās jau biežāk tiek lietota otrādāka pieeja – dati tiek ražoti visai teritorijai kopumā un tikai pirms izplatīšanas tiek sadalīti pa lapām. Vienai sagatavošanā esošai publikācijai bija nepieciešams sagatavot pavadošos datus Shapefile formātā, kas pats par sevi ĢISnet.lv lasītājiem neliktos interesants process, taču no galvenā redaktora atnāca prasība – dati ir jāiesniedz sagriezti pa norādītajām lapām. Lai arī failu skaits bija tikai knapi divi desmiti, tomēr radās vēlme noskaidrot, vai šo sagriezšanu var kaut kā automatizēt.

Te nu mums talkā var nākt GDAL/OGR utilītas, kurām kopš versijas 1.7.0 ir pievienota datu šķēlumu (clip) veidošanas iespēja. Lai varētu veikt datu sadalīšanu pa lapām, vispirms ir nepieciešamas pašas lapas. Te nu paliek speciālistu pašu ziņā kā iegūt lapas – vai ģenerēt, izmantojot ĢIS programmās esošos rīkus, vai izmantot jau esošos tīklus par pamatu. Konkrētajā gadījumā lapas bija jau izsniegtas kā atsevišķi faili, tādēļ problēmu bija vēl mazāk.
ogr2ogr komandas sintakse ir vienkārša:
ogr2ogr -f "ESRI Shapefile" -clipsrc tile.shp izgrieztais.shp datu_avots.shp Vienkārši, taču pirmais mēģinājums cieš neveiksmi – rezultējošais fails ir tukšs. ?!? Izrādās, ka ogr2ogr 1.7.2 nepatīk, ka dati ir dažādās koordinātu sistēmās. Pēc datu pārnešanas uz vienu koordinātu sistēmu – viss ir kārtībā.
Nākamā rindiņa(s) ir izpildāma mapē, kurā atrodas sagriežamie faili. Ceļi ir jāpiekoriģē tā, lai atbilstu vēlamajām mapēm. Ja tiek graizīti cita tipa faili vai arī izgriežamās lapas saturošais fails satur vairāk par vienu objektu, jāspēlējas pašiem ar ogr2ogr parametriem -clipsrclayer un -clipsrcwhere parametriem.

for i in *.shp; do
ogr2ogr -f "ESRI Shapefile" -clipsrc ../tile.shp ../lapa_33/lapa_33_$i $i;
done

Šis kods paņems katru aktīvajā mapē (pwd) esošo .shp falu, izgriezīs tā daļu, kas ietilpst iekš “tile.shp” esošā laukuma un iegūto rezultātu saglabās mapē “lapa_33” ar nosaukumu “lapa_33_orģinālais_nosaukums.shp”.
Vienīgais metodes trūkums – tiek veidotas arī tādi faili, kuri dotajā lapā ir tukši – Shapefile ar 0 objektiem. Ja tas rada problēmas, nāksies vien papildināt doto kodu ar komandu, kas atmetīs šādus tukšos failus. Tas paliek prasmīgajiem lasītājiem kā mājasdarbs – rakstiet komentāros kā. Neliela priekšā teikšana – “ogrinfo -ro -so ../lapa_33/lapa_33_$i”.

Birkas: , ,

5 komentāru to “Datu dalīšana pa lapām”

  1. satelits saka:

    Tas ir uz linuxveidīgā vai ms windows ? Izskatās uz linuxveidīgā. Dod saiti, kur var dabūt 1.7.0 exe .

  2. Protams, ka komandrindas triki labi darbojas tika normālās komandrindās, kādas ir iekš GNU/Linux un citiem UNIXoīdiem. Arī MS-Windows CMD vajadzētu būt pieejamam līdzīgam trikam, ja ir kāds specs, lūgtum komentāros.

    GDAL/OGR 1.7.0 nav pieejams, jo tika atklāta būtiska kļūda ERDAS IMG failu ģenerēšanā, taču 1.7.3 ir pieejams GDAL/OGR mājaslapā: http://trac.osgeo.org/gdal/wiki/DownloadingGdalBinaries

  3. Janeks saka:

    Un kā varētu tā ātri un vnk. sagriezt rastru, ja ir karšu lapu shp ar karšu lapu poligoniem-kvadrātiem?

  4. Janeks saka:

    Atcerējos veco labo paņēmienu:
    Šeipam, kur izgriežamie kvadrāti, uzģenerējam kollonnu ar batch komandām, kuras pēc tam iekrāmē batch failā un voila…

  5. Pēteris saka:

    Tavs variants ar komandu uzģenerēšanu katram laukumam atribūtos nav slikts, bez liekas skriptošanas paveicams gandrīz jebkuram lietotājam. Vienīgais risks ir pārāk gara komanda, kura var neielīst dbf laukā.
    Vēl var darīt:
    a) tāpat kā šī raksta gadījumā, kur katrs laukums savā failā,
    b) atstāt kā ir (visi poligoni vienā failā) un izmantojot sql filtrēšanu komandrindas aplikācijai padodot lielo rastru un visus laukumus (šādā gadījumā gan pašā skriptā vajadzēs kādu sarakstu, definētu ar roku vai iegūtu izmantojot ogr, ar vajadzīgajiem laukumu identifikatoriem/lapu nosaukumiem),
    c) lietot gdal/ogr bindingus ur uzrakstīt ko gudrāku, bet tik vienkāršiem gadījumiem tas var būt bišķi par smalku un garu :)