Пакет-географ або бібліотека, яка прекрасно знає географію і говорить на різних мовах

У багатьох з проектів, в яких я брав участь, була необхідність використовувати географічні дані в тому чи іншому вигляді. Навіть самі прості сайти, як правило, мають список країн чи міст на якій-небудь з своїх сторінок – магазини хочуть знати, куди доставляти товари; соціальні мережі хочуть знати, звідки користувач; і так далі.

Що далеко ходити – от навіть тут на Хабре є випадаючі списки країн, штатів і міст:
image


Мені (як, напевно, і вам багато разів доводилося зберігати такі дані (скажімо, список країн) і в масивах, і в базах даних, у файлах конфігурації. Потім нудно додавати варіанти на інших мовах, коли у проекту з'являється альтернативна мовна версія.

Я бачу відразу кілька проблем і буду тільки радий якщо хтось оскаржить цей список:

  • Додавання географічних даних і переказів засмічує робочий проект, його сховище даних. Не хочу зайвих таблиць, що не мають відношення до основного бізнесу!
  • Географічні дані в проекті – це постійне повторення, винахід велосипеда заново. Набір країн і міст на планеті змінюється вкрай рідко, навіщо ж тоді відводити цими даними тепле місце в додатку?
  • Якщо в команді немає лінгвістів та поліглотів, то в списки міст і країн можуть запросто пробратися помилки. Скільки росіян досі пише «Таїланд» з і коротким?


Географічні дані – ідеальний кандидат для окремого пакету. Хочу ввести одну команду в улюбленому менеджері пакетів (будь то composer, npm або CocoaPods) і відразу отримати можливість працювати з географічними найменуваннями. Хочу мати щось на зразок модного http://momentjs.com/, але про географію. Поставив один пакет – закрив цю сторінку, так сказати.

Дивно, але таких пакетів поки не існує, тому я почав роботу над своїм. Для початку – версія на PHP. Ця стаття є описом мого підходу, а основними цілями публікації можна вважати збір думок від інших розробників; оцінку необхідності, актуальності пакета.

Пропонована реалізація

Ось таким мені видається оптимальний API для PHP на поточний момент:

// Точка входу в пакет – клас планети
// У майбутньому треба додати можливість створювати об'єкт країни чи міста без батька
$planet = new Planet();

// Планета, дай мені всі свої країни, і на виході перетвори в масив
$planet->getCountries()->toArray();

// Хочу, щоб імена країн були короткими, по можливості – наприклад, США замість Сполучених Штатів Америки
$planet->getCountries()->useShortNames()->toArray();

// Дайте мені всі області Таїланду
$countries = $planet->getCountries();
$thailand = $countries->find(['code' => 'TH']);
$thailand->getStates()->toArray();

// Хочу тепер їх російською
$thailand->getStates()->setLanguage('ru')->toArray();

// Хочу тепер і в іншій формі (наприклад, "в Таїланді" замість "Таїланд")
$thailand->getStates()->setLanguage('ru')->inflict('in')->toArray();

// А де там у нас столиця? Чи є код geonames? А точні координати?
$capital = $thailand->getCapital();
$capital->getGeonamesId();
$capital->getLatitude();
$capital->getLongitude();


Цього вже достатньо, щоб дуже швидко додати списки з першого зображення на свій сайт.

Для повного щастя хотілося б ще:
// Пошук міст конкретної країни за поштовим індексом
$russia->find(['zip' => '626430']);

// Глобальний пошук за поштовим індексом
$planet->find(['zip' => 'EC3R 6DN']);

// Глобальний пошук по координатах
$planet->find([
'latitude' => 51.5078788,
'longitude' => -0.0899208
]);


Мені важлива думка людей на Хабре, але не буду кривити душею – я вже почав писати пакет для PHP не чекаючи реакції публіки. Пілотна версія є на GitHub, і десь через місяць у неї з'являться 3-4 перших мови і весь базовий функціонал. Якщо хтось хоче взяти участь в розробці (особливо цікавлять пакети для інших мов – JavaScript, Ruby, et cetera), то буду дуже радий отримати від вас особисте повідомлення.

Зв'язок з моделями програми

Передбачаю запитання на кшталт «як же тоді запам'ятовувати місто користувача?», і відповідь тут досить простий – у своїй БД (або куди ви там записуєте дані) використовуйте стандартні ідентифікатори, такі як коди ISO 3166-1 для країн, коди GeoNames для міст і штатів. Проблем зіставити код з його змістом і перекладом не буде, і прив'язані до цього конкретного пакету ви не станете.

Запитання

Головне питання, він же – мета цієї статті: чи користувалися б ви таким пакетом в своїх додатках? Чи воліли б і далі самі зберігати географічні дані?

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.