Для одного проекта потребовалось определение из какого города/региона пользователь. Вот написал пакет Geoip. Просто качаете пакет из нашего репозитория, заливаете его на сайт в папку core/packages/ и устанавливаете локально.
// Подключаем пакет
$modx->addPackage('Geoip', $modx->getOption('core_path').'components/geoip/model/');
// Подгружаем основной класс (он содержит нужные нам статические методы)
$modx->loadClass('Geoip');
// Быстрый метод получить информацию о расположении
// Возвращает объект Geoip с полной информацией,
// включая город, регион, область, широта/долгота и т.п.
$location = Geoip::findByIp($modx);
// Или формируем xPDOCriteria для более гибких запросов
$query = Geoip::newQuery($modx);
Пока что база только России и Украины, но в дальнейшем можно развить ее.
Основным плюсом использования именно локальной базы, а не он-лайн сервисов, можно назвать производительность. Если вы используете он-лайн сервисы, и при заходе пользователя удаленный сервис затормозит, пока мы будем пытаться получить ответ, страница для пользователя так же будет висеть. А здесь все мгновенно проходит.