Клуб API Карт

Получить вершины многоугольника. API 2.0 [Решено. Частично]

Пост в архиве.

В предыдущей версии чтобы получить вершины многоугольника (полигона) можно было сделать так:

points = polygon.getPoints()

Как это реализовано в новой версии?

points = polygon.getCoordinates() - не помогает.

 


20 комментариев
Евгений Белоусов
28 января 2016, 03:43

polygon.geometry.getCoordinates()

Не получается.

Firebug пишет:

 

polygon.geometry is null
Может это связано с тем, что polygon получен из внешнего YMapsML файла?

 

Евгений Белоусов
28 января 2016, 03:43

он виден на карте?

покажите код получения YMapsML и работы с полигоном

Код получения YMapsML:

ymaps.geoXml.load('zone.xml')

   .then(function (res) {

      res.geoObjects.options.set('interactivityModel', 'default#transparent'); 

      zoneh.add(res.geoObjects);

}); 

Добавляю их на карту:

map.geoObjects.add(zoneh);

 

как ты у полигона получаешь геометрию?

Пытаюсь вот так:

points = polygon.geometry.getCoordinates()

polygon это точно полигон, а не коллекция (обычно у коллекций геометрия == null)

что тебе возвращает в этом месте

polygon instanceof ymaps.Polygon

?

Вот ссылка на xml файл с описанием полигонов

http://map.teploov.ru/zone.xml

polygon instanceof ymaps.Polygon - выдает "false"

 

polygon instanceof ymaps.Polygon - выдает "false"

значит это не полигон =) 

ты пытаешься получить геометрию у чего-то другого

(я подозреваю что у коллекции)

xml-файл не поможет

напиши, как ты создаешь переменную "polygon"

У меня получилось сделать так:

points = polygon.getPixelBounds();

а, points[i]  - возвращает координаты, видимо пиксельные.

Теперь понять бы как вычленить из этого широту и долготу, а еще лучше получить географические координаты.

Теперь по созданию polygon.

Сначала загружаю из файла опсиание областей:

 

ymaps.geoXml.load('http://map.teploov.ru/zone.xml')

   .then(function (res) {

      res.geoObjects.options.set('interactivityModel', 'default#transparent');

      zoneh.add(res.geoObjects);

});

Затем пользователь выбирает метку и происходит передача координат метки в функцию (надеюсь правльно передаю):

polygons = getPolygons(ClimatObjHum.geometry.getCoordinates());

ClimatObjHum - это выбранный объект из коллекции на карте.

Сама функция 

 

function getPolygons (point) {

   if (flagLoad) {

      return zoneh.each(function (obj) {

         return inPolygon(obj, point);

      });

   } else {

      return false;

}}

 

Я перебираю все области на карте, чтоб найти ту, которой принадлежит метка:

 

function inPolygon (polygon, point) {

   var c = 0;

   for (var i = 0, points = polygon.getPixelBounds(), j = points.length - 1; i < points.length; j = i++) {

      if ((((points[i].getLat()

(point.getLng() > (points[j].getLng() - points[i].getLng()) * (point.getLat() - points[i].getLat()) / (points[j].getLat() - points[i].getLat()) + points[i].getLng())

      ){

         c = !c;

      }

   }

   return c;

}


 

function getPolygons (point) {

   if (flagLoad) {

      return zoneh.each(function (obj) {

         return inPolygon(obj, point);

      });

   } else {

      return false;

}}

тут очевидно ерунда написана

return zoneh.each вернет тебе zoneh, а не полигон

да и это

return inPolygon(obj, point);

не будет возвращено из функции getPolygons т.к. этот return относится к обработчику each, а не к getPolygons

Может я не так поступаю.

У меня есть xml файл с описанием полигонов.

И несколько меток на карте.

Пользователь кликает на метку и я хочу найти в какой полигон попала метка.

polygons = getPolygons(ClimatObj.geometry.getCoordinates());

 function getPolygons (point) {

if (flagLoad) {

return zoneh.each(function (obj) {

return inPolygon(obj, point);

});

} else {

return false;

}

}

 Ну и выясняю попадание точки

 function inPolygon (polygon, point) {

var c = 0;

for (var i = 0, points = polygon.geometry.getCoordinates(), j = points.length - 1; i < points.length; j = i++) {

...

  

у геометрии полигона есть метод contains

он проверяет попадание точки в полигон

используй его

function getPolygons (point) {

   if (flagLoad) {

      return zoneh.each(function (obj) {

           if (obj.geometry.contains(point)) { alert("Да")}

});

} else {

return false;

}

}

  Cannot call method 'contains' of null

ты же в zoneh кладешь коллекции целиком

 

zoneh.add(res.geoObjects);

res.geoObjects - это коллекция

тебе еще их надо перебирать

или не класть коллекции а только их элементы

перекладывать

т.е. заменить на такое:

 

res.geoObjects.each(function (geoObject) {
    zoneh.add(geoObject);
});

 

Спасибо большое. Вобщем все настроил. Все работает. Кроме одного момента.

(как же без этого).

Если добавлять в zoneh таким способом:

 

ymaps.geoXml.load('http://map.teploov.ru/zone.xml')

.then(function (res) {

res.geoObjects.options.set('interactivityModel', 'default#transparent'); 

zoneh.add(res.geoObjects);

});

 

То все области отображаются, но функции не работают.

А если таким:

 

ymaps.geoXml.load('http://map.teploov.ru/zone.xml')

.then(function (res) {

res.geoObjects.each(function (geoObject) {

geoObject.options.set('interactivityModel', 'default#transparent');

zoneh.add(geoObject)})

});

 

То две области не отображаются. Просто пусто вместо них.

Пример тут: http://map.teploov.ru/index_api222.html

да вроде всё у тебя работает

карта за полигоны таскаетсяА вообще наверное достаточно выставить interactivityModelдля zoneh, и тогда не надо для каждого элемента коллекции

Нет. Я про то, что если нажать кнопку "Зоны влажности", то появляются полигоны. Но не все. Между красным и синим должен быть еще зеленый и в первом варианте кода, она отображается, но не определяется пренадлежность метки к ней.