Zagadka dla najtęższych umysłów

Jak byście podeszli do znalezienia odpowiedzi na pytanie:
czy istnieją w Warszawie pary ulic, które po usunięciu znaków diakrytycznych nazywałyby się tak samo?
Hipotetyczne przykłady:
Rącza i Racza
Łąkowa i Lakowa

wsadzić do do bazy danych i jakieś GROUP BY?

ja bym pewnie to GitHub - matkoniecz/osm_iterator: loads .osm file and allows to call function on all OSM objects in dataset przerobił, z grupowaniem nazw po nazwie bez ogonków - nawet baza danych niepotrzebna, ale dla dużych danych umrze

Na szybko w bashu. Mam nadzieję, że poprawnie, bo nie miałem czasu na weryfikację. Jest szansa, że whitespace coś psuje.

#!/usr/bin/env bash
wget https://raw.githubusercontent.com/EqualStreetNames/equalstreetnames-warsaw/master/data/gender.csv -O gender.csv
wget https://raw.githubusercontent.com/EqualStreetNames/equalstreetnames-warsaw/master/data/other.csv -O other.csv
cat gender.csv | sed -e 's/"//g' -e "s/,.*//" | grep -v "^name" > names
cat other.csv | sed -e 's/"//g' -e "s/,.*//" | grep -v "^name" >> names
while read name; do
    asciiName=$(echo "$name" | iconv -f utf8 -t ascii//TRANSLIT)
    if [[ "$name" != "$asciiName" ]]; then
        match=$(grep "^$asciiName\$" names)
        if [[ "$?" = "0" ]]; then
            echo $name $match
        fi
    fi
done <names

Wynik:
Światowida Swiatowida
Atłasowa Atlasowa
Łąkowa Lakowa

to chyba jest poprawione lub źródło ma stare/błędne dane

Poprawiłem, to litrówka była na jednym odcinku, planowanym dopiero.

Tak na oko whitespace nic nie psuje, mam natomiast inne pytanie.

Ponieważ nie wiedziałem, co to są za pliki, które sciągasz wgetem, zrobiłem sobie za pomocą tego zapytania Overpass plik o nazwie WAWulice.txt i zmieniłem kod na:

#!/usr/bin/env bash
cat WAWulice.txt | sed -e 's/"//g' -e "s/,.*//" | grep -v "^name" > names
while read name; do
    asciiName=$(echo "$name" | iconv -f utf8 -t ascii//TRANSLIT)
    if [[ "$name" != "$asciiName" ]]; then
        match=$(grep "^$asciiName\$" names)
        if [[ "$?" = "0" ]]; then
            echo $name $match
        fi
    fi
done <names

I pytanie brzmi: czy da się zastąpić
cat WAWulice.txt
przez
<jakieś wywołanie, zwracające wynik tego zapytania Overpass> |sort |uniq
?

Innymi słowy, czy da się z poziomu basha wywołać overpassa dla konkretnego zapytania i puścić wynik na stdout?

jakiś wget czy inny curl? Lub zawołać skrypt w pythonie (ja tak robię)?

1 Like

Rzeczywiście wget/curl z linkiem z Overpass Turbo → Export → raw data directly from Overpass API powinien działać dobrze

Ale nie załapie się na to na przykład para Łódzka - Łucka :smiley:

Ja gorąco wierzę, ze to się da zrobić tak, jak piszecie, ale mam w tym miejscu dziurę w wykształceniu :slight_smile: Mozna tego wgeta jakoś tak odpalić, żeby zwrócił to, co overpass zwraca?
Bo domyślnie to zwraca stronę…

Wysyłasz zapytania do Overpass API

osm_bot_abstraction_layer/overpass_downloader.py at master · matkoniecz/osm_bot_abstraction_layer · GitHub robi to w Pythonie

osm_bot_abstraction_layer/overpass_downloader.py at master · matkoniecz/osm_bot_abstraction_layer · GitHub i osm_bot_abstraction_layer/overpass_downloader.py at master · matkoniecz/osm_bot_abstraction_layer · GitHub to kluczowe miejsca (ale do sprawdzenia czy jeden z adresów serwera się nie zmienił ostatnio, cos mi błedami zaczął pluć)

W Pythonie to mam bo warto obsłużyć 429 itp itd.

Zmieniłem w twoim przykładzie na pobieranie tylko linii (way) - wtedy większość przystanków, wind itd. odpada (chociaż nie wiem czy wszystko) - Overpass.
Uważaj na timeout - jeśli dasz za mały, nie otrzymasz pełnych wyników ani żadnego info o błędzie.

Całość możesz w konsoli odpalić np. tak:

wget -q -O - https://overpass.kumi.systems/api/interpreter?data=%5Bout%3Acsv%28%22name%22%3Bfalse%29%5D%3B%0Aarea%28id%3A3600336075%29-%3E.searchArea%3B%0A%28%0A%20%20way%5Bhighway%5D%5Bname%5D%0A%20%20%09%28area.searchArea%29%3B%0A%29%3B%0Aout%20body%3B | sort | uniq > orginal.txt
iconv -t ASCII//TRANSLIT orginal.txt > modified.txt # Usunięte znaki diakrytyczne
cat modified.txt | uniq -d # znajdzie tylko duplikaty

Tego URLa z overpassa biorę przez Export → Raw data directly from OSM → copy link location

3 linijki (Można i w jednej:):

wget -q -O - https://overpass.... | sort | uniq | iconv -t ASCII//TRANSLIT | uniq -d

, ale trzeba ręcznie poszukać jak było z diakrytykami (pewnie da się jakoś grep em to zrobić gdyby zapisać do pliku oryginalne nazwy). Do usuwania diakrytyków są jeszcze inne sposoby.

1 Like