Вам именно через Яндекс надо?
Мне, кстати, их реализация стандарта xAL показалась очень внятной. Населённый пункт —
LocalityName
(если есть вложенные типа Зеленограда, то в
DependentLocality
), а улица —
ThoroughfareName
.
Если точка
вне населённого пункта (
LocalityName
отсутствует), то можно найти ближайший с помощью параметра
kind=locality. Аналогично находится ближайшая улица:
kind=street. Внимание на разницу между двумя последними ссылками: «kind=street» выдаёт улицу вне населённого пункта «kind=locality». Просто Яндекс не знает названий улиц в ближайших деревнях, поэтому сообщил название шоссе (которое дальше, за деревнями). Это жизнь, и Яндекс-карты её хорошо отражают. Параметры я взял
отсюда.
Проблему с уровнями вложенности не очень понял. Во-первых, порядок элементов там всегда один и тот же. Во-вторых, если честно, я на вложенность и не смотрел, т.к. строка
<LocalityName xml:lang="%s">%s</LocalityName>
приходила ко мне всегда (максимум) одна, как и
ThoroughfareName
. Да простят меня сторонники тру-парсинга XML, я тупо искал эти две строчки (ну и другие ещё).
Яндекс по России знает значительно больше населённых пунктов, чем Гугл, но с другими ГИС в промышленных масштабах не приходилось сравнивать.