Como criar a funcionalidade GeoIP no projeto PHP?

Eu tenho um endereço IP ($_SERVER['REMOTE_ADDR']) e devo receber (aprender) o nome do país e seria bom se eu também pudesse receber (aprender) o nome da cidade. E não esqueça: é um projeto php, API útil - muito bom.

P.S. É um projeto de código aberto e devemos usar apenas ferramentas gratuitas e de código aberto.