Клуб API Карт

Ограничение на количество вершин в Многоугольнике.

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

Здравствуйте!

1) Второй день роюсь по докам и сети. Не могу никак разобраться, КАК мне ограничить число возможных вершин полигона. maxPoints вроде надо применить, но не работоает. Создаю полигон так:

 

Текст кода:

var myPolygon = new ymaps.Polygon([[e.get("coordPosition")]], { hintContent: "123" }, { strokeWidth: 2, strokeColor: '#FF6C24', fillColor: '#FFFFFF92' }

myMap.geoObjects.add(myPolygon);

myPolygon.editor.startDrawing(

 

 Подскажите, как можно ограничить число возможных вершин?

 

2) Имею в строковом виде координаты точек полигона ("1.001, 2.001, 1.002, 2.333 и т.д."). Каким образом мне с помощью этой строки построить новый многоугольник (ведь он требует 3х мерный массив)?

В JS я не особо опытен, проблемы с определением массива. Ибо, если его определить в самом начале: var aaa = new Array( то он, как я понял, не будет соответствовать формату требуемого массива.

P.S: решил второй вопрос наконец-таки таким вот способом, но нутром чую, не очень он хорош и наверняка можно с помощью каких-нибудь регулярных выражений решить дело в 2 строки. Вот как я сделал пока:

 

function strToCoords(coords) {
                    var res = "["; // начало нашей строки
                    var lastDevider = -1; // запоминалка позиции последней запятой, раделяющей именно ПАРЫ координат, т.е. каждая вторая запятая
                    var coordNum = 0; // счетчик запятых всего
                    for (i = 0; i < coords.length; i++) {
                        if (coords[i] == ",") {
                            coordNum++;
                            // если эта запятая разделяет пары координат, вытаскиваем эту пару координат добавляя скобки по краям
                            if (coordNum % 2 == 0) {
                                res = res + "[" + coords.substring(lastDevider + 1, i) + "],";
                                lastDevider = i; // запоминаем теперь последнюю запятую, разделявшую пары координат
                            }
                        }
                    }
                    // т.к. последняя пара координат не записывается(в конце строки нет запятой), записываем ее отдельно
                    res = res + "[" + coords.substring(lastDevider + 1, coords.length) + "]]";
                    res = (new Function('return [' + res + ']'))( // преобразуем полученную строку в массив
                    return res;
                }

 

 

Спасибо!

6 комментариев

1.

 

myPolygon.editor.startDrawing();myPolygon.editor.options.set('maxPoints', 5);

 


2. Надо передавать в "строковом виде" JSON

и все что нужно будет сделать это JSON.parse(coords);

А вы ерундой занимаетесь substring, регулярки... это все здесь не нужно

Т,е. подключить 100 килобайтовый файл для одного действия - это не ерундой страдать? Или я не так что-то понимаю?

что будет весить 100кб?

 

Раз все так просто, напишите уже пожалуйста пример. Я cколько не рылся, так и не понял, что делать. С JSON вообще в жизни никогда дела не имел. Спасибо.

Я конечно напишу, но на сервере вам тоже нужно будет чтото написать.

Оно просто копи-пастом работать не будет

 

 

$.getJSON(''http://_your_domain_/data.json', function (json) {

    $(json.polygons).each(function (index, polygon) {

        map.geoObjects.add(new ymaps.Polygon(polygon.geometry));

    });

});

 

 

с сервера должно приходить чтото типа

 

{ polygons : [      { "geometry" : [[[35.7, 57.5], [35.6, 57.4], [35.8, 57.9]]]},      { "geometry" : [[[35.6, 57.4], [35.5, 57.8], [35.2, 57.6]]]},      { "geometry" : [[[35.2, 57.8], [35.1, 57.6], [35.2, 57.8]]]},        .....]}        

 

 

Разобрался таки) Да, на сервере уже не заработало)) Как я понял, теперь там надо как то эту строку отпарсить, чтобы работать с ней на самом сервере, надеюсь у .net есть такие средства или буду ковыряться)

У меня не совсем так, правда, получилось, как вы привели в примере, но за ваш пример тоже спасибо.

 

Таким образом отправляем координаты полигона:

var myJSONObj = { "coordinates": myPolygon.geometry.getCoordinates() };

$('#polyCoords').attr('value', JSON.stringify(myJSONObj.coordinates));

 

Таким образом принимаем их:

var myJSONObj = JSON.parse($('#polyCoords').attr('value'));

var myTmpPol = new ymaps.Polygon(myJSONObj, { hintContent: "11111111" }, { strokeWidth: 5, strokeColor: '#000000', fillColor: '#00000092' });

myMap.geoObjects.add(myTmpPol);

 

Так же верно? (Во всяком случае, работает. Правда, пока серверную часть кода закоментил)

 

Только теперь нужно будет разобраться, как отправленную строку отпарсить и "понять" на сервере.