Клуб API Карт

3 вопроса: "Линейка-флажок", определение региона и ближайшая точка

ovvk-info
24 апреля 2010, 14:51

1. На странице в разделевнешние элементы управления показано как сделать кнопку "Линейка-переключатель", а как сделать кнопку-флажок для линейки?


Следующий код не сработал:




var toolBar = new YMaps.ToolBar([]

//Даже, если просто написать var toolBar = new YMaps.ToolBar(



// Добавляем кнопку "Линейка"

var buttonRul = new YMaps.ToolBarToggleButton(YMaps.ToolBar.DEFAULT_GROUP, {
 
        icon: "http://api-maps.yandex.ru/i/0.3/icons/icon-ruler.png", 
 
        hint: "Линейка"

}       



// Включает линейку, когда кнопка активна

YMaps.Events.observe(buttonRul, buttonRul.Events.Select, function () {
      this.getMap().enableRuler(

}, toolbar);



// Выключает линейку, когда кнопка неактивна

YMaps.Events.observe(buttonRul, buttonRuln.Events.Deselect, function () {
 
        this.getMap().disableRuler(

}, toolbar);

Просто появилась кнопка без картинки и требуемых функций, хотя она работатет как положено "кнопке-флажку".




2. Как определить принадлежность точки к определнной области, в частности интересует принадлежность в модуле "Регионы". Ищешь в поиске город по названию, карта центруется на найденном населенном пункте и ты получаешь название региона.



3. Есть несколько подгруженных xml-файлов с координатами, можно ли средства яндекса определить ближайшую точку или надо мерить в цикле расстояние между всеми точками. И если мерить надо в цикле, то видимо это надо делать этим методом - http://api.yandex.ru/maps/jsapi/doc/ref/reference/geopoint.xml#distance - можно ли посмотреть на рабочий пример?

7 комментариев
Подписаться на комментарии к посту
1. У кнопки-флажка первым параметром в конструкторе идет контент, а не номер группы. Также вы опечатались Ruln -> Rul.
Вот пример работающего кода:
var buttonRul = new YMaps.ToolBarToggleButton({
        icon: "http://api-maps.yandex.ru/i/0.3/icons/icon-ruler.png",
        hint: "Линейка"
    });

map.addControl(new YMaps.ToolBar([buttonRul]));
       
// Включает линейку, когда кнопка активна
YMaps.Events.observe(buttonRul, buttonRul.Events.Select, function () {
    this.getToolBar().getMap().enableRuler();
});
2. В API нет метода определения принадлежности точки многоугольнику. Вам необходимо реализовать данный алгоритм самостоятельно. Например, алгоритмы можно взять из википедии.

3. Да, можно мерить с помощью этого метода. А в чем конкретно возникла сложность?

3. Я не понимаю как это реализовать.

Есть найденные координаты (показана часть кода):

 

var geocoder = new YMaps.Geocoder(value, {results: 20, boundedBy: map.getBounds()});

geoResult = this.get(0);


 


Есть xml файл, например:http://api.yandex.ru/maps/ymapsml/examples/xml/ballooncontent.xml .

Как определить расстояние между найденной координатой geoResult и первой координатой в xml-файле.

Например следующий запрос, наверно, должен выдавать 0:


 


var m = new YMaps.GeoCoordSystem.distance(geoResult.getGeoPoint(), geoResult.getGeoPoint());

 Но видимо я не понял как это работатет.
Метод distance() вызывать нужно у геоточки, вот так:
var moscow = new YMaps.GeoPoint(37.609218,55.753559),
    piter = new YMaps.GeoPoint(30.313497,59.938531);

alert(moscow.distance(piter));

А как использовать distance() для результатов геокодирования и YMapsML-файла?

Следующий код не работает:

var geocoder = new YMaps.Geocoder(value, {results: 20, boundedBy: map.getBounds()});

.....

geoResult = this.get(0);

....

geoResult.getGeoPoint().distance(ml[0].get(0).get(0).Point.pos);


 

Геокодирование - это асинхронный процесс. Получать доступ к результатам геокодирования можно в обработчике Load:
var geocoder = new YMaps.Geocoder("Москва");

YMaps.Events.observe(geocoder, geocoder.Events.Load, function (geocoder) {
    var geoResult = this.get(0);
    geoResult.getGeoPoint().distance(anyGeoPoint);
});

Про эту асихронность я уже 100 раз прочитал и запомнил.

Меня интересует как измерить расстояние от точки полученой через GeoCoder и точки полученной от YMapsML. 

geoResult.getGeoPoint().distance(ml[0].get(0).get(0).Point.pos);