Клуб Народной карты

Удаление "жёлтых" точек

Никита Юшков
13 августа, 11:41

И первый вопрос: «Серьёзно?». Ответ: «Да, абсолютно».

Ну, а если действительно серьёзно, то много слов не нужно. В общем, теперь можно во всеуслышание заявить: «Отныне проблема жёлтых точек решена!». И это действительно так.

Теперь любой пользователь может удалять т. н. «жёлтые» точки (правильно это называется «Точки пересечения границ»).

Специально для этой операции был написан скрипт, который требует от пользователя лишь ввести примерные координаты той самой злополучной точки и слой, в котором она находится. Всё.

Теперь о том, как это всё происходит.

При запуске скрипта пользователь видит окно:

Координаты вводятся в современном формате: [широта], [долгота] (например, 52.058243, 47.648066).

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

В появившемся окошке с координатами нажимаем на кнопку «копировать»:

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

Скрипт сделает запрос на наличие точек пересечения для выбранного слоя в окрестностях введённой координаты и выведет ближайшую из таких точек:

Вы можете посмотреть предполагаемый объект в новой вкладке, нажав по кнопке «Посмотреть», либо сразу нажимать «Удалить». Ничего «вредного» сервер Вам сделать не даст,  максимум будет лишь сообщение об ошибке).

В случае успешного проведения операции удаления Вы получите соответствующее уведомление:

В Вашей истории правок после этого появится запись об этой операции.

_______________________________________________________________________________________________________

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

Код букмарклета (last update 22:36 23.08.18):

javascript:

function loadScripts( src, callback ) {
    var script = document.createElement("SCRIPT"),
        head = document.getElementsByTagName( "head" )[ 0 ],
        error = false;
    script.id = "jQ";
    script.type = "text/javascript";
    script.onload = script.onreadystatechange = function( e ){
        if ( ( !this.readyState || this.readyState == "loaded" || this.readyState == "complete" ) ) {
            if ( !error ) {
                removeListeners();
                callback( true );
            } else {
                callback( false );
            }
        }
    };
    script.onerror = function() {
        error = true;
        removeListeners();
        callback( false );
    }; 
    function errorHandle( msg, url, line ) {
        if ( url == src ) {
            error = true;
            removeListeners();
            callback( false );
        }
        return false;
    }
    function removeListeners() {
        script.onreadystatechange = script.onload = script.onerror = null;
 
        if ( window.removeEventListener ) {
            window.removeEventListener('error', errorHandle, false );
        } else {
            window.detachEvent("onerror", errorHandle );
        }
    }
    if ( window.addEventListener ) {
        window.addEventListener('error', errorHandle, false );
    } else {
        window.attachEvent("onerror", errorHandle );
    }
    script.src = src;
    head.appendChild( script );
}

function exit(){document.getElementById('okn').parentNode.removeChild(document.getElementById('okn'));}
function letsgo(){
    var zn = document.getElementById('in1').value;
    var s = 0;
    do{ s++; if(s>zn.length){f=1; break;}}
    while(!(zn[s] == ','));
    if(f==0){b[0]=zn[0];
    b[1]=zn[s+2];
    for(var i = 1; i<s; i++)b[0]+=zn[i];
    for(var i = s+3; i<zn.length; i++)b[1]+=zn[i];
    b[0]=Number(b[0]);
    b[1]=Number(b[1]);}
    if(!((b[0] === undefined) || (b[1] === undefined) || (b[0] === null) || (b[1] === null) || isNaN(b[0]) || isNaN(b[1]))){
    type = document.getElementById('in2').selectedIndex;
    document.getElementById('okn').parentNode.removeChild(document.getElementById('okn'));
    var jQ = document.getElementById('jQ');
    if (jQ === null){loadScripts('https://yastatic.net/jquery/3.1.1/jquery.min.js', function(status){if (status) { fun1()};});
                    }else fun1();
    }else{f=0; alert('Координаты введены некорректно'); document.getElementById('ext').onclick = exit; document.getElementById('lg').onclick = letsgo; document.getElementById('in1').onkeypress=function(e){
    if(e.keyCode==13){
        letsgo();
    }
};
    document.getElementById('in2').onkeypress=function(e){
    if(e.keyCode==13){
        letsgo();
    }
};}}

function fun1(){$.ajax({
    url : "https://n.maps.yandex.ru/api/batch",
    type : "POST",
    data : {
        "branch" :  0,
        "methods" : null,
        "token" : JSON.parse(localStorage.getItem('nk:token')),
        "lang" : "ru",
        "csrf_token" : null},
    success : function(data){tok = data.meta.csrfToken; f=0; fun2();},
    error : function(){f+=1; if(f<5){
        if(f<5){if(confirm('Не удалось выполнить запрос № 1. Осталось попыток: '+(5-f)+'. Попробовать снова?'))fun1();}}
        else{alert('Не удалось выполнить запрос. Попробуйте позже.');}}
});}

function fun2(){ 
    var lat = b[0];
    var lon = b[1];
    lat = lat * Math.PI / 180.0;
    var a = 6378137;
    var k = 0.0818191908426;
    var z1 = Math.tan(Math.PI / 4 + lat / 2) / Math.pow(Math.tan(Math.PI / 4 + Math.asin(k * Math.sin(lat)) / 2) , k);
    var pix_Y = Math.round((20037508.342789 - a * Math.log(z1)) * 53.5865938 / Math.pow(2.0, 23 - z));
    lat = Math.round(pix_Y / 256);
    lon = lon * Math.PI / 180.0;
    var pix_X = Math.round((20037508.342789 + a * lon) * 53.5865938 / Math.pow(2.0 , 23 - z));
    lon = Math.round(pix_X / 256);
    for(var i = 0; i<9; i++){
        method[i].params.x += lon;
        if(method[i].params.x<0)method[i].params.x=Math.pow(2,z);
        if(method[i].params.x>Math.pow(2,z))method[i].params.x=0;
        method[i].params.y += lat;
        method[i].params.zoom = z;
        method[i].params.categories = cat[type];
    }
    $.ajax({
    url : "https://n.maps.yandex.ru/api/batch",
    type : "POST",
    data : {
        "branch" :  0,
        "methods" : JSON.stringify(method),
        "token" : JSON.parse(localStorage.getItem('nk:token')),
        "lang" : "ru",
        "csrf_token" : tok},
    success : function(data){
        if(!((data.data[0].data === null) || (data.data[0].data === undefined))){
        f = 0;
        type = data;
        fun3();}
        else{f+=1; if(f<5){
        if(confirm('Не удалось выполнить запрос № 2. Сервер сообщил об ошибке. Осталось попыток: '+(5-f)+'. Попробовать снова?'))fun2();}
        else{alert('Не удалось выполнить запрос. Попробуйте позже.');}}
    },
    error : function(){f+=1; if(f<5){
        if(confirm('Не удалось выполнить запрос № 2. Осталось попыток: '+(5-f)+'. Попробовать снова?'))fun2();}
        else{alert('Не удалось выполнить запрос. Попробуйте позже.');}}
});}

function fun3(){
    b[0] = b[0] * Math.PI / 180.0;
    b[1] = b[1] * Math.PI / 180.0;
    for(var i = 0; i<9; i++){
        for(var j = 0; j < type.data[i].data.data.features.length; j++){
            lat = type.data[i].data.data.features[j].properties.geoObject.geometry.coordinates[1];
            lon = type.data[i].data.data.features[j].properties.geoObject.geometry.coordinates[0];
            lat = lat * Math.PI / 180.0;
            lon = lon * Math.PI / 180.0;
            z = Math.acos(Math.sin(b[0])*Math.sin(lat)+Math.cos(b[0])*Math.cos(lat)*Math.cos(lon-b[1]));
            if(z<min){min = z; mas[0]=i; mas[1]=j;}
        }
    }
    if(!(mas[0] === null)){
        z = type.data[mas[0]].data.data.features[mas[1]].properties.geoObject.id;
        var htm = '<div id="okn1" style="position: fixed; z-index: 99999; right: 600px; top: 350px;  background: #fff"><form><fieldset><legend>Удаление точек пересечения границ</legend><p>Предполагаемый объект:</p><table><tr><td>ID: '+z+'</td><td><a class="button10" href="https://n.maps.yandex.ru/#!/objects/'+z+'" target="_blank">Посмотреть</a></td></tr><tr><td><br></td></tr><tr><td><a class="button10" id="ext1">Выйти</a></td><td><a class="button10" id="lg1">Удалить</a></td></tr></table></fieldset></form></div>';
        document.getElementsByTagName('body')[0].insertAdjacentHTML('beforeEnd',htm);
        document.getElementById('ext1').onclick = exit1; 
        document.getElementById('lg1').onclick = prefun4; 
    }else{alert('Не удалось найти точку. Попробуйте в следующий раз задать координаты более точно.');}
}

function exit1(){document.getElementById('okn1').parentNode.removeChild(document.getElementById('okn1'));}

function prefun4(){
    req[0].params.id = z;
    document.getElementById('okn1').parentNode.removeChild(document.getElementById('okn1'));
    fun4();
}

function fun4(){
    $.ajax({
    url : "https://n.maps.yandex.ru/api/batch",
    type : "POST",
    data : {
        "branch" :  0,
        "methods" : JSON.stringify(req),
        "token" : JSON.parse(localStorage.getItem('nk:token')),
        "lang" : "ru",
        "csrf_token" : tok},
    success : function(data){
        if(!((data.data[0].data === null) || (data.data[0].data === undefined))){alert('Точка успешно удалена');}
        else{f+=1; if(f<5){
        if(confirm('Не удалось выполнить запрос № 3. Сервер сообщил об ошибке: '+data.data[0].error.type+'. Осталось попыток: '+(5-f)+'. Попробовать снова?'))fun4();}
        else{alert('Не удалось выполнить запрос. Попробуйте позже.');}}
    },
    error : function(){f+=1; if(f<5){
        if(confirm('Не удалось выполнить запрос № 3. Осталось попыток: '+(5-f)+'. Попробовать снова?'))fun4();}
        else{alert('Не удалось выполнить запрос. Попробуйте позже.');}}
});
}

var f = 0;
var z = 21;
var b =[null,null];
var mas = [null, null];
var min = 1000;
var type;
var req = [{"method":"editor/deleteGeoObject","params":{"id":null}}];
var method = [{"method":"editor/getGeoObjectHotspots","params":{"x":-1,"y":+1,"zoom":21,"categories":null}},{"method":"editor/getGeoObjectHotspots","params":{"x":0,"y":+1,"zoom":21,"categories":null}},{"method":"editor/getGeoObjectHotspots","params":{"x":+1,"y":+1,"zoom":21,"categories":null}},{"method":"editor/getGeoObjectHotspots","params":{"x":-1,"y":0,"zoom":21,"categories":null}},{"method":"editor/getGeoObjectHotspots","params":{"x":0,"y":0,"zoom":21,"categories":null}},{"method":"editor/getGeoObjectHotspots","params":{"x":+1,"y":0,"zoom":21,"categories":null}},{"method":"editor/getGeoObjectHotspots","params":{"x":-1,"y":-1,"zoom":21,"categories":null}},{"method":"editor/getGeoObjectHotspots","params":{"x":0,"y":-1,"zoom":21,"categories":null}},{"method":"editor/getGeoObjectHotspots","params":{"x":+1,"y":-1,"zoom":21,"categories":null}}];
var cat = ["hydro_fc_jc", "vegetation_jc", "ad_jc", "relief_jc"];
var sk = document.getElementById('sk');
if (sk === null){document.getElementsByTagName('body')[0].insertAdjacentHTML('beforeEnd','<style id="sk">a.button10 {display: inline-block; color: black; font-size: 110%; text-decoration: none; user-select: none; padding: .25em .5em; outline: none; border: 1px solid rgb(250,172,17); border-radius: 7px; background: rgb(255,212,3) linear-gradient(rgb(255,212,3), rgb(248,157,23)); box-shadow: inset 0 -2px 1px rgba(0,0,0,0), inset 0 1px 2px rgba(0,0,0,0), inset 0 0 0 60px rgba(255,255,0,0); transition: box-shadow .2s, border-color .2s;} a.button10:hover { box-shadow: inset 0 -1px 1px rgba(0,0,0,0), inset 0 1px 2px rgba(0,0,0,0), inset 0 0 0 60px rgba(255,255,0,.5);} a.button10:active { padding: calc(.25em + 1px) .5em calc(.25em - 1px); border-color: rgba(177,159,0,1); box-shadow: inset 0 -1px 1px rgba(0,0,0,.1), inset 0 1px 2px rgba(0,0,0,.3), inset 0 0 0 60px rgba(255,255,0,.45);}</style>');}
document.getElementsByTagName('body')[0].insertAdjacentHTML('beforeEnd','<div id="okn" style="position: fixed; z-index: 99999; right: 600px; top: 350px;  background: #fff"><form><fieldset><legend>Удаление точек пересечения границ</legend><table><tr><td>Координаты:</td><td><input type="text" autocomplete="off" size="15" id="in1"></td></tr><tr><td>Слой:</td><td><select id="in2"><option selected>Гидрография</option><option>Растительность</option><option>АТД</option><option>Рельеф</option></select></td></tr><tr><td><a class="button10" id="ext">Выйти</a></td><td><a class="button10" id="lg">Найти точку</a></td></tr></table></fieldset></form></div>');
document.getElementById('ext').onclick = exit; 
document.getElementById('lg').onclick = letsgo;
document.getElementById('in1').onkeypress=function(e){
    if(e.keyCode==13){
        letsgo();
    }
};
document.getElementById('in2').onkeypress=function(e){
    if(e.keyCode==13){
        letsgo();
    }
};

Установка стандартно через диспетчер закладок браузера (в Яндекс.Браузере и Google Chrome можно открыть комбинацией клавиш Ctrl + Shift + O).

P. S. Создание этого скрипта было довольно увлекательным занятием. Помимо подробного наблюдения за работой веб-редактора НЯКа пришлось изучить достаточно материала по проекции Меркатора, используемым в геосервисах параметрам земного шара, устройству данных в геосервисах, формированию тайлов, залезать в геометрию (в частности, вычислять длину ортодромии) и др.

Ну что ж, главное, что всё удалось :)

108 комментариев
Круть неимоверная! Спасибо
Да ладно
Красава)
Супер!
Никита огромная вам благодарность за проделанную работу.
 Вопрос не по теме. Можете сделать скрипт,который будет сохранять настройки отображения слоёв ?  Уверен многим будет нужно.
Никита Юшков
13 августа, 12:47
Алекс Khm,
для этого скрипта сделать сохранение слоёв? Это, конечно, можно сделать, но нужно ли оно? Ведь каждый раз используется разный слой, во всяком случае у меня :)
Никита Юшков,
Похоже, что речь просто про сохранение настроек, без относительно к данному скрипту.
Никита Юшков
13 августа, 13:55
Алекс Khm,
параметры этих слоёв лежат в localStorage в nk:app-settings, насколько я помню. Если у Вас браузер не затирает localStorage и куки, то всё должно сохраняться. Если не сохраняется, нужно искать решение проблемы в настройках браузера, иначе никак.
Никита Юшков,
Можете подсказать как удалять историю браузера,но сохранять  localStorage в nk:app-settings ?
Никита Юшков
13 августа, 14:35
Алекс Khm,
просто в панели очистки истории ставьте галки только у истории просмотров и кэша, остальное не ставьте.
Никита Юшков,
Спасибо,помогло.
Позор Яндексу и его программерам, которые не могут сделать аналогичную фичу штатно, хотя их об этом много раз просили!
Survivor2007,
Один человек, который по его словам, начал изучать джаву всего пару недель назад сделал то, о чем Яндекс просят 2 года...
Survivor2007,
А ВЫ думаете Яндексу это надо- наши проблемы, им надо что бы мы пахали. А про то что облегчить труд им все до лампочки, пашите ребята и не просите ни чего пока сами не сделаете. 
 Не однократно предлагал что бы модераторы пользовались всеми облегчающими сервисами типа групповых операций, не взирая на то в каком слое он работает. Ответ был анекдотичный: "При групповой операции вы можете удалить пол города", модерацию доверяют, а групповуху нельзя. Да кому надо он и вручную удалит пол города!  Теперь принципиально давая название дорогам 8 и9 классов, класс не меняю, пусть сами меняют если не ценят время других. 
  Никита большое спасибо за ваши новшества. Теперь свои хотелки в клуб писать безполезно, будем адресовать Никите.
  Первая: более двух лет поднимался вопрос прилипания точек границ растительности, гидрографии и АТД.  Карту хочется сделать красивее и удобнее. Границы растительности и гидрографии в большенстве случаев проходят по одной границы. Корректируешь одну из них потом второй раз повторяешь туже работу, но когда еще и границы АТД проходят по зтим границам проходить третий раз желание пропадает. А на сколько было проще бы одну откорректировать, а следующии прилипить.
Никита Юшков
13 августа, 15:24
МВА,
можно сделать копирование координат участков границ для создания их в другом слое. Я это недавно делал вручную, но в принципе можно попытаться автоматизировать. Вот только к этой штуке, скорее всего, уже всех подряд подпускать нельзя будет, ибо легко можно испортить карту.
МВА,
+100
Survivor2007,
у них есть эта возможность для сотрудников. Так что могут, видимо, не считают нужным давать доступ всем. Так что не факт, что лавочку не прикроют.
Fleget
Сотрудник Яндекса13 августа, 15:54
Alexxegorov,
да, не стоит забывать про то, что некоторыми фичами мы пока не готовы делиться со всем миром :) 
Fleget,
какими же, если не секрет?))
Fleget,
Никиту берите во фронт-енд разрабочтики :) 
Fleget
Сотрудник Яндекса16 августа, 14:37
kary4rus,
например, групповое редактирование )
Очень круто!! Помнится Яндекс говорил, что такое сделать технически невозможно. 
Lex,
Да уж, теперь появляются сомнения действительно ли всё остальное, о чём мы годами просим, так сложно или "программисты" просто не умеют и не хотят заморачиваться.
Fleget
Сотрудник Яндекса13 августа, 13:56
Lex,
мы не говорили, что это сделать невозможно. Речь шла о том, что желтые точки сами по себе не мешаются, и поэтому разработчики заняты более приоритетными задачами. 
Мы на самом деле очень рады тому, что появились ребята, которые готовы сами браться за несложные задачи, на которые у нас не получается найти время. Со своей стороны готовы оказывать всяческую посильную поддержку в этом деле :)

Fleget,
Так можно рассуждать о чём угодно и стоять на месте, отказываясь от решений, которые сократят тысячи часов пользовательского времени, в угоду не потраченного одного дня одного программиста. 
Телефонные скобки, как вы помните, мы по прежнему продолжаем вводить руками, что бы они потом исчезали в справочнике. Проблема с форматом скобок решается в 5 классе школы на уроке по хтмл.
Обновлено 13 августа, 15:10
Алексей Т.
13 августа, 15:28
Fleget,
но теперь вам же будет проще добавить это в свой (и наш) инструментарий? Очень жждём!
sc1a,
 Ору!!!! За...л (зачеркнуто) Надоел этот грустный справочник....
Fleget
Сотрудник Яндекса13 августа, 17:33
sc1a,
а мы разве стоим на месте? Посмотрите сколько релизов выпускается регулярно, и сколько всего в них делается.
Fleget,
В последнее время я замечаю исправление лишь багов, обновление языков и иконок, либо введение тех вещей, которые мало кто ждал. Даже соседний пост о нововведениях за последний месяц, по сравнению со скриптом по удалению пересечений в этом свете выглядит весьма иронично. Те мелочи, которые просят пользователи практически не реализуется и игнорируются, и если повезет мы получим желанное нововведение за год в количестве одной штуки. 
Учитывая что те мелочи, которые мы просим, один программист вполне способен реализовать за один-два дня, можно сказать что да, сервис сейчас если и не стоит, то ползёт.
Поэтому и становится непонятно на кого ориентируется разработка НЯК - на внутренние нужды команды Яндекса или всё же на пользователей, которые им пользуются?
Обновлено 13 августа, 17:51
Fleget,
Михаил, извини меня, но вы стоите на месте. За этот год всего четыре, это всем Яндексом, а парень меньше чем за меяц  наворочал больше вашего на порядок больше. И ни кто из вас его даже не поблагодарил.
Fleget,
Да, а пару лет назад Анна отписала что разрывы на дороге ни на что не влияют. Но при этом их надо жесточайше удалять.


Мне почему-то кажется, что если-бы "жёлтые точки" не мешали жить, то и скрипта этого писать не стали.


И я полностью согласен с коллегами - вы стоите на месте в части функционала пользователей. Все изменения в НЯК, которые я последнее время наблюдаю, сделаны только для картинки. Заливочки, расскрасочки, кнопочки другого цвета и в другом месте - вот всё что делается в НЯК на данный момент. Да и то зачастую не удачно. Вспомните реакцию коллег на изменение заливки "зелёнки" и построек, на раскраску велодоступности и ещё много чего.

Картинка, конечно, видна лучше. Но содержимое - нужнее. По крайней мере нам. Тем людям, которые рисуют для вас карту.


А впрочем, что вам говорить. Вам всё равно. Может, не лично вам, но вообще - однозначно. Иначе не родилась-бы аллергическая фраза "это не приоритетная задача"
Fleget,
Мне кажется, что всё-таки разработчикам следует уделять внимание "несложным" и "неважным" вещам, о которых просит значительно количество народных картографов.
.,
Да, заливки лесов так себе.
Fleget,
вы действительно готовы помогать? Тогда подскажите, почему сервер возвращает ошибку "missing uid parameter" и что с этим делать?
Fleget,
точки вроде как и не мешаются но.. вот контур, их содержащий, уже не обладает опцией "перерисовать",  и вот в этом случае они дико бесят, а не просто мешаются )) 
Fleget
Сотрудник Яндекса16 августа, 14:39
Noita,
передам это пожелание :)
Lex,
Пишу всей ветке.


От всех ваших возмущений, уважаемые коллеги, толку всё равно не будет ни какого. У Яндекса свои жутко секретные приоритеты, о которых ни кто ничего не знает. Поэтому что-то им говорить занятие бесперспективное.
Расслабьтесь и всё будет хорошо. Не знаю, правда, у кого. Но точно будет.
Fleget
Сотрудник Яндекса16 августа, 14:39
.,
последний раз вас прошу не писать и не решать что-то за Яндекс :)
Fleget,
Михаил, а вы не только к хотелкам прислушивайся, а и к недовольству тех кто эти хотелки пишет, но толку от их писанины никакого
Fleget
Сотрудник Яндекса16 августа, 17:41
МВА,
мы ко всему прислушиваемся )

Семён Федотов
13 августа, 13:16
Никита, дай вам Бог на эти коротенькие 7 веков за такие чудеса)))
В куске кода:
if (s > 20) {
  break;
  f = 1;
}
`f = 1` никогда не будет выполнено.


А можно в двух словах, как это всё работает, а то изучение недокументированного кода может занять продолжительное время (а там ещё и формулы какие-то). Удаляет два куска и создаёт один вместо них?


Кстати, было бы здорово давать функциям более понятные имена. ;)
Никита Юшков
13 августа, 13:57
EVGVir,
это защита от зацикливания в одном из случаев некорректного ввода координат
Никита Юшков,
Я к тому, что если выкинуть строку `f = 1`, то программа будет работать ровно так же. Это строка никогда не может быть выполнена.
Никита Юшков
13 августа, 14:21
EVGVir,
я посмотрю позже с компа. Может, она здесь вообще не нужна. Спасибо.
Никита Юшков,
А вообще мой вопрос был не про то как работает этот кусок кода, а вообще про весь скрипт. В двух словах если не сложно.
Никита Юшков
13 августа, 19:52
EVGVir,
извините за задержку, с виндой на компе проблема была, повозился изрядно.
В общем, этот скрипт переводит географические координаты в тайловые, делает запрос на сервер для получения информации о точках определённого слоя (делается запрос по 9 тайлам), дальше он вычисляет длину ортодромии между введёнными координатами и координатами каждой найденной точки, находит минимальную, выводит на экран. Ну, а при нажатии кнопки "Удалить" идёт снова запрос на сервер, только это уже запрос на удаление объекта. Если очень вкратце, то вот так. Тут многое упущено, что-то намеренно, что-то просто из-за мелочности. Если интересно более подробно - стучитесь в личку.
Никита Юшков
13 августа, 21:51
EVGVir,
поправил этот момент. Она нужна. Спасибо за наводку)
Никита Юшков,
Миша, еще раз - берите Никиту во фронт-енд для НЯК. Реверсижениринг и добиливание фич. Проще если он будет в команде ) Если конечно сам хочет :)))
Ух, ох.


А вот тут вообще или сразу пролетит или зависнет нафиг:
while(!(zn[s] == ','));
Никита Юшков
13 августа, 13:59
EVGVir,
ну там же под do стоит break, так что не волнуйтесь. Я это всё тестил
Никита Юшков,
Да, тут я ступил, с таким форматированием запутался немного.
На ГитХабе существует вот такая неофициальная организация:
https://github.com/nmaps


На сколько я понимаю, в неё входят такие всем известные ребята как: Okclick, Falcon, Alexxegorov. Было бы здорово, сделать эту организацию более открытой. И разрабатывать там новые скрипты. Включая этот. Это выведет их качество на новый уровень.
Ребята, откроете доступ?
EVGVir,
Что-то я не нашёл места на Гитхабе, чтобы постучаться оттуда к вам.
Обновлено 13 августа, 13:53
Написал в личку Okclick-у (его проще всех найти в топе =), подождём ответа.
EVGVir,
не, я данную организацию не создавал. Вероятно, это был кто-то из двух оставшихся. Да, там опубликована одна из старых версий скрипта (который теперь называется NMapsTweaks) с моими правками. Но у меня в GitHub только персональный акк, и то я завёл его относительно недавно, после настойчивых просьб некоторых пользователей NMapsTweaks.
EVGVir,
мой вклад уже давно перешёл к Ocklick, так что мне выкладываться смысла нет :)
Alexxegorov,
А кто хозяин этой ГитХабовской организации? Falcon?
EVGVir,
возможно. Точно не я. Может история топиков в клубе подскажет.
EVGVir,
раз не я и не Alexx, то, судя по всему, он. Но почему так свет клином сошёлся именно на этой организации в GitHub, и именно в GitHub?
☭Okclick,
ГитХаб более-менее стандартное место для совместной разработки открытых проектов. Понятно, что площадок много разных. Эта одна из самых известных.
Ну, а организация имеет подходящее имя. Зачем плодить много разных, мне кажется лучше объединиться всем желающим в одном месте. В конце-концов я не думаю, что будет слишком много желающих этим заниматься, что прям отбоя не будет. И чем всем сидеть по разным уголкам, лучше делать что-то вместе в месте со внятным именем.
Тем временем, я создал issue (ставьте лайки, подписывайтесь на канал, вся-такое). Надеюсь автор ответит.
И кстати да Никита. Темперманкей пишет ,что данный скрипт не верен и не может быть сохранён ?!?!
Никита Юшков
13 августа, 14:18
Алекс Khm,
этот скрипт реализован как букмарклет, в tampermonkey его кидать не надо, он там работать не будет.
Никита Юшков,
Ясно-понятно.
Теперь мы все чуть ближе к сотрудикам Яндекса в плане возможностей.
Круто!
Alexxegorov,
Привет! А я тебя как раз выше упоминал. Ответь пожалуйста про ГитХаб.
Вот это да, как много плюшек для НЯК за один раз! Спасибо!!!
Никита возможно ли объединение трёх фич, которые вы сегодня нам подарили,в одну панель с возможностью её перемещения?
Никита Юшков
13 августа, 19:53
Алекс Khm,
подумаем со знакомыми о создании расширения для браузера.
Никита Юшков,
Подскажите еще раз как установить данный код по пунктам. Браузер Хром.
Никита Юшков
13 августа, 23:58
Roger81,
открываете диспетчер закладок (Ctrl + Shift + O), кликаете правой кнопкой мыши на странице диспетчера, добавляете новую страницу, в поле "Ссылка" кидаете код, называете как-нибудь. А потом в НЯКе открываете эту закладку.
Обновлено 13 августа, 23:58
Никита Юшков,
Спасибо, все получилось!
 "Установка стандартно через диспетчер закладок браузера".
Можно подробнее как это,  для меня безграмотного.
 Заранее спасибо.
Никита Юшков
14 августа, 02:03
Legion1020,
прям в предыдущем комментарии описывал) Но могу повторить :)
"Открываете диспетчер закладок (Ctrl + Shift + O - для хрома и яндекс), кликаете правой кнопкой мыши на странице диспетчера, добавляете новую страницу, в поле "Ссылка" кидаете код, называете как-нибудь. А потом в НЯКе открываете эту закладку."
Никита Юшков,
 Работает!!!
Таких людей надо беречь. Золотая голова.
Никита Юшков,
Никита я создал пост с мини-гайтом совсем для новичков. Но Миша не провустил мотивируя то что сайт FAQ НЯК Помощь картографам не Яндексовский.  И это уже реклама чужих сайтов. Разместил его в контакте.
https://vk.com/id399286226
МВА,
Миша очень правильно сказал
davtian.sarkis,
Сдаётся мне что ты намного хуже Simonyana.  Думаю прав был Simonyan по отношению к тебе. Это не красивый поступок с твоей стороны.
Никита Юшков,
У меня в Firefox не работает.
Никита Юшков
16 августа, 01:31
Noita,
у меня, к сожалению, нет Firefox, не знаю, в чём может быть проблема. Если есть возможность, отпишитесь по этой проблеме мне в личку.
Никита Юшков
16 августа, 01:57
Noita,
как я понял, в Firefox вообще нет возможности использовать скрипты-букмарклеты.
Комментарий удалён
МВА,
Имею полное право соглашаться с словами Миши 
Fleget
Сотрудник Яндекса16 августа, 14:41
МВА,
очень вас прошу не разводить склоки в Клубе. Буду банить за это. 
Fleget,
Если лелкий человечишка то от него это не отнимешь. Для чего он мне про другого в личку пишет гадости и потом удаляет эти письма. Но после того как я ему ответил, не так как он хотел
https://yadi.sk/i/31t3MASZ3aHdKr
вчера, 19:40
От: МВА
Кому: davtian.sarkis
В лубой ситуации если я вижу что человек прав, и не важно как он относится ко мне, я становлюсь на сторону его правоты. А если не прав то и уважаемого человека ставлю на место. Так что вам надо с ним разобраться полюбовно. Я понял что это Симонян.


После этого он пишет дешевый комментарий и гадости в личку.
Да и с того текста что вы удалили понять можно что за натура.
А банить можете, но другие теперь будут знать что это за картограф.
Я этот бан переживу, но другим будет урок, что не надо про других писать гадости не в личку ни в Клуб, 
Обновлено 17 августа, 08:08
Legion1020,
я прям рад, что я не один такой..)))  хотя все сделал правильно как оказалось.  
Обновлено 16 августа, 13:11
Ох блин. Ну, респектище! :)
Не понятно вот что: почему Яндекс не может удалить "лишние" (т.е. те, из которых растут только два ребра) желтые точки автоматическом режиме, проходом бота?
Олег Чечулин
14 августа, 14:58
stickerspb,
Там же ещё ограничение на максимальное количество обычных точек между двумя жёлтыми. Иногда жёлтые точки специально создавать приходится. 
на mac os в любом браузере постоянно не может найти точку, на винде ок 
Никита Юшков
15 августа, 11:45
stylesvoboda,
какая ошибка выходит на маке?
Никита Юшков,
Не удалось найти точку. Попробуйте в следующий раз задать координаты более точно.
Никита Юшков
15 августа, 12:00
stylesvoboda,
тогда сложно сказать, почему не ищется( Нужно смотреть, что там происходит
Никита Юшков,
А у меня в Хроме на Маке работало, но до вчерашнего дня, теперь не работает, хотя Хром, ОС и прочее - не обновлял. Может быть, что-то поменялось в коде у Яндекса 
Никита Юшков
24 августа, 12:57
Constantinidis,
знаем-знаем. Вчера вышло обновление, в Клубе оно появилось ровно сейчас. Так что теперь всё снова должно работать)
Никита Юшков
24 августа, 12:59
Lex,
вчера код был скорректирован для скриптов, использующих запросы на сервер, то есть для точек и создания шаблонов. Сейчас обновление опубликовалось. Теперь всё должно работать снова)
Никита подскажите сколько времени у вас ушло на разработку,тесты и релиз этой всей красоты ?
Никита Юшков
15 августа, 12:55
Алекс Khm,
дня 4 я наблюдал за работой веб-редактора, искал наиболее удобный способ выбора нужной точки, читал разные материалы. Потом 2 дня (скорее, 2 ночи) у меня ушло на написание кода. Затем 2 выходных дня длилось закрытое тестирование, в понедельник вышел релиз. Как-то так)
Никита Юшков,
Спасибо. Очень нужные вещи. 
Никита Юшков,
 Никита, а ты бы смог протолкнуть Жириновского в президенты США на следующий срок? Пусть им там мозги на место вставит.
Вот это здорово! Вы большой молодец!
Наконец-то, можно избавиться от этих "неисправляемых" и "неудаляемых" заусенцев.
После нескольких дней плодотворной борьбы с желтками букмарклет стал выдавать одно и то же сообщение независимо от категории объекта, после активации "Найти точку" пишет только "Не удалось выполнить запрос № 2. Сервер сообщил об ошибке. Осталось попыток: 4. Попробовать снова?" 


Который день проблема не уходит.  Что делать? 
Никита Юшков
25 августа, 11:25
Dr.@lex,
позавчера была немного изменена работа сервера, код скрипта был в тот же день обновлён в теме. Так что просто обновитесь и пользуйтесь дальше :)
Никита Юшков,
Примерно так и подумал) Спасибо. 
Большое спасибо. 
Получаю удовольствие.