Skip to content

Repository files navigation

Geocoder - Поиск адресов по координатам

Геокодер для поиска адресов с использованием PostgreSQL и PostGIS. Поддерживает полнотекстовый поиск по русским и английским адресам.

🚀 Возможности

  • Полнотекстовый поиск адресов с использованием PostgreSQL tsvector
  • Поддержка русского языка для поиска по российским адресам
  • Географические координаты - возвращает широту и долготу для найденных адресов
  • Ранжирование результатов по релевантности поиска
  • Docker контейнеризация для простого развертывания

📋 Требования

  • Docker и Docker Compose
  • PostgreSQL с расширением PostGIS
  • Python 3.12+

🛠 Установка и запуск

1. Клонирование репозитория

git clone <repository-url>
cd Geocoder

2. Создание файлов конфигурации

Создайте файл .env в корне проекта:

DB_HOST=geocoder_db
DB_PORT=5432
DB_USER=postgres
DB_PASS=postgres
DB_NAME=mydatabase

Создайте файл .env.db в корне проекта:

POSTGRES_DB=mydatabase
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres

3. Запуск базы данных

docker-compose up -d geocoder_db

4. Импорт данных

Важно! Используйте этот метод для корректного импорта русских символов:

# Копируем дамп в контейнер
docker cp dump.sql geocoder_db:/tmp/dump.sql

# Импортируем изнутри контейнера
docker exec geocoder_db psql -U postgres -d mydatabase -f /tmp/dump.sql

5. Запуск приложения

docker-compose run --rm cli

5. Запуск Апи версии

docker-compose run --rm api

📖 Использование

После запуска приложения введите адрес для поиска:

Введите адрес: Москва

После запуска Апи версии введите адрес для поиска:

http://localhost:8000/geocode/?query=Москва, улица Тверская, 5

Примеры поиска

  • Русские адреса: "Москва", "Санкт-Петербург", "улица Тверская"
  • Английские адреса: "London", "Paris", "New York"
  • Частичные адреса: "Тверская", "Невский"

Формат вывода

===== Результат поиска =====
📍 Адрес: Москва, улица Тверская, 5
🌍 Координаты: 55.7558, 37.6176
📊 Релевантность: 0.85
============================

🏗 Архитектура

Структура проекта

Geocoder/
├── .env                  # Конфигурация приложения
├── .env.db              # Конфигурация базы данных
├── docker-compose.yml   # Docker Compose конфигурация
├── dump.sql            # Дамп базы данных с адресами
├── Dockerfile          # Docker образ для приложения
├── requirements.txt    # Python зависимости
└── src/
    ├── main.py         # Главный файл приложения
    ├── search.py       # Логика поиска адресов
    ├── result_formatter.py  # Форматирование результатов
    └── db/
        ├── config.py   # Конфигурация базы данных
        └── database.py # Подключение к БД

Схема базы данных

Таблица addresses:

  • osm_id - ID из OpenStreetMap
  • housenumber - Номер дома (JSON)
  • street - Название улицы (JSON)
  • city - Город (JSON)
  • postcode - Почтовый индекс (JSON)
  • country - Страна (JSON)
  • geom - Геометрические координаты (PostGIS)
  • full_address - Полный адрес (TEXT)
  • search_vector - Вектор для полнотекстового поиска (tsvector)

🔧 Разработка

Локальная разработка

  1. Установите зависимости:
pip install -r requirements.txt
  1. Настройте переменные окружения для локальной разработки:
DB_HOST=localhost
DB_PORT=5433
DB_USER=postgres
DB_PASS=postgres
DB_NAME=mydatabase
  1. Запустите приложение:
python src/main.py

Тестирование

# Проверка подключения к БД
docker exec geocoder_db psql -U postgres -d mydatabase -c "SELECT COUNT(*) FROM addresses;"

# Проверка русских символов
docker exec geocoder_db psql -U postgres -d mydatabase -c "SELECT full_address FROM addresses WHERE full_address ~ '[А-Яа-я]' LIMIT 5;"

# Тест поиска
docker exec geocoder_db psql -U postgres -d mydatabase -c "SELECT full_address FROM addresses WHERE full_address ILIKE '%Москва%' LIMIT 5;"

🐛 Устранение неполадок

Проблема: "relation addresses does not exist"

Решение: Импортируйте дамп базы данных:

docker cp dump.sql geocoder_db:/tmp/dump.sql
docker exec geocoder_db psql -U postgres -d mydatabase -f /tmp/dump.sql

Проблема: Русские символы отображаются как знаки вопроса

Решение: Используйте правильный метод импорта (см. раздел "Импорт данных")

Проблема: "connection refused"

Решение: Убедитесь, что контейнеры запущены:

docker ps
docker-compose up -d

Проблема: "password authentication failed"

Решение: Проверьте файлы .env и .env.db на корректность паролей

📊 Производительность

  • База данных: ~290,000 адресов
  • Время поиска: < 100ms для большинства запросов
  • Память: ~500MB для PostgreSQL контейнера
  • Диск: ~2GB для полной базы данных

Создано с ❤️ для поиска адресов

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages