Всем доброго дня!
Коллеги, помогите пожалуйста разобраться. У меня есть ресурс, в котором хранятся данные с привязкой к регионам. Основной ключ привязки - osmid.
Задача по клику на карте определить страну и регион(область, республику) в этой стране, и получить osmid региона.
Делаю следующим образом:
Запрашиваю обратное геокодирование для координат клика:
ymaps.geocode(coords).then(function (res) {
Записываю в свой массив ту информацию, которая идет между первой и второй запятой, например из ответа "Россия, Республика Бурятия, Курумканский район" я беру "Республика Бурятия":
geocodeRegs.push(obj.prop
Затем я запрашиваю список регионов
var myQuery=ymaps.geoQuery(ym
Записываю названия регионов в отдельный массив:
myQuery.each(function (myQueryObj) {
geoqueryRegs[myQueryObj.p
Далее я последовательно сравниваю массивы ответа geocode и geoquery. Можно было бы вместо этого использовать geoQuery.search, но есть проблема:
Одни и те же регионы в ответах geocode и geoQuery иногда называются по разному.
Пример:
- Ответ geocode: "Республика Бурятия"
- Ответ geoquery: "Бурятия"
Еще:
- Ответ geocode: "Республика Саха (Якутия)"
- Ответ geoquery: "Республика Саха"
Соответственно вопрос - я что-то не так делаю, или нужно проверять еще и на наличие вхождений подстрок ответов друг в друга, или делать свою базу соотношений?
Специально сделал пример с отладкой:
http://dryu.ru/devel/samples/ymaps_question1.html
var YMCMGetRegAndCoords = function (YMCMContainer) {
var myAllRegs = new ymaps.GeoObjectCollection();
var CountryCount=0
var ThreadOK=0;
YMCMMap = new ymaps.Map(YMCMcontainer, {
center:[68.78, 97.75],
zoom:2,
type: "yandex#map",
});
YMCMMap.controls
.add('zoomControl')
.add('mapTools')
.add('typeSelector');
YMCMMap.copyrights
.add('© <a href="http://dryu.ru">DrYu</a>')
YMCMMap.events
.add('click', function (e) {
var coords = e.get('coordPosition');
var country='';
var subRegion='';
var subRegionOsmid='';
// Запрос на геокодирование
ymaps.geocode(coords).then(function (res) {
var geocodeRegs = [];
// Переберём все найденные результаты.
res.geoObjects.each(function (obj) {
//сохраняем себе название страны
country=obj.properties.get('text').split(', ')[0];
// alert(obj.properties.get('text'));
if (obj.properties.get('text').split(', ')[1] != undefined) {
var mustAdd=true;
for (var reg in geocodeRegs) {
if (obj.properties.get('text').split(', ')[1] == geocodeRegs[reg]) {mustAdd=false};
}
if (mustAdd){geocodeRegs.pus
}
});
// alertObj(geocodeRegs);
var canQuery=false;
for(var myCountry in YMCMCountries) {
if (YMCMCountries[myCountry].NameRus == country) {
canQuery=true;
}
}
if (canQuery) {
for(var myCountry in YMCMCountries) {
// alertObj(YMCMCountries[myCountry].NameRus);
if (YMCMCountries[myCountry].NameRus == country) {
var geoqueryRegs = [];
// alert (country);
var myQuery=ymaps.geoQuery(ym
myQuery.then(
function ()
{
myQuery.each(function (myQueryObj) {
//alertObj(myQueryObj.properties.getAll());
geoqueryRegs[myQueryObj.p
})
// alertObj(geoqueryRegs);
for(var regGeocode in geocodeRegs) {
// alert(geocodeRegs[regGeocode]);
for(var regGeoquery in geoqueryRegs) {
if (regGeoquery == geocodeRegs[regGeocode]) {
subRegion=regGeoquery;
subRegionOsmid=geoqueryRegs[regGeoquery];
//alert ('Соответствие найдено: '+regGeoquery);
}
}
}
var myText='';
if (subRegion != '') {
myText='<h2>Успешно найдено!</h2>Страна: '+country+'<br> Регион: '+subRegion+'<br> OSMID: '+subRegionOsmid;
}
else {
myText='<h2>Соответствия не найдено!</h2>Страна: '+country;
}
myText=myText+'<h2>Регионы из ответа geocode:</h2>';
for(var regGeocode in geocodeRegs) {
myText=myText+geocodeRegs[regGeocode]+'<br>';
}
myText=myText+'<h2>Регионы из ответа geoquery:</h2>';
for(var regGeoquery in geoqueryRegs) {
myText=myText+regGeoquery+'<br>';
}
document.getElementById('
},
function (){alert('No response');}
)
}
}
}
else
//Страна не в списке доступных для яндекс.регионов
{
document.getElementById('
}
});
});
}