yandex metrica + google analytics

четверг, 5 мая 2022 г.

Скрипт на python чтобы напечатать названия проеханных населенных пунктов и улиц


еще в своем текущем состоянии этот скрипт немного нарушает policy сервиса https://operations.osmfoundation.org/policies/nominatim/ .  не представляется. но геоданные под собой кэширует

с GPX трэка https://www.komoot.com/tour/757576446 (он же https://www.strava.com/activities/7081447429) получилось такое:

 ┐
└── Россия
    └── Центральный федеральный округ
        └── Москва
            └── Москва
                ├── Гагаринский
                │   ├── Ленинский проспект (дублёр)
                │   ├── Ленинский проспект
                │   │   ├── Университетский проспект
                │   │   ├── Улица Ляпунова
                │   │   ├── Дворец труда профсоюзов
                │   │   ├── Улица Академика Зелинского
                │   │   └── Ленинский проспект, 34
                │   ├── улица Академика Зелинского
                │   ├── улица Косыгина
                │   ├── улица Сергея Капицы
                │   └── Третье Транспортное кольцо
                ├── Донской район
                │   ├── Ленинский проспект
                │   │   ├── Метро «Ленинский проспект»
                │   │   └── Институт Курнакова
                │   ├── улица Стасовой
                │   ├── 2-й Донской проезд
                │   ├── 3-й Донской проезд
                │   ├── Донская улица
                │   ├── улица Орджоникидзе
                │   ├── 1-й Рощинский проезд
                │   ├── Третье Транспортное кольцо
                │   ├── Новоданиловская набережная
                │   └── Даниловская набережная
                ├── улица Серпуховский Вал
                │   └── Даниловский рынок
                ├── Малая Тульская улица

                │   └── Станция метро "Тульская"
                ├── площадь Серпуховская Застава
                ├── Подольское шоссе
                ├── Даниловский
                │   ├── площадь Серпуховская Застава
                │   ├── Большая Тульская улица
                │   ├── Тульская аллея
                │   ├── Большой Староданиловский переулок
                │   ├── Холодильный переулок
                │   ├── Гамсоновский переулок
                │   ├── проектируемый проезд № 4965
                │   ├── набережная Марка Шагала
                │   ├── улица Татлина
                │   ├── улица Родченко
                │   ├── бульвар Братьев Весниных
                │   ├── проспект Лихачёва
                │   │   └── МЦК ЗИЛ
                │   └── Зиловский бульвар
                ├── Большая Тульская улица
                ├── Третье Транспортное кольцо
                │   └── Автозаводский мост
                ├── улица Архитектора Щусева
                ├── улица Архитектора Мельникова
                ├── Автозаводская улица
                ├── улица Архитектора Леонидова
                ├── проектируемый проезд № 4062
                ├── проектируемый проезд № 7024
                ├── проспект Лихачёва
                ├── улица Мустая Карима
                │   └── Метро Технопарк
                ├── проспект Андропова
                │   └── Южный речной вокзал
                ├── район Нагатинский Затон
                │   ├── проспект Андропова
                │   └── Нагатинская набережная
                │       └── Парк развлечений "Остров мечты"
                ├── Кожухово
                │   └── 2-й Южнопортовый проезд
                ├── район Печатники
                │   ├── 2-й Южнопортовый проезд
                │   ├── проектируемый проезд № 1423
                │   ├── Южнопортовая улица
                │   │   ├── Южный порт - 2
                │   │   ├── Метродепо
                │   │   └── Цементный элеватор
                │   ├── улица Гурьянова
                │   ├── Шоссейная улица
                │   ├── улица Полбина
                │   └── Юго-Восточная хорда
                ├── Курская улица
                ├── Тихая улица
                ├── район Текстильщики
                │   ├── Люблинская улица
                │   │   └── МЦД "Люблино"
                │   ├── Волжский бульвар
                │   │   ├── Саратовская улица
                │   │   └── 91-й квартал Грайворонова
                │   ├── Окская улица
                │   ├── Саратовская улица
                │   ├── проектируемый проезд № 770
                │   ├── Грайвороновская улица
                │   │   └── 91-й квартал Грайворонова
                │   ├── проектируемый проезд № 57
                │   └── 2-й Грайвороновский проезд
                │       └── Газгольдерная улица
                ├── Люблинская улица
                ├── Люблино
                │   └── Люблинская улица
                │       ├── Краснодарская улица
                │       ├── Улица Судакова
                │       ├── Литейно-механический завод
                │       └── Люблинская улица, дом №139
                ├── район Марьино
                │   ├── улица Нижние Поля
                │   │   ├── Улица Нижние Поля
                │   │   └── Улица Нижние Поля, дом №21
                │   ├── Люблинская улица
                │   ├── улица Верхние Поля
                │   │   ├── Улица Нижние Поля
                │   │   ├── Центр занятости
                │   │   └── Цимлянская улица
                │   ├── проектируемый проезд № 769
                │   ├── Братиславская улица
                │   │   ├── Краснодонская улица
                │   │   ├── Братиславская улица, 8
                │   │   ├── Братиславская улица д.22
                │   │   ├── Братиславская улица, 26
                │   │   └── Братиславская улица, 28
                │   ├── улица Перерва
                │   ├── Новомарьинская улица
                │   │   └── Новомарьинская улица
                │   ├── Марьинский бульвар
                │   ├── Перервинский бульвар
                │   │   └── 7-й микрорайон Марьинского Парка
                │   └── Белореченская улица
                │       ├── Новомарьинская улица
                │       ├── Белореченская улица, 30
                │       └── Белореченская улица, 24
                ├── Белореченская улица
                ├── Новороссийская улица
                │   └── Новороссийская улица
                ├── Совхозная улица
                │   ├── Метро «Люблино»
                │   ├── Метро "Люблино"
                │   └── Больница имени Семашко
                ├── Краснодарская улица
                ├── Ставропольская улица
                ├── район Кузьминки
                │   ├── улица Заречье
                │   ├── MTB-трейл "Грязный"
                │   ├── Краснодонская улица
                │   ├── Волжский бульвар
                │   │   ├── Больница им. Демихова
                │   │   ├── Волжский бульвар д.44
                │   │   └── Волгоградский проспект
                │   ├── улица Юных Ленинцев
                │   ├── Волгоградский проспект (дублёр)
                │   └── Волгоградский проспект
                ├── Таганрогская улица
                ├── Рязанский район
                │   └── 2-й Грайвороновский проезд
                │       └── Газгольдерная улица
                ├── Нижегородский район
                │   ├── Газгольдерная улица
                │   ├── Рязанский проспект
                │   ├── проектируемый проезд № 1039
                │   ├── 1-й Карачаровский проезд
                │   ├── шоссе Фрезер
                │   │   ├── Платформа Нижегородская
                │   │   ├── 2-я Фрезерная улица
                │   │   ├── Шоссе Фрезер
                │   │   └── Платформа Андроновка
                │   ├── Перовское шоссе
                │   ├── 1-я Фрезерная улица
                │   └── Юго-Восточная хорда
                ├── район Лефортово
                │   └── улица Пруд-Ключики
                │       ├── Андроновское шоссе
                │       ├── НИИ прикладной механики
                │       └── Улица Генерала Яковлева
                ├── 1-я улица Энтузиастов
                ├── шоссе Энтузиастов
                ├── район Соколиная Гора
                │   ├── шоссе Энтузиастов
                │   ├── улица Буракова
                │   ├── Гаражная улица
                │   ├── 3-я улица Соколиной Горы
                │   ├── проспект Будённого
                │   │   ├── 8-я улица Соколиной Горы
                │   │   ├── 10-я улица Соколиной Горы
                │   │   ├── Вольная улица
                │   │   └── Кирпичная улица
                │   ├── Вольная улица
                │   ├── Измайловское шоссе
                │   ├── улица Измайловский Вал
                │   │   └── Метро «Семёновская»
                │   ├── Щербаковская улица
                │   ├── Ткацкая улица
                │   └── Ветка Черкизово - Электрозавод
                ├── Черкизово
                │   ├── улица Измайловский Вал
                │   ├── Заваруевский переулок
                │   ├── улица Преображенский Вал
                │   ├── Ковылинский переулок
                │   ├── Преображенская площадь
                │   │   └── Метро «Преображенская площадь»
                │   └── Преображенская улица
                ├── Преображенское
                │   ├── улица Преображенский Вал
                │   ├── Большая Черкизовская улица
                │   ├── Краснобогатырская улица
                │   └── Преображенская улица
                ├── Преображенская улица
                ├── Сокольники
                │   ├── улица Стромынка
                │   │   └── Улица Короленко — Социальный университет
                │   ├── Колодезный переулок
                │   ├── улица Короленко
                │   ├── Малая Остроумовская улица
                │   ├── 2-й Полевой переулок
                │   ├── Русаковская улица
                │   │   └── Метро «Сокольники»
                │   ├── Сокольнический переулок
                │   │   └── Метро «Сокольники»
                │   ├── улица Сокольническая Слободка
                │   ├── Песочный переулок
                │   ├── улица Сокольнический Вал
                │   │   └── Метро «Сокольники»
                │   ├── Сокольнический Павильонный проезд
                │   ├── проезд Сокольнического Круга
                │   ├── 2-й Лучевой просек
                │   ├── Митьковский проезд
                │   ├── 3-й Лучевой просек
                │   └── Тропа здоровья
                ├── 3-й Лучевой просек
                ├── 2-й Лучевой просек
                ├── Алексеевский
                │   ├── 1-й Рижский переулок
                │   ├── Рижский проезд
                │   ├── улица Бориса Галушкина
                │   │   └── Улица Павла Корчагина
                │   ├── улица Космонавтов
                │   │   └── Метро «ВДНХ»
                │   ├── Ярославская улица
                │   ├── проспект Мира (дублёр)
                │   ├── площадь Шарля де Голля
                │   ├── Продольный проезд
                │   └── Кольцевая дорога ВДНХ
                │       └── Театр Сказок
                ├── Останкинский
                │   ├── проспект Мира
                │   ├── проспект Мира (дублёр)
                │   │   └── Метро «ВДНХ»
                │   ├── 1-й Поперечный проезд
                │   │   └── Метро «ВДНХ»
                │   └── Продольный проезд
                ├── проспект Мира (дублёр)
                ├── 1-й Поперечный проезд
                │   └── Метро «ВДНХ»
                ├── Центральная аллея
                │   └── Главный вход
                ├── Главная аллея
                ├── Кольцевая дорога ВДНХ
                │   ├── Дворец бракосочетания
                │   └── Павильон №57 — Исторический парк «Россия — Моя история»
                ├── Ростокино
                │   ├── Сиреневая аллея
                │   ├── улица Сергея Эйзенштейна
                │   │   └── Депо имени Баумана
                │   ├── 2-й Сельскохозяйственный проезд
                │   ├── Сельскохозяйственная улица
                │   ├── проектируемый проезд № 690
                │   ├── набережная Говорухина
                │   ├── улица Докукина
                │   │   └── Улица Докукина
                │   └── проспект Мира
                ├── аллея Космонавтов
                ├── Продольный проезд
                │   └── Депо имени Баумана
                ├── Свиблово
                │   ├── Северо-восточная хорда
                │   ├── проспект Мира (дублёр)
                │   ├── проезд Серебрякова
                │   ├── улица Амундсена
                │   │   ├── Уржумская улица
                │   │   └── Метро «Свиблово»
                │   ├── Уржумская улица
                │   ├── Снежная улица
                │   ├── Радужная улица
                │   └── Кольская улица
                │       ├── Ивовая улица
                │       └── Вересковая улица
                ├── район Южное Медведково
                │   ├── Кольская улица
                │   ├── Полярная улица
                │   ├── Заповедная улица
                │   ├── аллея Победителей
                │   ├── проезд Дежнёва
                │   └── Сухонская улица
                │       ├── Сухонская улица
                │       └── Сухонская улица, 7
                ├── район Северное Медведково
                │   ├── Сухонская улица
                │   ├── проезд Шокальского
                │   │   ├── Заревый проезд
                │   │   └── Храм Серафима Саровского
                │   ├── Енисейская улица
                │   │   └── Осташковская улица
                │   ├── Широкая улица
                │   │   ├── Отделение связи №224
                │   │   ├── Метро «Медведково»
                │   │   ├── Широкая улица, 5
                │   │   └── Продмаг
                │   ├── улица Грекова
                │   ├── Полярная улица
                │   ├── Полярный проезд
                │   ├── Студёный проезд
                │   └── МКАД, 89-й километр
                ├── Бибирево
                │   ├── МКАД, 88-й километр
                │   ├── улица Корнейчука
                │   │   └── Центр детского творчества
                │   ├── улица Лескова
                │   ├── улица Плещеева
                │   │   ├── Улица Плещеева
                │   │   ├── Аптека
                │   │   └── Метро «Бибирево»
                │   ├── улица Конёнкова
                │   ├── Бибиревская улица
                │   │   └── Метро «Бибирево»
                │   ├── Костромская улица
                │   │   ├── Метро «Бибирево»
                │   │   ├── Метро Бибирево
                │   │   └── Костромская улица д. 3
                │   ├── Алтуфьевское шоссе (дублёр)
                │   ├── улица Пришвина
                │   └── Алтуфьевское шоссе
                │       └── Илимская улица
                ├── улица Корнейчука
                │   └── Почта
                ├── Костромская улица
                │   └── Костромская улица, 6
                ├── Лианозово
                │   ├── Алтуфьевское шоссе
                │   ├── Илимская улица
                │   ├── Угличская улица
                │   └── Череповецкая улица
                ├── Керамический проезд
                ├── Восточное Дегунино
                │   ├── Дубнинская улица
                │   │   └── Микрорайон Дубки
                │   └── Вербилковский проезд
                ├── Дубнинский проезд
                ├── Дмитровский
                │   ├── Дмитровское шоссе
                │   ├── Лобненская улица
                │   │   ├── Кинотеатр «Волга»
                │   │   ├── Больница
                │   │   └── Лобненская улица
                │   ├── улица Софьи Ковалевской
                │   │   └── Стадион
                │   ├── Клязьминская улица
                │   │   └── Больница
                │   ├── Ижорская улица
                │   ├── Вагоноремонтная улица
                │   ├── МКАД, 80-й километр
                │   └── МКАД, 79-й километр
                │       └── 79
                ├── район Западное Дегунино
                │   ├── МКАД, 78-й километр
                │   ├── МКАД, 79-й километр
                │   ├── Ижорская улица
                │   │   ├── Рыбокомбинат
                │   │   └── Ижорская улица, 6
                │   ├── улица Маршала Федоренко
                │   ├── улица Бусиновская Горка
                │   ├── Базовская улица
                │   ├── Новая улица
                │   └── Деповская улица
                ├── Коровино
                │   ├── Бусиновский проезд
                │   └── проектируемый проезд № 5207
                ├── район Ховрино
                │   ├── Зеленоградская улица
                │   ├── Северо-восточная хорда
                │   │   └── Платформа Грачёвская
                │   ├── Клинская улица
                │   │   └── Больница — Библиотека имени Короленко
                │   ├── Фестивальная улица
                │   │   ├── Больница — Библиотека имени Короленко
                │   │   ├── Фестивальная улица
                │   │   ├── Фестивальная улица, 65
                │   │   ├── Фестивальная улица, 14
                │   │   └── Улица Лавочкина
                │   ├── Петрозаводская улица
                │   └── улица Лавочкина
                ├── Фестивальная улица
                │   ├── Смольная улица
                │   ├── Речной Вокзал, авт.343,370,482
                │   ├── Речной Вокзал, авт.342,443
                │   ├── Остановка "Речной Вокзал" для автобусного маршрута No 345
                │   ├── Станция метро "Речной вокзал"
                │   └── Метро «Речной вокзал»
                ├── Флотская улица
                ├── Головинский
                │   ├── Флотская улица
                │   ├── Пулковская улица
                │   └── Кронштадтский бульвар
                ├── Конаковский проезд
                ├── Ленинградское шоссе
                │   └── Театральный зал «Лебедь»
                ├── Головинское шоссе
                │   └── метро "Водный Стадион"
                ├── улица Адмирала Макарова
                │   ├── Метро Водный стадион
                │   └── Улица Адмирала Макарова, 25
                ├── Выборгская улица
                ├── Войковский
                │   ├── улица Адмирала Макарова
                │   └── 5-й Войковский проезд
                ├── Никольский тупик
                ├── Покровское-Стрешнево
                │   └── Иваньковское шоссе
                └── Полесский проезд

Script to print cities names and street names from GPX file

import gpxpy
import gpxpy.gpx
import urllib.request, json
from printree import ptree
import sqlite3
import random
import logging
import os


class PointMetadata:
def __init__(self, display_name, address, time):
self.display_name = display_name
self.address = address
self.time = time

def key(self):
k = []
if 'country' in self.address:
k.append(self.address['country'])
if 'region' in self.address:
k.append(self.address['region'])
if 'state' in self.address:
k.append(self.address['state'])
if 'county' in self.address:
k.append(self.address['county'])
if 'district' in self.address:
k.append(self.address['district'])
if 'city' in self.address:
k.append(self.address['city'])
if 'town' in self.address:
k.append(self.address['town'])
# if 'suburb' in self.address:
# k.append(self.address['suburb'])
if 'municipality' in self.address:
k.append(self.address['municipality'])
if 'village' in self.address:
k.append(self.address['village'])
if 'hamlet' in self.address:
k.append(self.address['hamlet'])
# if 'road' in self.address:
# k.append(self.address['road'])
# if 'highway' in self.address:
# k.append(self.address['highway'])
return k

def __repr__(self):
return "[{}, {}, {}, {}]".format(self.key(), self.display_name, self.address, self.time)


class GPXRendererStats:
def __init__(self, file_name):
self.file_name = file_name
self.counterCache = 0
self.counterGeocode = 0
self.tracks = 0
self.segments = 0
self.points = 0

def add_cache(self):
self.counterCache += 1

def add_geocoder(self):
self.counterGeocode += 1

def add_tracks(self):
self.tracks += 1

def add_segments(self):
self.segments += 1

def add_points(self):
self.points += 1
if (self.points % 1000 == 0):
logging.debug("parsed {} points from file {}".format(self.points, self.file_name))

def __str__(self):
return "Stats: file={}, cache={}, geocoder={}, tracks={}, segments={}, points={}".format(
self.file_name,
self.counterCache,
self.counterGeocode,
self.tracks,
self.segments,
self.points)


class OMGPXTools:
def __init__(self, file_name):
self.connect = sqlite3.connect("geodata-cache.sqlite")
self.stats = GPXRendererStats(file_name)
self.file_name = file_name
try:
self.connect.execute("""
CREATE TABLE IF NOT EXISTS GEODATA (
lat number(3, 8) ,
lon number(3, 8) ,
geodata_json TEXT
);
""")
logging.info("Success: CREATE TABLE IF NOT EXISTS GEODATA")
self.connect.execute("CREATE UNIQUE INDEX IF NOT EXISTS GEODATA_IDX ON GEODATA (lat, lon)")
logging.info("Success: CREATE UNIQUE INDEX IF NOT EXISTS GEODATA_IDX ON GEODATA")
except Exception as ex:
logging.warning("possibly table GEODATA already exists: {}".format(ex))
dataFromSql = self.connect.execute("SELECT count(*) FROM GEODATA");
for row in dataFromSql.fetchall():
logging.debug(str(row))
pass

gpx_file = open(file_name, 'r', encoding='UTF-8')
self.gpx = gpxpy.parse(gpx_file)
logging.info("parsed file {}".format(self.file_name))

def listPoints(self):
res = {}
lPrevoius = 0
pointsCount = 0
for track in self.gpx.tracks:
self.stats.add_tracks()
for segment in track.segments:
self.stats.add_segments()
for point in segment.points:
self.stats.add_points()
try:
pmd = self.getPointMetadata(point.latitude, point.longitude, point.time)
# print(pmd.display_name)
res[str(pmd.key())] = pmd
if lPrevoius < len(res):
l = list(x.key() for x in res.values())
dict = self.generatePrintableTree(l)
# print(ptree(dict))
else:
# print(point.latitude, point.longitude, point.time, pmd.display_name)
pass
lPrevoius = len(res)
except Exception as theException:
print("не будем разбираться что там за эксепшен...", theException, point)

logging.info(str(self.stats))
return res

def getPointMetadata(self, lat, lon, time):
dataFromSql = self.connect.execute("SELECT geodata_json FROM GEODATA WHERE lat=? and lon=?", ([lat, lon]))
fetchall = dataFromSql.fetchall()
if len(fetchall) > 0:
strFromCache = fetchall[0][0]
self.stats.add_cache()
return self.parsePointMetadataFromString(strFromCache, time)

if random.randint(0, 1000) < 990:
return PointMetadata('display_name', {}, time)

nominatimUrl = "https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat={}&lon={}".format(lat, lon)
with urllib.request.urlopen(nominatimUrl) as url:
strFromServer = url.read().decode()
logging.debug("fetch from {}: {}".format(nominatimUrl, strFromServer))
insertResult = self.connect.execute("INSERT INTO GEODATA (lat, lon, geodata_json) values (?,?,?)",
([lat, lon, strFromServer]))
self.connect.commit()
self.stats.add_geocoder()
return self.parsePointMetadataFromString(strFromServer, time)

def parsePointMetadataFromString(self, decodedSring, time):
data = json.loads(decodedSring)
return PointMetadata(data['display_name'], data['address'], time)

def generatePrintableTree(self, list):
tree = {}
for item in list:
currTree = tree

for key in item:
if key not in currTree:
currTree[key] = {}
currTree = currTree[key]

return tree


if __name__ == "__main__":
logging.basicConfig(filename='om-gpx-geodecode.log', level=logging.DEBUG, filemode="w", encoding="UTF-8")

for filename in os.listdir("."):
logging.debug("file found: {}".format(filename))
if filename.endswith(".gpx"):
gpx = OMGPXTools(filename)
finalResult = gpx.listPoints()
l = list(x.key() for x in finalResult.values())
dict = gpx.generatePrintableTree(l)
print(filename)
print(ptree(dict))
else:
logging.debug("skip file as non GPX: {}".format(filename))

logging.info("END")
# print(json.dumps(finalResult, default=vars))

Комментариев нет:

Отправить комментарий