Клуб API Карт

Вхождение адреса в полигон, созданный из YMapsML

Фещуков Сергей
27 августа 2015, 10:35

Подключаю Яндекс.Карты API 1 версии, вставляю созданные объекты с помощью YMapsML, затем пытаюсь определить входит ли адрес в созданный полигон. Но на любой адрес выдаёт, что адрес не входит в зону.

/* Инициализация Яндекс.Карты и подключение YMapsML */

var ymap, mymap, polygon;

function YMinit (lat, long) {

ymap = new YMaps.Map($('#YMaps'));

ymap.setCenter(new YMaps.GeoPoint(76.56738030, 60.94011121), 2);

mymap = new YMaps.YMapsML('https://maps.yandex.ru/export/usermaps/pmpMpvWDWSZdyMxu40fUbwfy9WdxA1XB/');

ymap.addOverlay(mymap);

YMaps.Events.observe(mymap, mymap.Events.Load, function() {

var obj = this.filter(function (obj) {

return obj.name == 'В черте города';

});

polygon = obj[0];

});

}

YMaps.load(YMinit);

 

/* Попытка определения адреса */

var addr = 'Мира, 23';

var geocoder = new YMaps.Geocoder(addr + ', Нижневартовск');

YMaps.Events.observe(geocoder, geocoder.Events.Load, function(geocoder) {

if ( geocoder.length() ) {

var point = geocoder.get(0).getGeoPoint();

if ( !polygon.contains(point) ) {

console.log('К сожалению, адрес не входит в зону доставки!');

return false;

} else

console.log('Всё в порядке');

} else {

console.log('К сожалению, адрес не входит в зону доставки!');

return false;

}

});

 

Если взять координаты из файла YMapsML и создать полигон внутри скрипта (по аналогии со статьей из гиктаймса), то определение адреса проходит успешно.

Что я делаю не так? Сравнивал объекты polygon, полученные разным методом, вроде ничем толком не отличаются.

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

Геокодер "отрабатывает" раньше чем загрузка yml, и на момент проверки polygon пустой?

Напоминаю - разработка и поддержка первой версии прекращена несколько лет назад. Даже 2.0 уже все - переходите на 2.1

Фещуков Сергей
28 августа 2015, 17:12

Нет, инициализация происходит при загрузке страницы, а проверка адреса при отправке формы. Проверял, polygon в это время уже не пустой. И вообще, если бы он был пустой, в консоли я бы увидел ошибку - попытка вызова метода в неизвестной/пустой переменной.

В любом случае советую переходить на более новые АПИ. Первую версию уже давно закопали, и понять причину ошибки будет достаточно сложно.

Фещуков Сергей
29 августа 2015, 13:09

Чем заменить функцию contains? в 2.1 не нашёл аналога этой функции

someObject.geometry.pointInPolygon и/или используйте geoQuery