W ciągu ostatnich kilkunastu lat, szczególnie za sprawą rozpowszechnienia technologii mobilnych, systemy informacji przestrzennej na stałe zadomowiły się w naszym życiu. Nikt nie pamięta już czasów, kiedy wchodząc na stronę ulubionej restauracji jedyne, co mogliśmy zrobić, to przeczytać jej adres. Teraz nie dość, że widzimy jej lokalizację na mapie, to jeszcze często możemy skorzystać z Google Street View i zobaczyć jak wygląda okolica albo poprosić o wskazówki dojazdu. Będąc już na miejscu, za pomocą odpowiednich aplikacji możemy zobaczyć którzy nasi znajomi tu bywają, którzy z nich są blisko i ewentualnie, czy mogliby do nas dołączyć, a jeśli przypadkiem zdarzy się, że nie ma dla nas stolika to szybko możemy zobaczyć jakie miejsca znajdują się w pobliżu.
Prezentowanie danych na mapie stało się standardem, dlatego bardzo ważne jest posiadanie poprawnych danych adresowych klientów bądź ich usług. Mając poprawne, zunifikowane adresy, jedyne co wystarczy zrobić, to przypisać im współrzędne geograficzne – ten proces w geodezji nazywany jest geokodowaniem. Jedyne co jest wtedy potrzebne, to referencyjna baza adresowa ze współrzędnymi.
Problemy pojawiają się jednak, jeśli nasze adresy nie są wyczyszczone. Jeśli pochodzą z wielu różnych systemów, czasem są w bazie danych w jednym polu jako długi ciąg tekstu, czasem rozdzielone pomiędzy kilka pól, ale nie poddane walidacji, zatem istnieje ryzyko, że pojawiają się tam literówki, albo że osoba wpisująca te dane napisze „lokal”, a innym razem użyje skrótu „lok.”. Wtedy najważniejszym (i najbardziej czasochłonnym) elementem jest standaryzacja adresów. W przypadku naszego ostatniego projektu było to dopisanie do nazw miast i ulic identyfikatorów TERYT – każde miasto w Polsce, jak i każda ulica, mają przypisany unikalny identyfikator. Mając te identyfikatory i numer domu, w łatwy sposób możemy przypisać współrzędne. Oczywiście są przypadki trywialne, kiedy mamy nazwę miasta i nazwę ulicy, które pasują do naszej bazy referencyjnej. Co jednak, jeśli nie pasują?
- W ramach przygotowania danych zmieniliśmy wszystkie litery na wielkie, usunęliśmy zbędne spacje, a następnie zamieniliśmy słowa typu ulica, aleje, plac na odpowiadające im skróty. Szczęśliwie w danych z systemów, gdzie adres był zapisany jako jeden ciąg tekstu, występowała pewna konwencja – że miasto jest zawsze na początku albo na końcu, to ułatwiło trochę zadanie rozdzielenia tekstu na odpowiednie pola.
Mając już nazwy miast, ulic oraz numery domów i lokali w osobnych polach, porównywaliśmy je z adresami w bazie referencyjnej. Po przypisaniu identyfikatorów TERYT oczywistym przypadkom, stosowaliśmy następujące algorytmy:
- Jeśli para miasto+ulica była znajdowana w bazie referencyjnej, ale więcej niż raz, to sprawdzaliśmy, dla którego miasta na tej ulicy jest najwięcej budynków, w myśl zasady, że adresy usług, które mapowaliśmy, występują z większym prawdopodobieństwem w większych miastach.
- Jeśli zgadzała się nazwa miasta, ale ulicy nie, to dzieliliśmy ulicę na człony i sprawdzaliśmy różne kombinacje tych członów. Przykładowo Al. Papieża Jana Pawła II da się znaleźć po usunięciu członu „Papieża”, a Słowackiego Juliusza występuje w bazie jako Juliusza Słowackiego.
- Zdarzało się, że usuwaliśmy skróty, ale w danych wejściowych dostawaliśmy nazwę ulicy „ul. Ul.Słowackiego”, także wychodziła z tego „Ul.Słowackiego”. Moglibyśmy usunąć skróty po raz drugi, jednak czasem w danych nie było kropki między skrótem a nazwą ulicy. Żeby wychwycić te przypadki porównywaliśmy nazwę ulicy z bazy referencyjnej z podciągiem nazwy ulicy zaczynającym się od 3 i 4 litery.
- Następnie patrzyliśmy na literówki, jeśli nazwa miasta się zgadza, a ulica zgadzałaby się, jeśli by zamienić lub usunąć jedną literę, tj. „ul. Komisji Edykacji Narodowej”.
- Są wsie, które nie mają nazw ulic, wtedy ludzie zwykle wpisują nazwę powiatu/gminy zamiast nazwy miasta oraz nazwę wsi jako nazwę ulicy. Z takimi przypadkami poradziliśmy sobie bez problemu mając słownik powiatów, czasem były też pomocne kody pocztowe, które miały u nas jednak niższy priorytet, bo ludzie wyjątkowo często robią w nich błędy.
- Wszystkie powyższe przypadki dotyczyły kombinacji miasta i ulicy, gdzie nazwa miasta zgadzała się. Na koniec dla niedopasowanych przypadków szukaliśmy osobno miast i osobno ulic tymi samymi metodami, tzn. sprawdzaliśmy literówki, podciągi itp. Baza TERYT jest jednak skonstruowana w ten sposób, że pozornie takie same ulice mogą mieć różne identyfikatory w różnych miastach. Przykładowo w Skierniewicach jest ulica Juliusza Słowackiego, podczas gdy w Siedlcach jest jedynie ulica Słowackiego i obie mają różne identyfikatory. Wobec tego na koniec procesu trzeba przeprowadzić weryfikację, czy wszystkie pary identyfikatorów mamy w bazie referencyjnej. Jeśli nie, to szukamy par, gdzie nazwa ulicy jest taka sama, ale identyfikatory są poprawne.
Stosując powyższe algorytmy udaje nam się przypisywać ok. 95% poprawnych identyfikatorów, ale przede wszystkim w łatwy sposób jesteśmy w stanie ustandaryzować adres niezależnie od jego formatu, a dzięki dopisaniu współrzędnych do danych o usługach, możemy przygotowywać raporty, które prezentują się znacznie lepiej niż same tabelki…
Dzięki, normalizuję właśnie taką bazę teleadresową. Teraz na pewno zaoszczędzę parę godzin.
Witam, czy z bazy TERYT (lub innej) można pozyskać współrzędne geograficzne odpowiadające kodom pocztowym ? Pozdrawiam
W bazie TERYT nie ma współrzędnych, jedynie identyfikatory obiektów przestrzennych takich jak województwa, miasta, ulice… Dodatkowym problemem jest to, że jeden kod pocztowy może dotyczyć dużego obszaru. Natomiast współrzędne punktów adresowych (konkretnych budynków) można znaleźć gdzie indziej, na przykład tu:
https://gis-support.pl/baza-wiedzy-2/dane-do-pobrania/dane-adresowe/
Mam nadzieję, że to pomoże 🙂