" + txt; if(id ==0) li.innerHTML = txt; if(id > 0) { li.innerHTML = " "; li.innerHTML += ""; } li.onclick = function(e) { clearTimeout(viewTimer); var idx = e.currentTarget.id; if(idx > 0) viewTimer = setTimeout(WaitChart, 2000); if(idx < 0) { AJAX("devmenu/" + Math.abs(idx), "", SensMenu); sensUpd = 0; }}; ListSens.appendChild(li); }} function CamsMenu(response) { if(response.substr(0,1) != "[") { Msg(response); return; } var ListCams = GetObj("ListCams"); while(ListCams.children.length > 5) { ListCams.lastChild.remove(); } var favs = 0, items = eval(response); for(var i = 0; i < items.length; i++) { var id = items[i][0], txt = items[i][1]; var li = document.createElement("li"); if(txt == "") txt = "
"; if(id != 0) li.id = id; li.className = "menu"; if(id > 0) { li.innerHTML = " "; li.innerHTML += ""; } else li.innerHTML = txt; li.onclick = function(e) { clearTimeout(viewTimer); var idx = e.currentTarget.id; if(idx > 0) viewTimer = setTimeout(WaitView, 2000); }; ListCams.appendChild(li); }} function TrksMenu(response) { if(response.substr(0,1) != "[") { Msg(response); return; } var ListTrks = GetObj("ListTrks"); while(ListTrks.children.length > 5) { ListTrks.lastChild.remove(); } var favs = 0, items = eval(response); for(var i = 0; i < items.length; i++) { var id = items[i][0], txt = items[i][1]; var li = document.createElement("li"); li.id = id; li.className = "menu"; if(txt == "") txt = "
"; if(id > 1e10) { li.innerHTML = " "; li.innerHTML += ""; } else li.innerHTML = txt; li.onclick = function(e) { clearTimeout(viewTimer); var idx = e.currentTarget.id; if(idx > 1e10) viewTimer = setTimeout(WaitTrack, 3000); if(idx < 1e10 && idx > 0) AJAX("trkmenu", "from=" + idx, TrksMenu); }; ListTrks.appendChild(li); }} function FindTrack() { var dtime = ShowPrompt(UI["ListTrks"][0] + ":", ""); AJAX("trkmenu", "dtime=" + encodeURIComponent(dtime), TrksMenu); } function GPXSelTrks() { clearTimeout(viewTimer); var ids = GetSelected("ListTrks"), did = 0; if(ids.length < 1) { Msg(UI["NoTrksSel"]); return; } var did = Math.floor(ids[0]/1e10); for(var i = 0; i < ids.length; i++) { ids[i] = ids[i] % 1e10; } Go("/gpxout/" + did + "?ids=" + ids.join(","), 1); } function RenSelTrks() { clearTimeout(viewTimer); var ids = GetSelected("ListTrks"); var id=0, did=0, p1=0, p2=0, name=""; if(ids.length < 1) { Msg(UI["NoTrksSel"]); return; } for(var i = 0; i < ids.length; i++) { id = ids[i] % 1e10; did = Math.floor(ids[i]/1e10); name = GetObj("lb"+ids[i]).innerHTML; p1 = name.indexOf(",") + 2; p2 = name.lastIndexOf(","); name = ShowPrompt(UI["RenTrack"], name.substring(p1,p2)); if(name == false || name == null) continue; AJAX("trkren/" + did, "from=" + id + "&name="+encodeURIComponent(trim(name)), AJAXResult); }} function DelSelTrks() { clearTimeout(viewTimer); var ids = GetSelected("ListTrks"); if(ids.length < 1) { Msg(UI["NoTrksSel"]); return; } var did = Math.floor(ids[0]/1e10); Ask(UI["DelSelTrks"].replace("%",ids.length),'AJAX("trkdel/'+did+'","ids='+ids.join(",")+'",AJAXResult);trksUpd=0'); } function MapLink() { var GP = map.getCenter(); var url = "https://narodmon.com/"; url += "?lat=" + Math.round(GP.lat()*1e4)/1e4; url += "&lon=" + Math.round(GP.lng()*1e4)/1e4; url += "&zoom="+ map.getZoom(); url += "&map=" + map.getMapTypeId(); var ids = GetSelected("ListType"); if(ids.length > 0 && ids.length < 27) { url += "&types=" + ids.join(","); } Input(UI["CopyLink"], url); } function ShowMenu(btn, divname) { clearTimeout(menuTimer); HideAllMenu(); var div = GetObj(divname); if(!div) return; div.style.display = "block"; div.style.zIndex = 10; div.style.top = (getPos(btn,"Top") + btn.offsetHeight + 5) + "px"; var mleft = getPos(btn,"Left"); if(mleft + 140 > cw) mleft = mleft - 140; div.style.left = mleft + "px"; var dt = new Date(), now = dt.getTime(); if(divname == "sens" && (now - sensUpd) >= 60000) { sensUpd = now; AJAX("devmenu", "", SensMenu); } if(divname == "cams" && (now - camsUpd) >= 60000) { camsUpd = now; AJAX("cammenu", "", CamsMenu); } if(divname == "trks" && (now - trksUpd) >= 60000) { trksUpd = now; AJAX("trkmenu", "", TrksMenu); } menuTimer = setTimeout("HideDiv('" + divname + "')", 10000); } function HideAllMenu() { HideDiv("lang"); HideDiv("view"); HideDiv("sens"); HideDiv("cams"); HideDiv("trks"); HideDiv("hard"); HideDiv("soft"); HideDiv("help"); HideDiv("auth"); HideDiv("profile"); HideDiv("adm"); } function MenuOut(divname) { menuTimer = setTimeout("HideDiv('" + divname + "')", 1000); } function AddTrkPoint(GP, style, hint, info) { var PM = new google.maps.Marker({ position:GP, icon:style, title:hint }); if(info && info != "") { balloon.setPosition(GP); balloon.setContent(info); balloon.open(map); } return PM; } Ссылка на карту
Ближайшая веб-камера

- 12.03.2025 Метеостанция в СТ Орион, Ростовская обл., Россия
- 11.03.2025 Метеостанция в Усмань, Липецкая обл., Россия
- 10.03.2025 Метеостанция в Рогачёво, Московская обл., Россия
- 09.03.2025 Метеостанция в Серов, Свердловская обл., Россия
- 09.03.2025 Метеостанция в СТ Станкин-1, Московская обл., Россия >>
Народный мониторинг - это:
- удаленный мониторинг в помещении и на местности;
- отображение показаний датчиков и веб-камер на карте мира;
- публичный и приватный доступ к датчикам и веб-камерам;
- ведение фотоархива изображений с веб-камер;
- интерактивные графики показаний за сутки, неделю, месяц, год;
- уведомления о поломке и выходе за пределы;
- каталог готовых решений для мониторинга среды;
- примеры бюджетных решений от участников проекта;
- API для разработки приборов мониторинга;
- REST API для разработчиков приложений, виджетов, сайтов;
- каталог приложений для Android, iOS, Windows, Linux, MacOS.
Приглашаем к сотрудничеству:
- IT-специалистов (в 1ю очередь QT/Android);
- модераторов (контроль Правил и помощь пользователям);
- техписателей (публикация обзоров, подготовка документации);
- разработчиков электроники (расширение каталога приборов);
- переводчиков (локализация интерфейса) и дизайнеров иконок;
- спонсоров (куда же без них) для дальнейшего развития проекта.