var map, mapsDictionary; var basemap, cadastreMap, urbanPlanningMap, municipalityPropertiesMap; var cadfindTask; var cadfindParams; var munIdentifyTask; var munIdentifyParams; var cadIdentifyTask; var cadIdentifyParams; var adminIdentifyParams; var urbanIdentifyTask; var adminIdentifyTask; var urbanIdentifyParams; var addressResults; var cadResults; var addressQuery; var addressQueryTask; var cadBuildingQuery; var cadParcelQuery; var planParcelQuery; var planQuarterQuery; var cadBuildingQueryTask; var cadParcelQueryTask; var planParcelQueryTask; var planQuarterQueryTask; var simpleMarkerSymbol; var simpleFillSymbol; var popupMarkerSymbol; var popupFillSymbol; var pointGraphic; var polygonGraphic; var isMeasuringActive = false; var Dom; var All; var Promise; if (typeof String.prototype.startsWith != 'function') { String.prototype.startsWith = function (str) { return this.slice(0, str.length) == str; }; } if (typeof String.prototype.trim !== 'function') { String.prototype.trim = function () { return this.replace(/^\s+|\s+$/g, ''); } } Array.prototype.binaryIndexOf = function (searchElement) { 'use strict'; var minIndex = 0; var maxIndex = this.length - 1; var currentIndex; var currentElement; while (minIndex <= maxIndex) { currentIndex = (minIndex + maxIndex) / 2 | 0; currentElement = this[currentIndex]; if (currentElement < searchElement) { minIndex = currentIndex + 1; } else if (currentElement > searchElement) { maxIndex = currentIndex - 1; } else { return currentIndex; } } return -1; } Array.prototype.binaryStartsWithIndexOf = function (searchElement) { 'use strict'; var minIndex = 0; var maxIndex = this.length - 1; var currentIndex; var currentElement; while (minIndex <= maxIndex) { currentIndex = (minIndex + maxIndex) / 2 | 0; currentElement = this[currentIndex]; if (currentElement.startsWith(searchElement)) { while (currentIndex > 0 && this[currentIndex - 1].startsWith(searchElement)) { currentIndex--; } return currentIndex; } else if (currentElement < searchElement) { minIndex = currentIndex + 1; } else if (currentElement > searchElement) { maxIndex = currentIndex - 1; } else { return currentIndex; } } return -1; } function createAttachmentsDiv() { return '

'; } function GetIdentifyTemplate(layerId, layerName) { if (layerName == "Центрове за административни услуги") { return new esri.InfoTemplate(" ", '

Център за административни услуги

${Име}'); } else if (layerName == "Квартали") { return new esri.InfoTemplate(" ", '

Квартал

${Пълно име}'); } switch (layerId) { case 0: if (layerName == "#Рег. план - Квартали") { return new esri.InfoTemplate(" ", '

Квартал (регулация)

${Име}
Предназначение на територията: ${Предназначение на територията}
Характер на застрояване: ${Характер на застрояване}
Дата на актуалност: ${Дата на актуалност}
'); } else { return new esri.InfoTemplate(" ", '

Рекламно съоръжение

${Вид на Рекламоносителя}
Фирма: ${Фирма}
Месечна цена: ${Месечна цена} лв.

' + createAttachmentsDiv() + ' Прочети повече '); } case 1: if (layerName == "#Рег. план - Парцели") { return new esri.InfoTemplate(" ", '

У П И

${Име}
Предназначение на територията: ${Предназначение на територията}
Характер на застрояване: ${Характер на застрояване}
Дата на актуалност: ${Дата на актуалност}
'); } else { return new esri.InfoTemplate(" ", '

Паркинг

${Стопанисван от}
Собственост: ${Собственост}
Вид на паркинга: ${Вид на Паркинга}

' + createAttachmentsDiv() + '
Прочети повече '); } case 2: return new esri.InfoTemplate(" ", '

Общинска концесия

${Номер по регистрация}
${Идентификационен номер на вписването}
Oбщинското участие: ${Предмет на концесията}

' + createAttachmentsDiv() + '
Прочети повече '); case 3: return new esri.InfoTemplate(" ", '

Образование

${Име}
Тип: ${Тип на заведението}
Адрес: ${Адрес}

' + createAttachmentsDiv() + '
Прочети повече '); case 4: return new esri.InfoTemplate(" ", '

Общинска собственост

${Номер на досие}
${Вид и описание на имота}
${Местонахождение}

' + createAttachmentsDiv() + '
Прочети повече '); case 5: return new esri.InfoTemplate(" ", '

Здравеопазване

${Име}
Вид: ${Вид на обекта}${Вид на Обекта}
Адрес: ${Адрес}${ADDRESS}

' + createAttachmentsDiv() + '
Прочети повече '); case 6: return new esri.InfoTemplate(" ", '

Местно управление

${Име на институцията}
Адрес: ${Адрес}
WEB: ${WEB}

' + createAttachmentsDiv() + '
Прочети повече '); case 7: return new esri.InfoTemplate(" ", '

Туризъм

${Име}
Вид: ${Вид Обект}
Адрес: ${Адрес}

' + createAttachmentsDiv() + '
Прочети повече '); case 8: if (layerName == "#Сгради") { return new esri.InfoTemplate(" ", '

Сграда

${Кадастрален идентификатор}
Kонструкция: ${Вид конструкция}
Предназначение: ${Функционално предназначение}
Брой етажи: ${Брой етажи}
Брой доп. етажи: ${Брой доп. етажи}
Брой самостоятелни обекти: ${Брой самостоятелни обекти}
Площ от CAD/ZEM: ${Площ от CAD/ZEM}
Година на построяване: ${Година на построяване}
Стар планоснимачен номер: ${Стар планоснимачен номер}
Дата на актуалност: ${Дата на актуалност}
'); } else { return new esri.InfoTemplate(" ", '

Култура

${Име}
Тип: ${Тип на Културна Институция}
Адрес: ${Адрес}

' + createAttachmentsDiv() + '
Прочети повече '); } case 9: return new esri.InfoTemplate(" ", '

Спорт

${Наименование}
Вид: ${Вид обект}
Адрес: ${Адрес}

' + createAttachmentsDiv() + '
Прочети повече '); case 10: if (layerName == "#Имоти") { return new esri.InfoTemplate(" ", '

Имот

${Кадастрален идентификатор}
Номер на парцел (регулация): ${Номер на парцел (регулация)}
Номер на квартал (регулация): ${Номер на квартал (регулация)}
Вид собственост: ${Вид собственост}
Вид територия: ${Вид територия}
Начин на трайно ползване: ${Начин на трайно ползване}
Площ от CAD/ZEM: ${Площ от CAD/ZEM}
Закон, по който са установени границите: ${Закон, по който са установени границите}
Въвод във владение: ${Въвод във владение}
Стар планоснимачен номер: ${Стар планоснимачен номер}
'); } else { return new esri.InfoTemplate(" ", '

Организация с нестопанска цел

${Наименование на юридическото лице с нестопанска цел}
Организационна форма: ${Организационна форма на юридическото лице с нестопанска цел}
Адрес: ${Седалище и адрес на юридическото лице с нестопанска цел}

' + createAttachmentsDiv() + '
Прочети повече '); } case 11: return new esri.InfoTemplate(" ", '

Общинско предприятие

${Наименование на предприятието}
Предмет на дейност: ${Предмет на дейност на предприятието}
Органи на управление: ${Органи на управление на предприятието}

' + createAttachmentsDiv() + '
Прочети повече '); case 12: return new esri.InfoTemplate(" ", '

Гражданско дружество

${Наименование на гражданското дружество}
Цел: ${Цел на гражданското дружество}
Вноска и дял на общината: ${Вноска и дял на общината}

' + createAttachmentsDiv() + '
Прочети повече '); case 13: return new esri.InfoTemplate(" ", '

Търговско дружество

${Наименование на търговското дружество}
${Данни за търговската регистрация на търговското дружество, в т.ч. за преобразуването и прекратяването му}
Oбщинското участие: ${Размер на общинското участие в капитала на търговското дружество}%

' + createAttachmentsDiv() + '
Прочети повече '); } } function getParameterByName(name) { name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]"); var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"), results = regex.exec(location.search); return results == null ? null : decodeURIComponent(results[1].replace(/\+/g, " ")); } require(["dojo/parser", "esri/map", "esri/layers/ArcGISTiledMapServiceLayer", "esri/layers/ArcGISDynamicMapServiceLayer", "esri/dijit/Scalebar", "esri/layers/LayerInfo", "esri/tasks/IdentifyTask", "esri/tasks/IdentifyParameters", "esri/dijit/Popup", "esri/InfoTemplate", "esri/tasks/query", "esri/tasks/QueryTask", "esri/tasks/FindTask", "esri/tasks/FindParameters", "esri/graphic", "dojo/_base/Color", "esri/symbols/SimpleMarkerSymbol", "esri/symbols/SimpleLineSymbol", "esri/symbols/SimpleFillSymbol", "esri/units", "esri/geometry/Extent", "esri/geometry/Point", "esri/SpatialReference", "esri/dijit/Measurement", "dojo/dom", "esri/tasks/GeometryService", "esri/dijit/PopupTemplate", "esri/layers/FeatureLayer", "esri/layers/GraphicsLayer", "dijit/TitlePane", "dojo/i18n!esri/nls/jsapi", "dojo/_base/lang", "dojo/promise/all", "dojo/promise/Promise", "dojo/dom-style", "esri/config", "dijit/focus", "dijit/layout/BorderContainer", "dijit/layout/ContentPane", "dojo/domReady!"], function (parser, Map, ArcGISTiledMapServiceLayer, ArcGISDynamicMapServiceLayer, Scalebar, LayerInfo, IdentifyTask, IdentifyParameters, popup, InfoTemplate, Query, QueryTask, FindTask, FindParameters, Graphic, Color, SimpleMarkerSymbol, SimpleLineSymbol, SimpleFillSymbol, Units, Extent, Point, SpatialReference, Measurement, dom, GeometryService, PopupTemplate, FeatureLayer, GraphicsLayer, TitlePane, esriBundle, lang, all, promise, domStyle, esriConfig, Focus, BorderContainer, ContentPane) { Dom = dom; All = all; Promise = promise; var dojoConfig = { locale: "bg-bg" }; esriConfig.defaults.geometryService = new GeometryService(geometryServiceUrl); SetNLS_Strings(esriBundle); parser.parse(); initSymbols(SimpleMarkerSymbol, SimpleLineSymbol, SimpleFillSymbol); mapsDictionary = {}; var popup = new esri.dijit.Popup({ pagingInfo: true, pagingControls: true, titleInBody: false, highlight: true, fillSymbol: popupFillSymbol, markerSymbol: simpleMarkerSymbol }, dojo.create("div")); popup.resize(300, 300); dojo.connect(popup, "onSelectionChange", function (event) { handlePopupSelectionChanged(event); }); pointGraphic = new Graphic(); pointGraphic.setSymbol(simpleMarkerSymbol); polygonGraphic = new Graphic(); polygonGraphic.setSymbol(simpleFillSymbol); map = new Map("map", { spatialReference: new SpatialReference({ "wkid": 32635 }), infoWindow: popup, fadeOnZoom: true }); map.infoWindow._nls.NLS_pagingInfo = "(${index} от ${total})"; domStyle.set(map.infoWindow._maxButton, "display", "none"); map.infoWindow._prevFeatureButton.title = "Предишен обект"; map.infoWindow._nextFeatureButton.title = "Следващ обект"; map.infoWindow._maxButton.title = "Уголемяване на панела"; map.infoWindow._actionList.children[0].textContent = "Приближаване"; map.infoWindow._sizers[0].children[0].children[5].title = "Затваряне"; var scalebar = new Scalebar({ map: map, attachTo: "bottom-left", scalebarUnit: "metric" }); var measureTitlePaneWidget = new TitlePane({ title: "Измерване", content: '
', open: false }); dojo.connect(measureTitlePaneWidget, "onClick", function (event) { if (!this.open) { measurement.clearResult(); if (measurement.getTool()) { measurement.setTool(measurement.getTool().toolName, false); } } }); dom.byId("measureTitlePane").appendChild(measureTitlePaneWidget.domNode); measureTitlePaneWidget.startup(); var measurement = new Measurement({ map: map, defaultLengthUnit: Units.METERS, defaultAreaUnit: Units.SQUARE_METERS, defaultLocationUnit: Units.DEGREE_MINUTE_SECONDS }, dom.byId("measurementDiv")); measurement.startup(); domStyle.set(measurement._unitDropDown.domNode, "display", "none"); dojo.connect(measurement, "onToolChange", function (event) { if (measurement.getTool()) { isMeasuringActive = true; } else { isMeasuringActive = false; } }); dojo.connect(measurement, "onMeasureEnd", function (event) { // left for debugging puposes }); measurement.resultLabel.containerNode.innerText = "Резултат"; if (tiledBasemapUrl) { basemap = new ArcGISTiledMapServiceLayer(tiledBasemapUrl, { id: "basemap" }); } else { basemap = new ArcGISDynamicMapServiceLayer(dynamicBasemapUrl, { id: "basemap" }); } mapsDictionary["basemap"] = basemap; map.addLayer(basemap); cadastreMap = new ArcGISDynamicMapServiceLayer(cadastreMapUrl, { id: "cadastreMap", visible: false }); mapsDictionary["cadastreMap"] = cadastreMap; map.addLayer(cadastreMap); urbanPlanningMap = new ArcGISDynamicMapServiceLayer(urbanPlanningMapMapUrl, { id: "urbanPlanningMap", visible: false }); mapsDictionary["urbanPlanningMap"] = urbanPlanningMap; map.addLayer(urbanPlanningMap); adminMap = new ArcGISDynamicMapServiceLayer(adminMapUrl, { id: "adminMap", visible: false, opacity: 0.9 }); mapsDictionary["adminMap"] = adminMap; map.addLayer(adminMap); municipalityPropertiesMap = new ArcGISDynamicMapServiceLayer(municipalityPropertiesMapUrl, { id: "municipalityPropertiesMap" }); mapsDictionary["municipalityPropertiesMap"] = municipalityPropertiesMap; var allMunLayerIDs = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19, 20, 21] var allMunLayerDefinitions = []; for (var munLayerId in allMunLayerIDs) { allMunLayerDefinitions[munLayerId] = "ACTUALITY is NULL OR ACTUALITY = 0"; } municipalityPropertiesMap.setLayerDefinitions(allMunLayerDefinitions); map.addLayer(municipalityPropertiesMap); map.graphics = new GraphicsLayer(); munIdentifyTask = new IdentifyTask(municipalityPropertiesMapUrl); cadIdentifyTask = new IdentifyTask(cadastreMapUrl); adminIdentifyTask = new IdentifyTask(adminMapUrl); urbanIdentifyTask = new IdentifyTask(urbanPlanningMapMapUrl); dojo.connect(map, "onClick", handleIdentifyTask); var identifyMunLayerIDs = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] var identifyMunLayerDefinitions = []; for (var munLayerId in identifyMunLayerIDs) { identifyMunLayerDefinitions[munLayerId] = "ACTUALITY is NULL OR ACTUALITY = 0"; } munIdentifyParams = new IdentifyParameters(); munIdentifyParams.tolerance = 15; munIdentifyParams.returnGeometry = true; munIdentifyParams.layerIds = identifyMunLayerIDs; munIdentifyParams.layerOption = IdentifyParameters.LAYER_OPTION_ALL; munIdentifyParams.layerDefinitions = identifyMunLayerDefinitions; munIdentifyParams.width = map.width; munIdentifyParams.height = map.height; cadIdentifyParams = new IdentifyParameters(); cadIdentifyParams.tolerance = 0.5; cadIdentifyParams.returnGeometry = true; cadIdentifyParams.layerIds = [8, 10]; // Сгради и имоти cadIdentifyParams.layerOption = IdentifyParameters.LAYER_OPTION_ALL; cadIdentifyParams.width = map.width; cadIdentifyParams.height = map.height; adminIdentifyParams = new IdentifyParameters(); adminIdentifyParams.tolerance = 1; adminIdentifyParams.returnGeometry = true; adminIdentifyParams.layerIds = [0, 1]; adminIdentifyParams.layerOption = IdentifyParameters.LAYER_OPTION_ALL; adminIdentifyParams.width = map.width; adminIdentifyParams.height = map.height; urbanIdentifyParams = new IdentifyParameters(); urbanIdentifyParams.tolerance = 0.5; urbanIdentifyParams.returnGeometry = true; urbanIdentifyParams.layerIds = [0, 1]; // Квартали и парцели urbanIdentifyParams.layerOption = IdentifyParameters.LAYER_OPTION_ALL; urbanIdentifyParams.width = map.width; urbanIdentifyParams.height = map.height; var zoomToObjectId = getParameterByName("objectid"); var zoomToLayerId = getParameterByName("layerid"); var mapContext = getParameterByName("context"); dojo.connect(map, "onLoad", function () { if (zoomToLayerId != null && zoomToObjectId != null) { var zoomToQuery = new Query(); zoomToQuery.where = "OBJECTID = " + zoomToObjectId; zoomToQuery.returnGeometry = true; zoomToQuery.outFields = ["OBJECTID"]; zoomToQuery.outSpatialReference = map.spatialReference; var zoomToQueryTask = new esri.tasks.QueryTask(municipalityPropertiesMapUrl + zoomToLayerId); zoomToQueryTask.execute(zoomToQuery, function (results) { var features = results.features; if (features.length > 0) { var feature = features[0]; if (feature.geometry == null || (feature.geometry.type != 'point' && !feature.geometry.getExtent())) { alert("Обектът няма въведена геометрия в базата данни."); } else { if (feature.geometry.type == 'point') { zoomToPoint(feature.geometry); } else if (feature.geometry.type == 'polygon') { zoomToPolygon(feature.geometry); } } } }, function (error) { alert("Възникна грешка [ERROR - REGISTER ZOOM-TO] при приближаването към карта на търсения от Вас обект."); }); } }); addressQuery = new Query(); addressQuery.returnGeometry = true; addressQuery.outFields = ["*"]; addressQueryTask = new esri.tasks.QueryTask(addressQueryUrl); cadBuildingQuery = new Query(); cadBuildingQuery.returnGeometry = true; cadBuildingQuery.outFields = ["*"]; cadBuildingQueryTask = new esri.tasks.QueryTask(cadastreMapUrl + "/8"); cadParcelQuery = new Query(); cadParcelQuery.returnGeometry = true; cadParcelQuery.outFields = ["*"]; cadParcelQueryTask = new esri.tasks.QueryTask(cadastreMapUrl + "/10"); planParcelQuery = new Query(); planParcelQuery.returnGeometry = true; planParcelQuery.outFields = ["*"]; planParcelQueryTask = new esri.tasks.QueryTask(urbanPlanningMapMapUrl + "/1"); planQuarterQuery = new Query(); planQuarterQuery.returnGeometry = true; planQuarterQuery.outFields = ["*"]; planQuarterQueryTask = new esri.tasks.QueryTask(urbanPlanningMapMapUrl + "/0"); if (mapContext == "TSU") { setMapLayerVisibility('#cadastreMap', true); setMapLayerVisibility('#urbanPlanningMap', true); setMapLayerVisibility('#municipalityPropertiesMap', false); } var mapHypelink = $('#mapHypelink'); mapHypelink.prop('class', 'current'); var checkBoxIDs = [ "#basemap", "#cadastreMap", "#urbanPlanningMap", "#municipalityPropertiesMap", "#adminMap", ]; for (var checkBoxIndex = 0; checkBoxIndex < checkBoxIDs.length; checkBoxIndex++) { var checkBoxID = checkBoxIDs[checkBoxIndex]; if ($(checkBoxID).length) { $(checkBoxID)[0].addEventListener("click", function (event) { toggleMapVisibility(event.target); }); } } $("#searchImg")[0].addEventListener("click", search); $("#searchInput")[0].addEventListener("keypress", checkForEnterWhenSearching); }); function handleIdentifyTask(event) { if (isMeasuringActive) { return; } var munCheckbox = $('#municipalityPropertiesMap'); var cadCheckbox = $('#cadastreMap'); var urbanCheckbox = $('#urbanPlanningMap'); var adminCheckbox = $('#adminMap'); if (!munCheckbox.is(':checked') && !cadCheckbox.is(':checked') && !adminCheckbox.is(':checked') && !urbanCheckbox.is(':checked')) { return; } var deferreds = []; if (munCheckbox.is(':checked')) { munIdentifyParams.geometry = event.mapPoint; munIdentifyParams.mapExtent = map.extent; deferreds.push(munIdentifyTask.execute(munIdentifyParams)); } if (cadCheckbox.is(':checked')) { cadIdentifyParams.geometry = event.mapPoint; cadIdentifyParams.mapExtent = map.extent; deferreds.push(cadIdentifyTask.execute(cadIdentifyParams)); } if (adminCheckbox.is(':checked')) { adminIdentifyParams.geometry = event.mapPoint; adminIdentifyParams.mapExtent = map.extent; deferreds.push(adminIdentifyTask.execute(adminIdentifyParams)); } if (urbanCheckbox.is(':checked')) { urbanIdentifyParams.geometry = event.mapPoint; urbanIdentifyParams.mapExtent = map.extent; deferreds.push(urbanIdentifyTask.execute(urbanIdentifyParams)); } var promises = new dojo.DeferredList(deferreds); promises.then(dojo.hitch(this, function (allResults) { showInfoWindow(allResults, event.mapPoint); })); } function showInfoWindow(allResults, infoWindowPoint) { var allFeatures = []; allResults.forEach(function (deferredResult) { if (deferredResult[0]) { allFeatures = allFeatures.concat(deferredResult[1]); }; }); allFeatures = dojo.map(allFeatures, function (result) { var feature = result.feature; feature.attributes.layerName = result.layerName; feature.attributes.layerId = result.layerId; feature.setInfoTemplate(GetIdentifyTemplate(result.layerId, result.layerName)); for (var attribute in feature.attributes) { if (feature.attributes[attribute] == "Null") { feature.attributes[attribute] = ""; } } return feature; }); if (allFeatures.length > 0) { map.infoWindow.setFeatures(allFeatures); map.infoWindow.show(infoWindowPoint); } else if (map.infoWindow.isShowing) { map.infoWindow.hide(); } } function handlePopupSelectionChanged(event) { if (!map.infoWindow.features || map.infoWindow.selectedIndex < 0 || map.infoWindow.selectedIndex >= map.infoWindow.features.length) { return; } var layerName = map.infoWindow.features[map.infoWindow.selectedIndex].attributes.layerName; var layerId = map.infoWindow.features[map.infoWindow.selectedIndex].attributes.layerId; var objectID = map.infoWindow.features[map.infoWindow.selectedIndex].attributes.OBJECTID; if (layerName.startsWith("#")) { return; } var featureLayer = new esri.layers.FeatureLayer(municipalityPropertiesMapUrl.replace('MapServer', 'FeatureServer') + layerId); var deffered = featureLayer.queryAttachmentInfos(objectID, function (event) { if (event.length <= 0) { attachmentsDiv.innerHTML = ""; return; } var attachmentsHTML = 'Прикачени документи:
'; event.map(function (fileInfo) { var fileInfoName = fileInfo.name; if (fileInfoName.indexOf('@') > -1) { fileInfoName = fileInfoName.substring(0, fileInfoName.indexOf('@')); } attachmentsHTML += '  
' + fileInfoName + '
'; }); var attachmentsDiv = Dom.byId("attachmentsDiv"); attachmentsDiv.innerHTML = attachmentsHTML; }, function (error) { attachmentsDiv.innerHTML = ""; }); } function initSymbols(SimpleMarkerSymbol, SimpleLineSymbol, SimpleFillSymbol) { simpleMarkerSymbol = new SimpleMarkerSymbol( { "color": [255, 0, 0, 45], "size": 25, "xoffset": 0, "yoffset": 0, "type": "esriSMS", "style": SimpleMarkerSymbol.STYLE_CIRCLE, "outline": { "color": [255, 0, 0, 255], "width": 3, "type": "esriSLS", "style": SimpleLineSymbol.STYLE_SOLID } }); popupMarkerSymbol = new SimpleMarkerSymbol( { "color": [255, 0, 0, 45], "size": 10, "xoffset": 0, "yoffset": 0, "angle": 45, "type": "esriSMS", "style": SimpleMarkerSymbol.STYLE_CROSS, "outline": { "color": [255, 0, 0, 255], "width": 3, "type": "esriSLS", "style": SimpleLineSymbol.STYLE_SOLID } }); simpleFillSymbol = new SimpleFillSymbol( SimpleFillSymbol.STYLE_SOLID, new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID, new dojo.Color([232, 104, 80]), 2), new dojo.Color([232, 104, 80, 0.25])); popupFillSymbol = new SimpleFillSymbol( SimpleFillSymbol.STYLE_SOLID, new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID, new dojo.Color([255, 0, 0]), 2), new dojo.Color([255, 255, 0, 0.25])) } function SetNLS_Strings(esriBundle) { //popup localization esriBundle.widgets.popup.NLS_maximize = "Максимизиране"; esriBundle.widgets.popup.NLS_searching = "Моля изчакайте търсенето да завърши"; esriBundle.widgets.popup.NLS_noAttach = "Няма намерени обекти"; esriBundle.widgets.popup.NLS_noInfo = "Няма информация"; esriBundle.widgets.popup.NLS_nextFeature = "Следващ обект"; esriBundle.widgets.popup.NLS_restore = "Възстанови"; esriBundle.widgets.popup.NLS_prevFeature = "Предишен обект"; esriBundle.widgets.popup.NLS_close = "Затвори"; esriBundle.widgets.popup.NLS_zoomTo = "Приближаване"; esriBundle.widgets.popup.NLS_pagingInfo = "(${index} от ${total})"; //measure esriBundle.widgets.measurement.NLS_area = "Площ"; esriBundle.widgets.measurement.NLS_area_acres = "акра"; esriBundle.widgets.measurement.NLS_area_sq_feet = "кв. фута"; esriBundle.widgets.measurement.NLS_area_sq_kilometers = "кв. километра"; esriBundle.widgets.measurement.NLS_area_hectares = "хектара"; esriBundle.widgets.measurement.NLS_area_sq_meters = "кв. метра"; esriBundle.widgets.measurement.NLS_area_sq_miles = "кв. мили"; esriBundle.widgets.measurement.NLS_area_sq_yards = "кв. ярда"; esriBundle.widgets.measurement.NLS_decimal_degrees = "десетични градуса"; esriBundle.widgets.measurement.NLS_length_kilometers = "километра"; esriBundle.widgets.measurement.NLS_distance = "Разстояние"; esriBundle.widgets.measurement.NLS_latitude = "Географска ширина"; esriBundle.widgets.measurement.NLS_length_feet = "фута"; esriBundle.widgets.measurement.NLS_length_meters = "метра"; esriBundle.widgets.measurement.NLS_length_miles = "мили"; esriBundle.widgets.measurement.NLS_length_nautical_miles = "морски мили"; esriBundle.widgets.measurement.NLS_length_yards = "ярда"; esriBundle.widgets.measurement.NLS_location = "Местоположение"; esriBundle.widgets.measurement.NLS_longitude = "Географска дължина"; esriBundle.widgets.measurement.NLS_deg_min_sec = "градуси/мин./сек."; esriBundle.widgets.measurement.NLS_resultLabel = "Резултат:"; var stop = 0; } function toggleMapVisibility(checkbox) { var layer = map.getLayer(checkbox.id); var newVisibility = !layer.visible; layer.setVisibility(checkbox.checked); } function showCADFoundResults(results) { cadResults = results; var dynamicHtml = ""; dojo.forEach(results.slice(0, 10), function (result, i) { dynamicHtml += ('

' + (i + 1) + '.' + result.feature.attributes["Кадастрален идентификатор"] + ' - ' + result.layerName.replace("#", "") + ' (Дата на актуалност ' + result.feature.attributes["Дата на актуалност"] + ')

'); //Replace Име with Кадастрален идентификатор }); if (results.length == 0) { dynamicHtml += "

Вашето търсене върна 0 резултатa.

"; } else if (results.length > 10) { var notShownResults = results.length - 10; dynamicHtml += "

Вашето търсене генерира още " + notShownResults + " резултата. Моля прецизирайте Вашето търсене.

"; } dynamicHtml += '

Затвори

'; var panel = $('#searchPanel'); panel.html(dynamicHtml); panel.slideDown(); } function showAddressFoundResults(results) { addressResults = results; var dynamicHtml = ""; dojo.forEach(results.slice(0, 10), function (result, i) { var attributes = []; attributes.push(result.attributes["NAME"]); if (result.attributes["QUARTER_NAME"]) { attributes.push(result.attributes["QUARTER_NAME"] + ","); } attributes.push(result.attributes["STREET_NAME"]); attributes.push(result.attributes["GRAO_NUMBER"]); attributes.push(result.attributes["ENTRANCE"]); dynamicHtml += ('

' + (i + 1) + '.' + attributes.join(" ") + '

'); }); if (results.length == 0) { dynamicHtml += "

Търсеният от Вас адрес не беше намерен в базата данни от адреси. Моля проверете, че сте го въвели коректно.

Примери: (1) ул. Дружба 41 (2) ул. Иван Вазов 5

"; } else if (results.length > 10) { var notShownResults = results.length - 10; dynamicHtml += "

Вашето търсене генерира още " + notShownResults + " резултата. Моля прецизирайте Вашето търсене.

"; } dynamicHtml += '

Затвори

'; var panel = $('#searchPanel'); panel.html(dynamicHtml); panel.slideDown(); } function closeSearchDropDown() { $('#searchPanel').slideUp(); } function zoomToPoint(aPoint) { aPoint.spatialReference = map.spatialReference; var dx = 400; var dy = 250; var zoomExtent = new esri.geometry.Extent(aPoint.x - dx, aPoint.y - dy, aPoint.x + dx, aPoint.y + dy, map.spatialReference); map.setExtent(zoomExtent, true); pointGraphic.setGeometry(aPoint); map.graphics.clear(); map.graphics.add(pointGraphic); } function zoomToPolygon(aGeometry) { aGeometry.spatialReference = map.spatialReference; var zoomExtent = aGeometry.getExtent().expand(1.1); zoomExtent.spatialReference = map.spatialReference; map.setExtent(zoomExtent, true); polygonGraphic.setGeometry(aGeometry); map.graphics.clear(); map.graphics.add(polygonGraphic); } function zoomToAddress(i) { closeSearchDropDown(); var addressPoint = addressResults[i].feature.geometry; zoomToPoint(addressPoint); setMapLayerVisibility('#cadastreMap', false); setMapLayerVisibility('#urbanPlanningMap', false); } function zoomToCadObject(layerName, resultId) { closeSearchDropDown(); var cadGeometry = cadResults[resultId].feature.geometry; zoomToPolygon(cadGeometry); if (layerName == "Сграда" || layerName == "Имот") { setMapLayerVisibility('#cadastreMap', true); setMapLayerVisibility('#urbanPlanningMap', false); } else { setMapLayerVisibility('#cadastreMap', false); setMapLayerVisibility('#urbanPlanningMap', true); } } function setMapLayerVisibility(checkBoxName, isVisible) { var layerCheckbox = $(checkBoxName); var layer = map.getLayer(layerCheckbox.attr('id')); if (layer.visible != isVisible) { layerCheckbox.prop('checked', isVisible); layer.setVisibility(isVisible); } } function checkForEnterWhenSearching(e) { if (e.keyCode == 13) { search(); } } function parseAddress(address) { var result = { neighbourhood: null, street: null, number: null }; var numberRegEx = /^\d+/; var lowerCaseAddress = address.toLowerCase(); lowerCaseAddress = lowerCaseAddress.replace(/\s+/g, " "); //removing city part if present lowerCaseAddress = lowerCaseAddress.replace("град", ""); lowerCaseAddress = lowerCaseAddress.replace("гр.", ""); lowerCaseAddress = lowerCaseAddress.replace("гр", ""); lowerCaseAddress = lowerCaseAddress.replace("бургас", ""); lowerCaseAddress = lowerCaseAddress.replace(",", " "); lowerCaseAddress = lowerCaseAddress.replace(".", ""); lowerCaseAddress = lowerCaseAddress.trim(); tokenizedAddress = lowerCaseAddress.split(" "); var tokenStartOfStreetName = -1; var tokenStartOfNeighbourhoodName = -1; var skipCycles = 0; for (var i = 0; i < tokenizedAddress.length; i++) { if (skipCycles > 0) { skipCycles--; continue; } if (tokenizedAddress[i].indexOf("ул") > -1 || tokenizedAddress[i].indexOf("улица") > -1) { tokenStartOfStreetName = i + 1; } else if (tokenizedAddress[i].indexOf("кв") > -1 || tokenizedAddress[i].indexOf("квартал") > -1) { tokenStartOfNeighbourhoodName = i + 1; } else { if (i == tokenStartOfNeighbourhoodName) { result.neighbourhood = matchExactlyNeighbourhood(tokenizedAddress, i); if (result.neighbourhood != null) { skipCycles = result.neighbourhood.split(" ").length - 1; } } else if (i == tokenStartOfStreetName) { result.street = matchExactlyStreet(tokenizedAddress, i); if (result.street != null) { skipCycles = result.street.split(" ").length - 1; } else { result.street = fuzzyMatchStreet(tokenizedAddress, i); } } else { if (numberRegEx.test(tokenizedAddress[i])) { result.number = tokenizedAddress[i]; } else { testStreetMatch = matchExactlyStreet(tokenizedAddress, i); if (testStreetMatch != null) { result.street = testStreetMatch; skipCycles = result.street.split(" ").length - 1; } else { testNeighbourhoodMatch = matchExactlyNeighbourhood(tokenizedAddress, i); if (testNeighbourhoodMatch != null) { result.neighbourhood = testNeighbourhoodMatch; skipCycles = result.neighbourhood.split(" ").length - 1; } else { fuzzyStreetMatch = fuzzyMatchStreet(tokenizedAddress, i); if (fuzzyStreetMatch != null) { result.street = fuzzyStreetMatch; } else { continue; } } } } } } } return result; } function getNeighbourhoodsStartingWith(startToken) { var result = []; if (startToken != "" && startToken != null) { var neighbourhoodStartIndex = neighbourhoods.binaryStartsWithIndexOf(startToken); if (neighbourhoodStartIndex != -1) { do { result.push(neighbourhoods[neighbourhoodStartIndex]); neighbourhoodStartIndex++; } while (neighbourhoods[neighbourhoodStartIndex].startsWith(startToken)); } } return result; } function getStreetsStartingWith(startToken) { var result = []; if (startToken != "" && startToken != null) { var streetStartIndex = streets.binaryStartsWithIndexOf(startToken); if (streetStartIndex != -1) { do { result.push(streets[streetStartIndex]); streetStartIndex++; } while (streets[streetStartIndex].startsWith(startToken)); } } return result; } function getStreetsContaining(containedToken) { var result = []; for (var i = 0; i < streets.length; i++) { if (streets[i].indexOf(containedToken) != -1) { result.push(streets[i]); } } return result; } function matchExactlyNeighbourhood(tokenizedAddress, i) { var matchingStartingNeighbourhoods = getNeighbourhoodsStartingWith(tokenizedAddress[i]); if (matchingStartingNeighbourhoods.length == 0) { console.log("Matching a neighbourhood failed"); return null; } else if (matchingStartingNeighbourhoods.length == 1) { if (matchingStartingNeighbourhoods[0] == buildAddressEntity(tokenizedAddress, i, matchingStartingNeighbourhoods[0].split(" ").length)) { return matchingStartingNeighbourhoods[0]; } else { return null; } } else { for (var j = 0; j < matchingStartingNeighbourhoods.length; j++) { currentNeighbourhood = matchingStartingNeighbourhoods[j]; currentNeighbourhoodWordCount = currentNeighbourhood.split(" ").length; if (currentNeighbourhood == buildAddressEntity(tokenizedAddress, i, currentNeighbourhoodWordCount)) { return currentNeighbourhood; } } return null; } } function fuzzyMatchStreet(tokenizedAddress, i) { var fuzzyStreetsMatch = getStreetsContaining(tokenizedAddress[i]); if (fuzzyStreetsMatch.length == 1) { return fuzzyStreetsMatch[0]; } else { return null; } } function matchExactlyStreet(tokenizedAddress, i) { var matchingStartingStreets = getStreetsStartingWith(tokenizedAddress[i]); if (matchingStartingStreets.length == 0) { console.log("Matching a street failed using starting with method"); return null; } else if (matchingStartingStreets.length == 1) { if (matchingStartingStreets[0] == buildAddressEntity(tokenizedAddress, i, matchingStartingStreets[0].split(" ").length)) { return matchingStartingStreets[0]; } else { return null; } } else { for (var j = 0; j < matchingStartingStreets.length; j++) { currentStreet = matchingStartingStreets[j]; currentStreetWordCount = currentStreet.split(" ").length; if (currentStreet == buildAddressEntity(tokenizedAddress, i, currentStreetWordCount)) { return currentStreet; } } return null; } } function buildAddressEntity(tokenizedAddress, i, wordsCount) { var result = ""; for (j = 0; j < wordsCount; j++) { if (tokenizedAddress.length > i + j) { if (j > 0) { result += " "; } result += tokenizedAddress[i + j]; } else { return result; } } return result; } function buildAddressWhereClause(addressParts) { var addressFieldNames = ["Name", "QUARTER_NAME", "STREET_NAME", "GRAO_NUMBER"]; var uppercaseFieldNames = addressFieldNames.map(function (fieldName) { return "coalesce(lower(" + fieldName + "), ' ')"; }); var singleField = "' ' + " + uppercaseFieldNames.join(" + ' ' + ") + " + ' '"; var whereclause = addressParts.map(function (addressPart) { return " ( " + singleField + " like '% " + addressPart.toLowerCase() + " %' ) "; }).join(" and "); return whereclause; } function search() { closeSearchDropDown(); var searchTerm = $('#searchInput').val(); searchTerm = searchTerm.trim(); if (!searchTerm) { map.graphics.clear(); return; } var lowerCaseSearchTerm = " " + searchTerm.toLowerCase() + " "; if (!(/^(\.?)(\d+\.)*\d*$/.test(searchTerm))) { lowerCaseSearchTerm = lowerCaseSearchTerm.replace(".", ""); } lowerCaseSearchTerm = lowerCaseSearchTerm.replace(",", " "); lowerCaseSearchTerm = lowerCaseSearchTerm.replace(" бургас ", ""); lowerCaseSearchTerm = lowerCaseSearchTerm.replace(" град ", " "); lowerCaseSearchTerm = lowerCaseSearchTerm.replace(" гр ", " "); lowerCaseSearchTerm = lowerCaseSearchTerm.replace(" кв ", " "); lowerCaseSearchTerm = lowerCaseSearchTerm.replace(" бул ", " "); lowerCaseSearchTerm = lowerCaseSearchTerm.replace(" ул ", " "); lowerCaseSearchTerm = lowerCaseSearchTerm.replace(/\s+/g, " "); lowerCaseSearchTerm = lowerCaseSearchTerm.trim(); if (!lowerCaseSearchTerm) { return; } var addressSearchWhere = buildAddressWhereClause(lowerCaseSearchTerm.split(/[ ]/)); var cadSearchWhere = "upi like '%" + lowerCaseSearchTerm.toUpperCase() + "%'"; var planSearchWhere = lowerCaseSearchTerm.split(/[ ]/).map(function (searchTextPart) { return "searchdata like '% " + searchTextPart.toUpperCase() + " %'"; }).join(" and "); addressQuery.where = addressSearchWhere; cadBuildingQuery.where = cadSearchWhere; cadParcelQuery.where = cadSearchWhere planParcelQuery.where = planSearchWhere; planQuarterQuery.where = planSearchWhere; var defferedAddressResult = addressQueryTask.execute(addressQuery); var defferedCadParcelResult = cadParcelQueryTask.execute(cadParcelQuery); var defferedCadBuildingResult = cadBuildingQueryTask.execute(cadBuildingQuery); var defferedPlanQuarterResult = planQuarterQueryTask.execute(planQuarterQuery); var defferedPlanParcelResult = planParcelQueryTask.execute(planParcelQuery); var promise = new dojo.DeferredList([defferedAddressResult, defferedCadParcelResult, defferedCadBuildingResult, defferedPlanQuarterResult, defferedPlanParcelResult]); promise.then(dojo.hitch(this, showSearchResults)); } function showSearchResults(allSearchResults) { addressResults = allSearchResults[0][0] ? allSearchResults[0][1].features.map(function (feature) { return { layerName: "Адрес", feature: feature }; }) : []; var layerNames = ["Имот", "Сграда", "Квартал (регулация)", "УПИ (регулация)"]; cadResults = []; for (var i = 1; i < 5; i++) { cadResults = cadResults.concat(allSearchResults[i][0] ? allSearchResults[i][1].features.map(function (feature) { return { layerName: layerNames[i - 1], feature: feature }; }) : []); } var totalResults = addressResults.length + cadResults.length; if (totalResults == 1) { if (addressResults.length == 1) { zoomToAddress(0); } if (cadResults.length == 1) { zoomToCadObject(0); } } else { var dynamicHtml = ""; if (totalResults == 0) { dynamicHtml = "

Вашето търсене върна 0 резултатa." + "

Моля проверете, че сте въвели коректен адрес или идентификатор.

" + "

Примери: (1) ул. Александровска 26 (2)ул. Иван Вазов 5 (3)07079.501.107

"; } else { var addressLimit = 5; var cadLimit = 5; if (addressResults.length < 5) { cadLimit = 10 - addressResults.length; } if (cadResults.length < 5) { addressLimit = 10 - cadResults.length; } var notShownResults = totalResults - Math.min(addressResults.length, addressLimit) - Math.min(cadResults.length, cadLimit); addressResults.slice(0, addressLimit).forEach(function (result, i) { var feature = result.feature; var attributes = []; attributes.push(feature.attributes["NAME"]); if (feature.attributes["QUARTER_NAME"]) { attributes.push(feature.attributes["QUARTER_NAME"] + ","); } attributes.push(feature.attributes["STREET_NAME"]); attributes.push(feature.attributes["GRAO_NUMBER"]); attributes.push(feature.attributes["ENTRANCE"]); dynamicHtml += ('

' + (i + 1) + '. ' + result.layerName + ': ' + attributes.join(" ").trim() + '

'); }); cadResults.slice(0, cadLimit).forEach(function (result, i) { var feature = result.feature; dynamicHtml += ('

' + (i + 1) + '. ' + result.layerName + ': ' + feature.attributes["Name"] + ' ' + (result.feature.attributes["fromdate"] ? '(Дата на актуалност ' + formatDate(result.feature.attributes["fromdate"]) + ')' : '') + '

'); }); if (notShownResults > 0) { dynamicHtml += "

Вашето търсене генерира още " + notShownResults + " резултата. Моля прецизирайте Вашето търсене.

"; } } dynamicHtml += '

Затвори

'; var panel = $('#searchPanel'); panel.html(dynamicHtml); panel.slideDown(); $("#closeSearchBtn")[0].addEventListener("click", closeSearchDropDown); for (var aIndex = 0; aIndex < $(".AddressResult").length; aIndex++) { $(".AddressResult")[aIndex].addEventListener("click", function (event) { var ai = event.currentTarget.getAttribute('value'); zoomToAddress(ai); }); } for (var cIndex = 0; cIndex < $(".CadObjectResult").length; cIndex++) { $(".CadObjectResult")[cIndex].addEventListener("click", function (event) { var ci = event.currentTarget.getAttribute('value'); zoomToCadObject(cadResults[ci].layerName, ci); }); } } } function formatDate(value) { if (!value) return ""; var inputDate = new Date(value); return inputDate.getUTCDate() + "." + (inputDate.getUTCMonth() + 1).toString() + "." + inputDate.getUTCFullYear() + " г."; }