-
-
Save persidskiy/5788975 to your computer and use it in GitHub Desktop.
| function getHumanAddress(geoObject){ | |
| var declaration = { | |
| 'CountryName': 'country', | |
| 'AdministrativeAreaName': 'area', | |
| 'SubAdministrativeAreaName': 'subarea', | |
| 'LocalityName': 'city', | |
| 'DependentLocalityName': 'subcity', | |
| 'ThoroughfareName': 'street', | |
| 'PremiseNumber': 'house' | |
| } | |
| ,parseParams = ['Country', 'CountryName', 'AdministrativeArea', 'AdministrativeAreaName', | |
| 'Locality', 'LocalityName', 'Thoroughfare', 'ThoroughfareName', 'Premise', 'PremiseNumber', | |
| 'DependentLocality', 'DependentLocalityName', | |
| 'SubAdministrativeArea', 'SubAdministrativeAreaName'] | |
| ,level = geoObject['metaDataProperty']['GeocoderMetaData']['AddressDetails'] | |
| ,result={} | |
| ,nextLevel; | |
| while(1){ | |
| var goDeeper = false; | |
| for(var key in level){ | |
| if(parseParams.indexOf(key)!==-1){ | |
| if(typeof level[key] === 'object'){ | |
| nextLevel = level[key]; | |
| goDeeper = true; | |
| }else{ | |
| for(var declKey in declaration){ | |
| if(declKey === key){ | |
| result[declaration[key]] = level[key]; | |
| } | |
| } | |
| } | |
| } | |
| } | |
| if(goDeeper){ | |
| level = nextLevel; //we need to go deeper ;) | |
| }else{ | |
| break; | |
| } | |
| } | |
| return result; | |
| } |
Да, у меня в declaration было настроено что DependentLocalityName перезаписывал city. Этот алгоритм непрвильный.
Поправил, теперь city это LocalityName, а subcity это DependentLocalityName.
Подскажите как подключить функцию пожалуйста!!
У меня есть результат геокодирования:
ymaps.geocode(coords).then(function (res) {
var firstGeoObject = res.geoObjects.get(0);
}
Что мне подавать на вход функции?
Сейчас беру значения вот так: firstGeoObject.properties.get('metaDataProperty. ...');
Можно ли как-то перемещаться по структуре свойств вверх вниз не подскажите?
если кому интересно будет, конвертировал в php
https://gist.github.com/sternt/56d34537ede80d854af866fa1fae1046
getHumanAddress(firstGeoObject.properties._data);
вот это нужно передавать в функцию что бы заработало
Парсер уже есть в самом АПИ
ymaps.geocode(address).then(function (res) {
var firstGeoObject = res.geoObjects.get(0);
console.log(firstGeoObject.getLocalities());
});Огромное спасибо!
Что парсит DependentLocalityName ?
Оно мне ломает определение города в Одессе, я так понимаю ты ориентировался на Россию когда писал эту функцию? В Украине чтото отличается.
Проверь координаты 46.42876,30.745010999999998
в city записывает "Киевский район" - это район а не город. Если убрать DependentLocalityName то все становится хорошо, но боюсь это ломает определение гдето в другом месте. Будут идеи?
А так функция годная, если учесть все нюансы - многим пригодится.