Клуб API Карт

Как удалить многоугольник и добавить новый?

s.ivantchov
30 ноября 2012, 22:24

Карта создана,на ней есть обьект Polygon определенный как

 myGeometry = {
            type: 'Polygon',.......}

Он добавлен как  myMap.geoObjects.add(myGeoobject);

Все нормально, все отображается.

1)Вопрос как его теперь удалить?

2) как добавить новый обьект Polygon в уже созданную и отображаемую карту?

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

1) myMap.geoObjects.remove(myGeoobject)

2) точно так же, как и первый добавляли. В нужном месте пишете

myGeometry = {
            type: 'Polygon',.......}

myGeoobject= new ymaps.GeoObject({geometry: myGeometry})

myMap.geoObjects.add(myGeoobject);

 

сразу говорю, если, добавляется последовательно несколько полигонов и надо удалить  произвольный из них, то надо принять меры, чтобы в remove() попадало указание на нужный полигон. Это можно делать по-разному, в зависимости от того, что вызывает удаление - щелчок по полигону, выбор его из какого-то списка и т.д.

Если вы конкретизируете задачу, то постраюсь привести нужный пример

Полигоны определяются списком.

Пример желателен,конечно.

Есть ли ограничения на кол-во полигонов или кол-во точек внутри полигонов?

Насчет ограничений мне не ведомо - возможно есть ограничение на число объектов в геоколлекции, но в любом случае, думаю, это сотни тысяч, если не миллионы

Я гружу полигоны из базы, но это не принципаиально, раз они у вас включены в какой-то список, то с каждым полигоном можно сопоставить имя или идентификатор.

Посколькоу я не нашла способ вытаскивать объект из геоколлекции, не пытаясь узнавать у самого объекта, кто он такой (например, с помощью получения получения индекса через getIndex при щелчке по полигону), то я поступаю так:

а) создаю геоколлекцию для полигонов

var PolygonCollection=new ymaps.GeoObjectArray()

myMap.geoObjects.add(PolygonCollection)

б) создаю хэш (в смысле ассоциативный массив), чтобы обращаться к полигонам по именам

mypolygons={}

в) при добавлении полигонов из какого-то источника (в моем случае, при загрузке из БД, а у вас - из того источника, из которого формируется список), в цикле добавляю полигоны в сам список, сопоставляя с каждым имя или идентификатор (вобще что в списке отличает их друг от друга) и одновременно добавляю их в хэш и в геоколлекцию

....загрузка из источника координат, цвета и пр.....

....в моем случае грузятся с идентификаторами вида id1,id10,id25 - идентификаторы могут идти вразнобой, я получаю их из БД вместе с описанием самого полигона в переменную id

var myPolygon=new ymaps.GeoObject({geometry: myGeometry},  myOptions); //создали полигон на основе полученных откуда-то извне данных

mypolygons[id]=myPolygon; //добавили полигон в хэш и теперь мы всегда можем обратиться к нему по идентификатору (или имени)

PolygonCollection.add(mypolygons[id]) //собственно, выводим полигон на карту

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

mypolygons["id10"] или, если id забирается из списка в переменную cur_id,

mypolygons[cur_id].options.set[{fillColor:"#FF0000"}] //сменили цвет

для удаления опять же получаем из списка имя удаляемого полигона и делаем 2 действия

а) удаляем из геоколлекции

PolygonCollection.remove(mypolygons[cur_id])

б) удаляем из хэша

delete mypolygons[cur_id]

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

возможно, есть и более изящные способы, но я пока не нашла :)

Спасибо, теперь понятно.

Правда это работает пока только теоретически.

Пробую как Вы посоветовали и получаю:

Error: graphics.csg.internalShapes: возможно полигон не замкнут
Хотя если выводить все по отдельности все выводится

Может быть у вас при чтении в цикле какая-нибудь скобка где-нибудь теряется? Я с такой ошибкой ни разу не сталкивалась.

У меня полигоны (и не только они) прибывают из БД в виде json запроса, где фигура описана вот таким образом (выдернула пример со своей карты, координаты пусть не смущают, я в декартовой системе работаю)

{"id48":{"geometry":{"type":"Polygon","coordinates": [ [ [ 0.0124386, 0.0668192 ], [ 0.0122010, 0.0708113 ], [ 0.0153162, 0.0718946 ], [ 0.0188850, 0.0740509 ], [ 0.0209633, 0.0717654 ], [ 0.0173818, 0.0692439 ], [ 0.0148670, 0.0679135 ], [ 0.0124386, 0.0668192 ] ] ]},"properties":{"hintContent":"ареал1","balloonContent":"зеленое поле"},"options":{"strokeWidth": 1,"strokeColor": "#0000FF","strokeOpacity": 0,"strokeStyle": "solid"}},"id50":{...}, "id120":{...},...,"status":"OK"}

вся эта радость получается и обрабатывается вот таким кодом:

function LoadAreal(){   //load monster's areal
    $.getJSON("index.php?act=module&module=getareal",{id: UserId}, function(json){
        if (json.status == 'OK') {
            var getAreal=json;
            myareals={};
            for (var key in getAreal) { //key=id1, id2....
                if(key!="status"){
                    var ar = new ymaps.GeoObject({geometry: getAreal[key].geometry, properties: getAreal[key].properties}, getAreal[key].options);
                   myareals[key]=ar;
                   ArealMap.add(myareals[key])
                   }
            }

        }
    })
}

Никаких проблем не возникает. возможно, если бы вы показали ваш фрагмент кода, было бы проще сориентироваться. если удобно, можно перенести дальнейшее общение в почту, чтобы не мешать остальным

upd а уас полигоны с внутренними контурами?  internalShapes наводит на мысль о каком-то внутреннм контуре, но возможно я не права, лучше у разработчиков спросить, что эта ошибка означает

Ну - думаю что мы никому не мешаем - сидим тихо,обсуждаем проблему,никого не трогаем :)

Не пойму как но у меня все получилось - 75 полигонов выводятся на ура.А скобки идут тройные это не понятно, почему в api "coordinates

":[[[]]]  - зачем было так определять?Разработчикам api виднее...

75 выводится на ура, а на 76 ошибка? Вы не могли бы привести тогда описание этого "сбойного" полигона с его скобками, может быть мне отвлеченным взглядом удастся найти что-то подозрительное в нем? :)

насчет скобок, насколько я поняла так:

для точки [y,x]

для ломаной линии [[y1,x1],[y2,x2],...[yn,xn]]

для полигона, в связи с тем, что у него есть внешний и произвольное чивло внутренних контуров, вложенность усливается.

Да заработало - и слава богу.Завтра продолжу исследования.Интересное api у яндекса все же.

а вот, присмотрелась к своему полигону. он описывается так:

[[координаты линии внешнего контура],[координаты линии внутреннего контура1], [координаты линии внутреннего контура2]]

т.е.

[[[y1,x1],[y2,x2],..], [[Y1,X1],[Y2,X2],..],[[y1,x1],[y2,x2],..]]

да, читать неудобно

 

":[[[]]]  - зачем было так определять?Разработчикам api виднее...

Это стандарт, называется GeoJSON