Created
December 31, 2017 12:39
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(: 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