Multiple self Join on Mysql 5.7 - Poor Perfomance
You need 4 composite indexes such as

INDEX(country, geonames_code, adm2)


(The columns can be in any order.)

Please provide SHOW CREATE TABLE; my following two comment would be clarified by it.

LOWER(gp.description) like 'lo%' needs for the collation of description to be ..._ci.  If it is, then this would work much better:

`gp.description like 'lo%'`


That is, a "case insensitive" collation obviates the need for LOWER().

If you don't have an index starting with description, add such.

For lat/lng, decimal(65,7) is much too large -- it takes 33 bytes!  This discusses much smaller alternatives.