Клуб API Карт

Геокодер - бага?

nolan23
3 сентября 2012, 13:22

http://www.pomnivoinu.ru/map/index1.php

нажимаем кнопочко Адрес и вбиваем Москва. получаем 10 штук москв )

начинаем по ним кликать. кое-где переходим на них, а кое-где - нет - летим в дефолт-сити (например, Россия, Липецкая область, село Подгорное, улица Москва , и Украина, Закарпатская область, река Москва

 

код - следующий:

* класс кнопки "поиск"
* @param options HASH
* @constructor
*/
function MyFindControl(options) {
this.state = new ymaps.data.Manager();
this.events = new ymaps.event.Manager();
options.container = $('<div></div>');
this.options = new ymaps.option.Manager(options);
this.parent = null;
}
MyFindControl.prototype = {
setParent : function(parent) {
// ...
container.
// здесь срабатывает кнопочко "искать"
on('click', '.btn', function(e) {
$(e.delegateTarget).trigger($.Event('geocode', {address : container.find('INPUT[name=address]').val()}));
}).
// тут все геокодируется on('geocode', function(e) { var address = e.address;
// тут важно, что boundedBy - это границы карты
ymaps.geocode(address, { results: 10, boundedBy: map.getBounds()}).then(function(res) {
var firstGeoObject = res.geoObjects.get(0),
results = res.metaData.geocoder.results;
if (!!firstGeoObject) {
map.setCenter( firstGeoObject.geometry.getCoordinates(), Math.max(11, map.getZoom()));
var html = '<p>Вы искали: <strong>'+_gui.escapeHTML(address)+'</strong></p>' + '<p>Найден адрес:<strong> '+ firstGeoObject.properties.get('text') + '</strong></p>' + '<img src="http://www.pomnivoinu.ru/img/hr.gif" class="hr" alt=""/>';
if (results > 1) {
html += '<p><strong>Другие похожие адреса:</strong></p>';
var i=1;
while (res.geoObjects.get(i)) {
html += '<p><a href="#" class="address" '+ 'data-coords="'+res.geoObjects.get(i).geometry.getCoordinates().toString()+'" style="color:#024CA5;" >'+ res.geoObjects.get(i).properties.get('text') + '</a></p>';
i++;
}
html +='<img src="http://www.pomnivoinu.ru/img/hr.gif" class="hr" alt=""/>';
}
html +='<a href="javascript://" class="action" data-action="putobject" style="color:#024CA5;">Поставить объект здесь</a>';
container.trigger('close');
var contentLayout = ymaps.templateLayoutFactory.createClass(html, { build: function() {
contentLayout.superclass.build.call(this);
$(this.getParentElement()).on('click', '.address', function(e) {
e.preventDefault();
var coords = $(this).attr('data-coords').split(',');
// тут самое интересное - при клике на адрес - двигаем по координатам, а потом вызываем геокодирование.
// карта двигается, я проверял.
map.panTo([parseFloat(coords[0]), parseFloat(coords[1])], {
callback: function() {
container.trigger($.Event('geocode', {address : address})); } }); });
},
clear: function() {
$(this.getParentElement()).off();
contentLayout.superclass.clear.call(this); } });
controller.balloon = map.balloon.open(firstGeoObject.geometry.getCoordinates(), {}, { contentBodyLayout: contentLayout, maxWidth : 300} ); } }); });
},
getParent : function() { return this.parent; } };

 

7 комментариев
Подписаться на комментарии к посту

убери, пожалуйста, код под врезку

Ну, сама схема странная.
Берём готовый адрес (пришедший, очевидно, из самого геокодера) и геокодируем его повторно **с учётом текущих границ карты** - зачем? Там же уже есть координаты.

все правильно. на ту же москву вываливается 146 совпадений, а показываю я всего 10.

адрес готовый не кодируем обратно, а делаем тотже запрос, но с учетом новых границ карты.

А вообще, я посмотрел обычным веб-инспектором - на геокодирование уходит запрос "Москва", а не "Россия, Липецкая область, село Подгорное, улица Москва". Где-то в логике работы ошибка.

ненене. все правильно. в логике нет ошибок.

логика такая - из списка "еще найденных" по клику делается тот же запрос, но с тяготением к новому центру карты (boundedBy - не зря же)

поэтому, первым вытряхивается нажатый адрес. но не всегда. вот я хочу понять почему?

А новый центр карты откуда берётся?

карта панится на новый адрес и на коллбэке геокодится по getBounds()