Skip to content

Instantly share code, notes, and snippets.

@ttomasz
Created December 31, 2017 12:39
Show Gist options
  • Save ttomasz/d6ce2ea919baddc8e580351767b3965b to your computer and use it in GitHub Desktop.
Save ttomasz/d6ce2ea919baddc8e580351767b3965b to your computer and use it in GitHub Desktop.
Skrypt XQuery pozwalający na eksport informacji o punktach adresowych z plików XML/GML Państwowego Rejestru Granic (PRG) do pliku CSV
(: skrypt zakłada, korzystamy z programu BaseX i utworzyliśmy bazę XML z wyciętymi "namespaces" :)
(: opcje wyjścia :)
(: chcemy otrzymać plik CSV - wykorzystując moduł programu BaseX - z nagłówkiem, rozdzielany średnikiem :)
declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";
declare option output:method "csv";
declare option output:csv "header=yes, separator=semicolon";
(: deklaracja map zawierających węzły XML z jednostkami administracyjnymi, miejscowościami i ulicami, które później będziemy łączyć z punktami adresowymi :)
(: z mojego doświadczenia wynika, że mapy dają dużo szybsze łączenie (kosztem RAM) :)
declare variable $ja := map:merge(
for $k in /FeatureCollection/featureMembers/PRG_JednostkaAdministracyjnaNazwa
return map{$k/@id/string() : $k}
);
declare variable $m := map:merge(
for $k in /FeatureCollection/featureMembers/PRG_MiejscowoscNazwa
return map{$k/@id/string() : $k}
);
declare variable $u := map:merge(
for $k in /FeatureCollection/featureMembers/PRG_UlicaNazwa
return map{$k/@id/string() : $k}
);
(: przejdź przez każdy element o znaczniku PRG_PunktAdresowy :)
for $pa in /FeatureCollection/featureMembers/PRG_PunktAdresowy
(: znajdź elementy które są połączone z danym punktem adresowym :)
(: usuwamy z początku id adres http, żeby id z komponentu i gml:id się zgadzały :)
(: województwo :)
let $ja1 := map:get($ja, replace($pa/komponent[2]/@href, '^.*/', ''))
(: powiat :)
let $ja2 := map:get($ja, replace($pa/komponent[3]/@href, '^.*/', ''))
(: gmina :)
let $ja3 := map:get($ja, replace($pa/komponent[4]/@href, '^.*/', ''))
(: miejscowość :)
let $msc := map:get($m, replace($pa/komponent[5]/@href, '^.*/', ''))
(: ulica :)
let $ul := map:get($u, replace($pa/komponent[6]/@href, '^.*/', ''))
(: zwróć dane o każdym punkcie adresowym w formie CSV - pola rozdzielane średnikiem :)
return
<csv><record>
<pa_przestrzen_nazw>{$pa/idIIP/BT_Identyfikator/przestrzenNazw/string()}</pa_przestrzen_nazw>
<pa_lokalny_id>{$pa/idIIP/BT_Identyfikator/lokalnyId/string()}</pa_lokalny_id>
<pa_wersjaId>{$pa/idIIP/BT_Identyfikator/wersjaId/string()}</pa_wersjaId>
<pa_cykl_zycia_poczatek>{$pa/cyklZycia/BT_CyklZyciaInfo/poczatekWersjiObiektu/string()}</pa_cykl_zycia_poczatek>
<pa_wazny_od>{$pa/waznyOd/string()}</pa_wazny_od>
<woj_nazwa>{$ja1/nazwa/string()}</woj_nazwa>
<woj_teryt>{$ja1/idTERYT/string()}</woj_teryt>
<pow_nazwa>{$ja2/nazwa/string()}</pow_nazwa>
<pow_teryt>{$ja2/idTERYT/string()}</pow_teryt>
<gmi_nazwa>{$ja3/nazwa/string()}</gmi_nazwa>
<gmi_teryt>{$ja3/idTERYT/string()}</gmi_teryt>
<pa_miejscowosc>{$pa/miejscowosc/string()}</pa_miejscowosc>
<pa_czescMiejscowosci>{$pa/czescMiejscowosci/string()}</pa_czescMiejscowosci>
<msc_nazwa>{$msc/nazwa/string()}</msc_nazwa>
<msc_teryt>{$msc/idTERYT/string()}</msc_teryt>
<pa_ulica>{$pa/ulica/string()}</pa_ulica>
<ul_teryt>{$ul/nazwa/AD_NazwaUlicy/idTERYT/string()}</ul_teryt>
<pa_nrPorzadkowy>{$pa/numerPorzadkowy/string()}</pa_nrPorzadkowy>
<pa_kod_pocztowy>{$pa/kodPocztowy/string()}</pa_kod_pocztowy>
<pa_status>{$pa/status/string()}</pa_status>
<pa_y92>{replace($pa/pozycja/Point/pos, ' .*$', '')}</pa_y92>
<pa_x92>{replace($pa/pozycja/Point/pos, '^.* ', '')}</pa_x92>
</record></csv>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment