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ę)?
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
Ja gorąco wierzę, ze to się da zrobić tak, jak piszecie, ale mam w tym miejscu dziurę w wykształceniu 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.