Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Podział polski
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
ShadoV
Witam.
Pisze stronę i jest mi potrzeby podział polski na województwa, powiaty, gminy , miejscowości i dzielnice.
Znalazłem w necie takie coś, ale brakuje tam podziału na dzielnice.
Na php się znam tak sobie, ale nie na js i dla tego mam do was prośbę.
Umiał by mi ktoś wytłumaczyć jak to zrobić, albo pokazać na przykładzie?
Gotowiec znajduje się pod linkiem: http://www.polip.com/download/wiocha.tgz
Z góry bardzo dziękuje za każdą pomoc.
Kshyhoo
Musisz się spytać Bolesława Krzywoustego o podział na dzielnice smile.gif
A tak serio? Jakie dzielnice? Może o krainy geograficzne Ci chodzi?
ShadoV
Każde większe miasto dzieli się na dzielnice. Teraz jest tak że gdy wybierze się jakąś gminę pojawia jeę podział na wsi z danej gminy. Chciał bym jeszcze dorobić taki podział dla miast. Tylko nie na wsi, a na dzielnice miasta.
thek
Jesli nie boisz się tego robić samodzielnie, to ze strony GUS zaciągnij sobie bazę TERYT i obrób. Masz tam pliki XML z aktualnym podziałem terytorialnym kraju na miasta, wsi, dzielnice, przysiółki, kolonie i inne takie. A chyba o to Ci chodzi. Ogólnie wygląda to tak, że każdy rekord ma indeks wskazujący między innymi na na jednostkę terytorialną do której należy (województwo, powiat) i typ (miasto, osada). Jest to dość duże, ale są w necie przykłady skryptów jak to przerzucić do bazy MySQL w miarę szybko. Wystarczy pogooglać.
ShadoV
Moim zdaniem będzie to bardzo obciążało bazę danych.
Co nie?
A znasz może jakąś dobrą stronę gdzie jest to opisane jak najlepiej to podzielić?
wNogachSpisz
baza relacyjna średnio nadaje się do przechowywania danych hierarchicznych. tongue.gif
thek
AKurat podział terytorialny trudny nie jest do implementacji w bazie. W zasadzie można bez problemu to przerobić do postaci relacyjnej.A to, że będzie tam głównie 1:n to tylko szczegół wink.gif Jedyny ewentualny "problem" miałbyś w sytuacji gdy w województwie miałbyś kilka miejscowości o tej samej nazwie. Ale i to można elegancko rozwiązać.
ShadoV
Znalazłem takie coś, ale niestety nie działa :/
http://rafrom.rotmanka.pl/?p=398
thek
Działać zapewne działa, ale te pliki są po prostu dość czasochłonne w obróbce. Konwersja z XML, przetwarzanie, dodawanie do bazy (zapewne rekord po rekordzie, a nie pakietami + czasochłonna aktualizacja indeksów za każdym razem), to wszystko trochę trwa. Znacznie prościej wykorzystać gotowy dump bazy.
wNogachSpisz
Możnaby trzymać dokument XML i do bazy (user_profile->region) zapisywać tylko path (województwo/gmina/powiat/miasto/dzielica/ulica/piwnica).
Troszkę nadmiarowo ale za to bardzo łatwe przy przetwarzaniu do prezentacji.
thek
Zważywszy, że relacja ulica<->miasto czy ulica<->dzielnica to już relacja "wiele do wielu" - podziękuję. Redundancja danych za duża. Poza tym przeszukiwanie w poszukiwaniu określonej rzeczy też się mi nie uśmiecha... Zrobiłbyś regexpa w bazie, xpatha w xml czy może kombinował z mieszanką obu? wink.gif Zwróć uwagę, że zapisów żadnych nie będzie, za to ilość przeszukiwań, niekoniecznie po pełnej ścieżce od korzenia - .
ShadoV
Już uruchomiłem te skrypty z tej strony działają.
Ale teraz zastanawiam się jak to podzielić.
Chciał bym zrobić taką bazę do przeglądania tak jak na tej stronie:
http://www.stat.gov.pl/broker/access/definitionTree.jspa
Tylko dodatkowo żeby była możliwość wybrania gdzie mieszkam.
Wszystko by było fajnie jak by nie takie coś np.
Kod
<row>
<col name="WOJ">24</col>
<col name="POW">11</col>
<col name="GMI">05</col>
<col name="RODZ">3</col>
<col name="NAZWA">Kuźnia Raciborska</col>
<col name="NAZDOD">gmina miejsko-wiejska</col>
<col name="STAN_NA">2012-05-09</col>
</row>
<row>
<col name="WOJ">24</col>
<col name="POW">11</col>
<col name="GMI">05</col>
<col name="RODZ">4</col>
<col name="NAZWA">Kuźnia Raciborska</col>
<col name="NAZDOD">miasto</col>
<col name="STAN_NA">2012-05-09</col>
</row>
<row>
<col name="WOJ">24</col>
<col name="POW">11</col>
<col name="GMI">05</col>
<col name="RODZ">5</col>
<col name="NAZWA">Kuźnia Raciborska</col>
<col name="NAZDOD">obszar wiejski</col>
<col name="STAN_NA">2012-05-09</col>
</row>


Napisałem taki skrypt php, a dokładnie edytowałem gotowca, ale jeszcze coś nie działa.
Powinien działać tak że jak jest miejscowość co ma gminę miejską i gminę wiejską to wpisuje do bazy tylko tą pierwszą.
A jak narazie działa tak że wszystko wpisuje :/
  1. <?php
  2. $host = "localhost";
  3. $database = "terytp";
  4. $table = "terc";
  5. $user = "root";
  6. $password = "bobosimer3";
  7.  
  8.  
  9. $connection = mysql_connect($host,$user,$password);
  10. mysql_select_db($database);
  11. $result = mysql_query("SET CHARACTER SET utf8;",$connection);
  12. if (!$result) {
  13. die('Invalid query: ' . mysql_error());
  14. }
  15. $result = mysql_query("SET NAMES utf8;",$connection);
  16. if (!$result) {
  17. die('Invalid query: ' . mysql_error());
  18. }
  19.  
  20. // include class file
  21. include("Unserializer.php");
  22. #$xml="WMRODZ.xml";
  23. #$xml="SIMC.xml";
  24. #$xml="ULIC.xml";
  25. $xml="TERC.xml";
  26.  
  27. // tell the unserializer to create an object
  28. $options = array("complexType" => "object");
  29.  
  30. // create object
  31. $unserializer = new XML_Unserializer($options);
  32.  
  33. // unserialize the document
  34. #$result = $unserializer->unserialize($xml, true );
  35.  
  36. // dump the result
  37. //print_r($unserializer->getUnserializedData());
  38. $unserializer->unserialize($xml, true);
  39. $rekordy = $unserializer->getUnserializedData();
  40. echo "element glowny kodu XML: <b>";
  41. echo $unserializer->getRootName();
  42. echo "</B><br>\n";
  43.  
  44. #print_r($rekordy);
  45. if(is_array($rekordy->catalog->row) === false){ print("<br>To nie jest tablica<br>");}
  46. $ile = count($rekordy->catalog->row);
  47. echo "<br>Ilosc rekordow: $ile\n";
  48.  
  49. echo "<br>Listing:<br>\n";
  50. $Woje = 0;
  51. $Pow = 0;
  52. $Jaki = 315;
  53. $Wiel = 1;
  54. for ($i=0;$i<count($rekordy->catalog->row); ++$i){
  55. # print($i." : ");
  56. # print($rekordy->catalog->row[$i]->col[0]." : ");
  57. # print($rekordy->catalog->row[$i]->col[1]." : ");
  58. # print($rekordy->catalog->row[$i]->col[2]."<br>\n");
  59. if ($rekordy->catalog->row[$i]->col[5] == "gmina miejska" or $rekordy->catalog->row[$i]->col[5] == "gmina wiejska") {
  60. if ($rekordy->catalog->row[$i]->col[5] == "gmina wiejska") {
  61. $WielD = "p".$Wiel-1;
  62. $query = mysql_query("SELECT * FROM ".$WielD." WHERE nazwa = ".$rekordy->catalog->row[$i]->col[4].";",$connection);
  63. if (!$query['nazwa']) {
  64. $Jakis = ($rekordy->catalog->row[$i]->col[0]/2);
  65. if ($rekordy->catalog->row[$i]->col[5] == "gmina wiejska" or $rekordy->catalog->row[$i]->col[5] == "gmina miejsko-wiejska") {
  66. $Dod = 1;
  67. } Else {
  68. $Dod = 0;
  69. }
  70. $query = "insert into `p".$Wiel."` set ".
  71. "woj='".$Jakis."'".
  72. ",pow='".$rekordy->catalog->row[$i]->col[1]."'".
  73. ",id='".$Jaki."'".
  74. ",nazwa='".$rekordy->catalog->row[$i]->col[4]."'".
  75. ",dod='".$Dod."'".
  76. ",nazdod='".$rekordy->catalog->row[$i]->col[5]."'";
  77. print("$query <br>\n");
  78. $result = mysql_query($query,$connection);
  79. if (!$result) {
  80. die('Invalid query: ' . mysql_error());
  81. }
  82. if ($Woje != $Jakis or $Pow != $rekordy->catalog->row[$i]->col[1]){
  83. $Woje = $Jakis;
  84. $Pow = $rekordy->catalog->row[$i]->col[1];
  85. ++$Wiel;
  86. }
  87. ++$Jaki;
  88. }
  89. } else {
  90. $Jakis = ($rekordy->catalog->row[$i]->col[0]/2);
  91. $Dod = 0;
  92. $query = "insert into `p".$Wiel."` set ".
  93. "woj='".$Jakis."'".
  94. ",pow='".$rekordy->catalog->row[$i]->col[1]."'".
  95. ",id='".$Jaki."'".
  96. ",nazwa='".$rekordy->catalog->row[$i]->col[4]."'".
  97. ",dod='".$Dod."'".
  98. ",nazdod='".$rekordy->catalog->row[$i]->col[5]."'";
  99. print("$query <br>\n");
  100. $result = mysql_query($query,$connection);
  101. if (!$result) {
  102. die('Invalid query: ' . mysql_error());
  103. }
  104. if ($Woje != $Jakis or $Pow != $rekordy->catalog->row[$i]->col[1]){
  105. $Woje = $Jakis;
  106. $Pow = $rekordy->catalog->row[$i]->col[1];
  107. ++$Wiel;
  108. }
  109. ++$Jaki;
  110. }
  111. if ($rekordy->catalog->row[$i]->col[5] == "miasto") {
  112. $Jakis = ($rekordy->catalog->row[$i]->col[0]/2);
  113. $Dod = 0;
  114. $query = "insert into `p".$Wiel."` set ".
  115. "woj='".$Jakis."'".
  116. ",pow='".$rekordy->catalog->row[$i]->col[1]."'".
  117. ",id='".$Jaki."'".
  118. ",nazwa='".$rekordy->catalog->row[$i]->col[4]."'".
  119. ",dod='".$Dod."'".
  120. ",nazdod='".$rekordy->catalog->row[$i]->col[5]."'";
  121. print("$query <br>\n");
  122. $result = mysql_query($query,$connection);
  123. if (!$result) {
  124. die('Invalid query: ' . mysql_error());
  125. }
  126. if ($Woje != $Jakis or $Pow != $rekordy->catalog->row[$i]->col[1]){
  127. $Woje = $Jakis;
  128. $Pow = $rekordy->catalog->row[$i]->col[1];
  129. ++$Wiel;
  130. }
  131. ++$Jaki;
  132. }
  133. }
  134. }
  135. mysql_close($connection);
  136. return 0;
  137. ?>
wNogachSpisz
Cytat(thek @ 29.11.2012, 00:23:57 ) *
Zważywszy, że relacja ulica<->miasto czy ulica<->dzielnica to już relacja "wiele do wielu" - podziękuję.

Nie rozumiem, XML między innym adresuje ten problem.

Cytat(thek @ 29.11.2012, 00:23:57 ) *
Redundancja danych za duża.

To oczywiście zależy ile będzie wpisów z adresemi, jeśli mniej niż miliard, to śmiało można w to iść.

Cytat(thek @ 29.11.2012, 00:23:57 ) *
Poza tym przeszukiwanie w poszukiwaniu określonej rzeczy też się mi nie uśmiecha... Zrobiłbyś regexpa w bazie, xpatha w xml czy może kombinował z mieszanką obu? wink.gif

Po co, wystarczy zaindeksować. Adresu i tak się szuka od lewej do prawej.
Jeśli chcesz wszystkie wpisy z danej ulicy, to przeszukujesz like: "państwo/miasto/dzielica/ulica/%"

Cytat(thek @ 29.11.2012, 00:23:57 ) *
Zwróć uwagę, że zapisów żadnych nie będzie, za to ilość przeszukiwań, niekoniecznie po pełnej ścieżce od korzenia - .

Do korzenia nie - przeszukujesz like z kotwicą z lewej strony. Jakie to ma znaczenie przy full-text index?

Ostatecznie, wrócisz za 2 lata jak system zacznie zarabiać pieniądze i to zoptymalizujesz..
Nie ma sensu się bawić w dłubanine, trzeba trzaskać appki a nie marnować czas na pierdoły smile.gif
thek
XPathy na dużych plikach XML do demonów szybkości nie należą. Zrobić w nich zaś sensowny odpowiednik full-text-searcha to już zupełnie zajedziesz maszynkę. Innymi słowy - niby można - tylko czy jest to dobre i sensowne podejście?

Iść zawsze można, nikt nikomu nie broni. Problemem jest jednak faktyczna wydajność w ujęciu ogólnym. Wyszukiwanie adresu jest bowiem tylko częścią zazwyczaj szerszego zapytania. W takim wypadku zaczynają się kombinacje z optymalizacjami już, bo inaczej się po prostu nie da tego w rozsądny (o możliwie niskim czasie przeszukiwania) sposób zrobić.

A zwróciłeś uwagę, że najczęściej ulica to tylko jedna składowa zapytania? Szukasz po prostu "Kwiatowa 10" czy "Pcim Dolny, Kwiatowa 10"? Jak z tego złapiesz wzorzec dla LIKE? A może złapiemy regexp w bazie? W tym momencie szlag trafia cudowne indeksy. Regexp i Like wszak z indeksu korzystają tylko gdy mają wspomniane przez Ciebie zakotwiczenie z lewej. Innymi słowy: LIKE 'państwo/%' indeks chwyci, ale już LIKE '%słowo%' niestety z indeksu nie korzysta. A przecież trzeba doprowadzić do formy, gdzie mamy wyszukiwane pathy nie z jednym, ale dwoma lub więcej miejscami podanymi jako parametry wyszukiwania. Tu i tak jest w miarę jeszcze statycznie, bo adresy wszak aż tak często się nie zmieniają, a i rozrost miejscowości aż taki szybki nie jest.

Co zaś do "trzaskania appek", to akurat w pracy mam moment, gdy siedzimy z zespołem nad wersją 1.0 aplikacji obecnie tworzonej (nazwijmy ją 2.0) No i mamy na tapecie integrację "wsobną", czyli wchłonięcie części funkcjonalności 1.0 do obecnie rozwijanej, przy jednoczesnym nie tykaniu wersji 1.0, bo leży na produkcji smile.gif Migracja pełną gębą za jakiś czas, a już teraz przemapowywanie modeli, encji i relacji oraz co z tym związane, przemyślenie transformatorów danych pomiędzy biema wersjami oraz przerobienie kodu tak, by jakiś czas działały na produkcji oba i nie kolidowały ze sobą, bo będą wszak na tych samych danych równolegle pracowały. Mimo tego że bazowano na encjach z 1.0, to projekt nieco odpłynął od pierwotnej koncepcji. Było wtedy trochę błędów popełnionych. Samo wydzielenie i "optymalizacja" staroci po jakoś pół roku to już tragedia. Po 2 latach to już by była masakra, która wiązała by się pewnie z zaoraniem kodu i pisaniem od zera - szybciej by to pewnie wyszło.

Dlatego też IMHO czasem warto poświęcić chwilkę i od początku zaprojektować coś z głową, niż po miesiącu czy dwóch przeklinać nietypową implementację, nie zawsze do końca przemyślanego podejścia. Ilość wulgaryzmów wyrażanych wszem i wobec na pewno będzie mniejsza wink.gif

Tutaj problem na jaki napotkał autor nie jest duży. Prawda jest taka, że podany przykład nie jest problemem tak naprawdę. Nie jest bowiem konieczne wrzucanie całego Terytu smile.gif Sam gdy z nim pracowałem olałem znaczną część danych. Do jednoznacznego określenia jest tak naprawdę wystarczające mieć: wojewodztwo - powiat - miejscowosc i ewentualnie ulica czy dzielnica. Zależy czy te ostatnie konieczne i używane. Każdy inny rekord można śmiało odrzucić.

Tu właśnie zahaczamy o najważniejsze - przemyślenie aplikacji, jej funkcjonalności i działania. I właśnie to powinien autor tematu przemyśleć zanim zacznie pisać skrypty importujące dane z xml.
wNogachSpisz
Nie no, jeśli chcesz przeszukiwać znająć tylko ulicę, bez miasta, to zapisywanie całych pathy odpada.
Tylko pytanie czy projekt zakłada takie przezukiwanie.
thek
Właśnie dlatego podniosłem w swoim ostatnim poście kilka drobiazgów, by autor się zastanowił nad tym czego tak naprawdę chce i przemyślał wymagane funkcjonalności. Na podstawie tego zdecydował o strukturze bazy i relacjach. A dopiero na końcu zabrał się za import,.bo wtedy będzie już wiedział co chce, jak ma to wyglądać i jak będzie między sobą powiązane smile.gif Nasze dywagacje tutaj mogły mu wskazać kilka rzeczy, o których nie pomyślał, lub być może nie znał ich.
cimek82
Cytat(ShadoV @ 29.11.2012, 19:33:37 ) *
Już uruchomiłem te skrypty z tej strony działają.


Mam ten sam problem że nie mogę odpalić tego skryptu ze strony http://rafrom.rotmanka.pl/?p=398
Mógł byś napisać co zrobiłeś że zaczeło ci to działać questionmark.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.