1197 lines
47 KiB
JavaScript
1197 lines
47 KiB
JavaScript
var objectManager;
|
||
var myMap;
|
||
var accessScroll = true;
|
||
var showRightObject = [];
|
||
var polygons = [];
|
||
|
||
var modalMap = null;
|
||
var inProgress = false;
|
||
var buttonEditMode = null;
|
||
var buttonClearMode = null;
|
||
var mapGroup = null;
|
||
|
||
function openMap(el) {
|
||
$('.map-modal').css('padding-top', '0');
|
||
if (modalMap == null) {
|
||
modalMap = new ymaps.Map("map-modal__content", {
|
||
center: [59.9174455, 30.3250575],
|
||
zoom: 19,
|
||
controls: ['fullscreenControl', 'zoomControl']
|
||
},{
|
||
fullscreenZIndex : 999999999,
|
||
autoFitToViewport : 'always'
|
||
});
|
||
} else {
|
||
modalMap.geoObjects.removeAll();
|
||
}
|
||
|
||
var address = $(el).parents('.object__content').find('.address').text();
|
||
|
||
var latitude = $(this).attr('data-latitude');
|
||
var longitude = $(this).attr('data-longitude');
|
||
|
||
if (latitude && longitude) {
|
||
var firstGeoObject = new ymaps.Placemark([
|
||
Number.parseFloat(latitude).toPrecision(9),
|
||
Number.parseFloat(longitude).toPrecision(9)
|
||
], {}, { draggable:false});
|
||
firstGeoObject.options.set('preset', 'islands#darkBlueDotIconWithCaption');
|
||
// Получаем строку с адресом и выводим в иконке геообъекта.
|
||
firstGeoObject.properties.set('iconCaption', address);
|
||
myMap.geoObjects.add(firstGeoObject);
|
||
myMap.setCenter(firstGeoObject.geometry.getCoordinates(), 14);
|
||
} else {
|
||
ymaps.geocode(address, {results: 1})
|
||
.then(function (res) {
|
||
var firstGeoObject = res.geoObjects.get(0),
|
||
// Координаты геообъекта.
|
||
coords = firstGeoObject.geometry.getCoordinates(),
|
||
// Область видимости геообъекта.
|
||
bounds = firstGeoObject.properties.get('boundedBy');
|
||
|
||
var placemark = new ymaps.Placemark([
|
||
Number.parseFloat(coords[0]).toPrecision(9),
|
||
Number.parseFloat(coords[1]).toPrecision(9)
|
||
], {
|
||
iconCaption: firstGeoObject.getAddressLine(),
|
||
hintContent: firstGeoObject.getAddressLine()
|
||
}, {preset: 'islands#darkBlueDotIconWithCaption', draggable: false});
|
||
modalMap.geoObjects.add(placemark);
|
||
// Масштабируем карту на область видимости геообъекта.
|
||
modalMap.setBounds(bounds, {
|
||
// Проверяем наличие тайлов на данном масштабе.
|
||
checkZoomRange: true
|
||
});
|
||
});
|
||
}
|
||
}
|
||
|
||
function loadRadiusOrMapData(page = 1) {
|
||
var button = $('.tab__controls-toggler-container .tab__controls-toggler.is-active');
|
||
if (button.attr('data-view-type') === 'map') {
|
||
loadRadiusDataMap();
|
||
} else {
|
||
loadRadiusData(page);
|
||
}
|
||
}
|
||
|
||
function loadRadiusData(page = 1) {
|
||
var button = $('.js-modal-tab.is-active');
|
||
|
||
if (button.attr('data-id') === 'tab_3') {
|
||
|
||
$('.modal__content .analytics-obj-list .object').html('');
|
||
$('#analyticsRadiusBlock').hide();
|
||
if (polygons && polygons.length) {
|
||
var objId = $("#selectedObjId").val();
|
||
var openedForCabinet = $("#openedForCabinet").val();
|
||
|
||
if (objId) {
|
||
$('.modal__content .analytics-obj-list .object').html('<div class="object-content__preloader" style="display: block;"><img src="/images/rocket-spinner.svg" width="96px"></div>');
|
||
var areaFrom = $("#areaFrom").val();
|
||
var areaTo = $("#areaTo").val();
|
||
var kitchenAreaFrom = $("#kitchenAreaFrom").val();
|
||
var kitchenAreaTo = $("#kitchenAreaTo").val();
|
||
var yearFrom = $("#yearFrom").val();
|
||
var yearTo = $("#yearTo").val();
|
||
var kvType = $("#analytics-filter-kv-type").val();
|
||
var commType = $("#analytics-filter-comm-type").val();
|
||
|
||
var order = $('#filter-sort-order').val();
|
||
|
||
var geoArr1, geoArr2, geoArr3, geoArr4 = [];
|
||
|
||
if (polygons[0]) {
|
||
geoArr1 = polygons[0].geometry.getCoordinates();
|
||
}
|
||
if (polygons[1]) {
|
||
geoArr2 = polygons[1].geometry.getCoordinates();
|
||
}
|
||
if (polygons[2]) {
|
||
geoArr3 = polygons[2].geometry.getCoordinates();
|
||
}
|
||
if (polygons[3]) {
|
||
geoArr4 = polygons[3].geometry.getCoordinates();
|
||
}
|
||
|
||
var coordsToScript1 = "";
|
||
var coordsToScript2 = "";
|
||
var coordsToScript3 = "";
|
||
var coordsToScript4 = "";
|
||
|
||
if (geoArr1 && geoArr1.length) {
|
||
if (geoArr1[0] && geoArr1[0].length) {
|
||
for (var j = 0; j <= geoArr1[0].length; j++) {
|
||
if (geoArr1[0][j] && geoArr1[0][j].length) {
|
||
if (coordsToScript1) {
|
||
coordsToScript1 += ","
|
||
}
|
||
coordsToScript1 += geoArr1[0][j][0] + "," + geoArr1[0][j][1];
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
if (geoArr2 && geoArr2.length) {
|
||
if (geoArr2[0] && geoArr2[0].length) {
|
||
for (var j = 0; j <= geoArr2[0].length; j++) {
|
||
if (geoArr2[0][j] && geoArr2[0][j].length) {
|
||
if (coordsToScript2) {
|
||
coordsToScript2 += ","
|
||
}
|
||
coordsToScript2 += geoArr2[0][j][0] + "," + geoArr2[0][j][1];
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
if (geoArr3 && geoArr3.length) {
|
||
if (geoArr3[0] && geoArr3[0].length) {
|
||
for (var j = 0; j <= geoArr3[0].length; j++) {
|
||
if (geoArr3[0][j] && geoArr3[0][j].length) {
|
||
if (coordsToScript3) {
|
||
coordsToScript3 += ","
|
||
}
|
||
coordsToScript3 += geoArr3[0][j][0] + "," + geoArr3[0][j][1];
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
if (geoArr4 && geoArr4.length) {
|
||
if (geoArr4[0] && geoArr4[0].length) {
|
||
for (var j = 0; j <= geoArr4[0].length; j++) {
|
||
if (geoArr4[0][j] && geoArr4[0][j].length) {
|
||
if (coordsToScript4) {
|
||
coordsToScript4 += ","
|
||
}
|
||
coordsToScript4 += geoArr4[0][j][0] + "," + geoArr4[0][j][1];
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
if (coordsToScript1 || coordsToScript2 || coordsToScript3 || coordsToScript4) {
|
||
$.ajax({
|
||
url: '/ajax/analytics/loadAnalyticsPolygons.php',
|
||
method: "post",
|
||
data: {
|
||
"objId": objId,
|
||
"areaFrom": areaFrom,
|
||
"areaTo": areaTo,
|
||
"kitchenAreaFrom": kitchenAreaFrom,
|
||
"kitchenAreaTo": kitchenAreaTo,
|
||
"yearFrom": yearFrom,
|
||
"yearTo": yearTo,
|
||
"kvType": kvType,
|
||
"commType": commType,
|
||
"page": page,
|
||
"poly1": coordsToScript1,
|
||
"poly2": coordsToScript2,
|
||
"poly3": coordsToScript3,
|
||
"poly4": coordsToScript4,
|
||
"cabinet": openedForCabinet,
|
||
"order": order,
|
||
},
|
||
success: function (data) {
|
||
$(".modal__content .analytics-obj-list .object").html(data);
|
||
let modalContainer = document.querySelector('.analytics-modal').querySelector('.modal__container');
|
||
modalContainer.scrollTo({
|
||
top: 0
|
||
});
|
||
},
|
||
error: function (XMLHttpRequest, textStatus, errorThrown) {
|
||
console.log("eRROR: " + errorThrown + "; status:" + textStatus);
|
||
}
|
||
});
|
||
} else {
|
||
alert("Необходимо нарисовать хотя бы одну область на карте, максимальное кол-во областей 4. Для отрисовки нажмите кнопку редактировать в области карты")
|
||
}
|
||
}
|
||
} else {
|
||
$('.modal__content .analytics-obj-list .object').html('Необходимо указать хотя бы одну область на карте');
|
||
}
|
||
} else {
|
||
|
||
if (!$('.analytics-obj-list').hasClass('is-active')) {
|
||
$('.analytics-obj-list').addClass("is-active");
|
||
$('.analytics-obj-map').removeClass("is-active");
|
||
}
|
||
|
||
clearPolygons();
|
||
|
||
$('#analyticsRadiusBlock').show();
|
||
|
||
var objId = $("#selectedObjId").val();
|
||
var openedForCabinet = $("#openedForCabinet").val();
|
||
|
||
if (objId) {
|
||
$('.modal__content .analytics-obj-list .object').html('<div class="object-content__preloader" style="display: block;"><img src="/images/rocket-spinner.svg" width="96px"></div>');
|
||
var rangeFrom = $("#rangeFrom").val();
|
||
var rangeTo = $("#rangeTo").val();
|
||
var areaFrom = $("#areaFrom").val();
|
||
var areaTo = $("#areaTo").val();
|
||
var kitchenAreaFrom = $("#kitchenAreaFrom").val();
|
||
var kitchenAreaTo = $("#kitchenAreaTo").val();
|
||
var yearFrom = $("#yearFrom").val();
|
||
var yearTo = $("#yearTo").val();
|
||
var selectedObjLat = $("#selectedObjLat").val();
|
||
var selectedObjLon = $("#selectedObjLon").val();
|
||
var kvType = $("#analytics-filter-kv-type").val();
|
||
var commType = $("#analytics-filter-comm-type").val();
|
||
|
||
var order = $('#filter-sort-order').val();
|
||
|
||
$.ajax({
|
||
url: '/ajax/analytics/loadAnalyticsRadius.php',
|
||
method: "post",
|
||
data: {
|
||
"objId": objId,
|
||
"rangeFrom": rangeFrom,
|
||
"rangeTo": rangeTo,
|
||
"areaFrom": areaFrom,
|
||
"areaTo": areaTo,
|
||
"kitchenAreaFrom": kitchenAreaFrom,
|
||
"kitchenAreaTo": kitchenAreaTo,
|
||
"yearFrom": yearFrom,
|
||
"yearTo": yearTo,
|
||
"kvType": kvType,
|
||
"commType": commType,
|
||
"page": page,
|
||
"selectedObjLat": selectedObjLat,
|
||
"selectedObjLon": selectedObjLon,
|
||
"cabinet": openedForCabinet,
|
||
"order": order
|
||
},
|
||
success: function (data) {
|
||
$(".modal__content .analytics-obj-list .object").html(data);
|
||
let modalContainer = document.querySelector('.analytics-modal').querySelector('.modal__container');
|
||
modalContainer.scrollTo({
|
||
top: 0
|
||
});
|
||
},
|
||
error: function (XMLHttpRequest, textStatus, errorThrown) {
|
||
console.log("eRROR: " + errorThrown + "; status:" + textStatus);
|
||
}
|
||
});
|
||
}
|
||
}
|
||
}
|
||
|
||
function clearPolygons() {
|
||
if (myMap && myMap.geoObjects) {
|
||
for (var i = 0; i <= polygons.length; i++) {
|
||
if (polygons[i]) {
|
||
myMap.geoObjects.remove(polygons[i]);
|
||
}
|
||
}
|
||
polygons = [];
|
||
if (objectManager) {
|
||
objectManager.removeAll();
|
||
}
|
||
}
|
||
}
|
||
|
||
function loadCurrentHouseData(page = 1) {
|
||
|
||
if (!$('.analytics-obj-list').hasClass('is-active')) {
|
||
$('.analytics-obj-list').addClass("is-active");
|
||
$('.analytics-obj-map').removeClass("is-active");
|
||
}
|
||
|
||
var objId = $("#selectedObjId").val();
|
||
var openedForCabinet = $("#openedForCabinet").val();
|
||
|
||
if (objId) {
|
||
$('.modal__content .analytics-obj-list .object').html('<div class="object-content__preloader" style="display: block;"><img src="/images/rocket-spinner.svg" width="96px"></div>');
|
||
|
||
$.ajax({
|
||
url: '/ajax/analytics/loadAnalyticsCurrentHouse.php?objectId=' + objId + "&page=" + page + (openedForCabinet ? "&cabinet=1" : ""),
|
||
success:function(data){
|
||
$(".modal__content .analytics-obj-list .object").html(data);
|
||
let modalContainer = document.querySelector('.analytics-modal').querySelector('.modal__container');
|
||
modalContainer.scrollTo({
|
||
top: 0
|
||
});
|
||
},
|
||
error: function(XMLHttpRequest, textStatus, errorThrown) {
|
||
console.log("eRROR: " + errorThrown + "; status:" + textStatus);
|
||
}
|
||
});
|
||
}
|
||
}
|
||
|
||
function loadRadiusDataMap() {
|
||
var button = $('.js-modal-tab.is-active');
|
||
|
||
if (button.attr('data-id') === 'tab_3') {
|
||
ymaps.ready(function () {
|
||
if (!initMap(true)) {
|
||
loadMapObjectsInPolygons();
|
||
}
|
||
});
|
||
} else {
|
||
ymaps.ready(function () {
|
||
if (!initMap(false)) {
|
||
sendObjectsMapRequest();
|
||
}
|
||
|
||
if (buttonEditMode) {
|
||
myMap.controls.remove(buttonEditMode);
|
||
buttonEditMode = null;
|
||
}
|
||
|
||
if (buttonClearMode) {
|
||
myMap.controls.remove(buttonClearMode);
|
||
buttonClearMode = null;
|
||
}
|
||
});
|
||
}
|
||
|
||
$('.map-view-container .object').scroll(function () {
|
||
if (accessScroll) {
|
||
if ($('.map-view-container .object').scrollTop() + $('.map-view-container .object').height() >= $('.map-view-container .object__list').height() - 200 && !inProgress) {
|
||
var count = $('.map-view-container .object-card').length;
|
||
var countLimit = count + 10;
|
||
|
||
for (var i = count; i < countLimit; i++) {
|
||
if (showRightObject[i]) {
|
||
accessScroll = false;
|
||
$('<li class="item_map' + showRightObject[i] + '"></li>').insertAfter($('.map-view-container .object ul li:last'));
|
||
}
|
||
}
|
||
getAnalyticsBaloonContent();
|
||
}
|
||
}
|
||
});
|
||
}
|
||
|
||
function sendObjectsMapRequest() {
|
||
var objId = $("#selectedObjId").val();
|
||
|
||
if (objId) {
|
||
|
||
$('.map-view-container .object__list').html("");
|
||
|
||
var rangeFrom = $("#rangeFrom").val();
|
||
var rangeTo = $("#rangeTo").val();
|
||
var areaFrom = $("#areaFrom").val();
|
||
var areaTo = $("#areaTo").val();
|
||
var kitchenAreaFrom = $("#kitchenAreaFrom").val();
|
||
var kitchenAreaTo = $("#kitchenAreaTo").val();
|
||
var yearFrom = $("#yearFrom").val();
|
||
var yearTo = $("#yearTo").val();
|
||
var kvType = $("#analytics-filter-kv-type").val();
|
||
var commType = $("#analytics-filter-comm-type").val();
|
||
|
||
var selectedObjLat = $("#selectedObjLat").val();
|
||
var selectedObjLon = $("#selectedObjLon").val();
|
||
|
||
var order = $('#filter-sort-order').val();
|
||
|
||
clearPolygons();
|
||
|
||
$.ajax({
|
||
url: '/ajax/analytics/loadAnalyticsRadiusMap.php',
|
||
method: "post",
|
||
data: {
|
||
"objId": objId,
|
||
"rangeFrom": rangeFrom,
|
||
"rangeTo": rangeTo,
|
||
"areaFrom": areaFrom,
|
||
"areaTo": areaTo,
|
||
"kitchenAreaFrom": kitchenAreaFrom,
|
||
"kitchenAreaTo": kitchenAreaTo,
|
||
"yearFrom": yearFrom,
|
||
"yearTo": yearTo,
|
||
"selectedObjLat": selectedObjLat,
|
||
"selectedObjLon": selectedObjLon,
|
||
"kvType": kvType,
|
||
"commType": commType,
|
||
"order": order
|
||
},
|
||
success:function(data){
|
||
var resParsed = JSON.parse(data);
|
||
objectManager.add(resParsed.data);
|
||
eval(resParsed.script);
|
||
checkVisibleOrCenterAnalytics();
|
||
},
|
||
error: function(XMLHttpRequest, textStatus, errorThrown) {
|
||
console.log("eRROR: " + errorThrown + "; status:" + textStatus);
|
||
}
|
||
});
|
||
}
|
||
}
|
||
|
||
function checkVisibleOrCenterAnalytics() {
|
||
var mapList = $('.map-view-container .object__list');
|
||
if (objectManager && objectManager.objects && objectManager.objects.getLength() > 0) {
|
||
var htm = '';
|
||
var limit = 0;
|
||
var i = 0;
|
||
showRightObject = [];
|
||
|
||
objectManager.objects.each(function (object) {
|
||
var objectState = objectManager.getObjectState(object.id);
|
||
if (objectState.isShown) {
|
||
if (limit < 10) {
|
||
limit++;
|
||
htm = htm + ' <li class="object-card item_map' + object.properties.balloonContent + '"></li>';
|
||
}
|
||
showRightObject[i] = object.properties.balloonContent;
|
||
i++;
|
||
}
|
||
});
|
||
|
||
mapList.html(htm + '');
|
||
|
||
if (!showRightObject[0]) {
|
||
mapList.html('<li><p>По вашему запросу ничего не найдено</p></li>');
|
||
}
|
||
getAnalyticsBaloonContent();
|
||
}
|
||
}
|
||
|
||
function getAnalyticsBaloonContent(){
|
||
var openedForCabinet = $("#openedForCabinet").val();
|
||
|
||
$('.map-view-container .object__list li').each(function(index, element){
|
||
var classLi = $(this).attr('class');
|
||
if (classLi) {
|
||
var id = classLi.replace(/[^\d;]/g, '');
|
||
var objId = $("#selectedObjId").val();
|
||
if (id > 0 && objId > 0) {
|
||
$.ajax({
|
||
url: "/ajax/analytics/getAnalyticsBaloon.php?id=" + id + "&selObjId=" + objId + (openedForCabinet ? "&cabinet=1" : ""),
|
||
success: function (data) {
|
||
$('.item_map' + id).replaceWith(data.responseText);
|
||
if ((index + 1) === $('.map-view-container .object .object__list li').length) {
|
||
accessScroll = true;
|
||
}
|
||
},
|
||
error: function (data) {
|
||
$('.item_map' + id).replaceWith(data.responseText);
|
||
if ((index + 1) === $('.map-view-container .object .object__list li').length) {
|
||
accessScroll = true;
|
||
}
|
||
}
|
||
});
|
||
}
|
||
}
|
||
});
|
||
}
|
||
|
||
function initPaging() {
|
||
objectManager = null;
|
||
accessScroll = true;
|
||
inProgress = false;
|
||
showRightObject = [];
|
||
|
||
modalMap = null;
|
||
|
||
inProgress = false;
|
||
buttonEditMode = null;
|
||
buttonClearMode = null;
|
||
mapGroup = null;
|
||
}
|
||
|
||
$("body").on('click', '.obj-analysis-paging2', function (e) {
|
||
e.stopPropagation();
|
||
|
||
var pageNum = $(this).attr('data-page-num');
|
||
|
||
loadCurrentHouseData(pageNum);
|
||
|
||
return false;
|
||
|
||
});
|
||
|
||
$("body").on('click', '.obj-analysis-paging3', function (e) {
|
||
e.stopPropagation();
|
||
|
||
var pageNum = $(this).attr('data-page-num');
|
||
|
||
loadRadiusData(pageNum);
|
||
|
||
return false;
|
||
|
||
});
|
||
|
||
$("body").on('click', '.obj-analysis-paging15', function (e) {
|
||
e.stopPropagation();
|
||
|
||
var pageNum = $(this).attr('data-page-num');
|
||
|
||
loadRadiusData(pageNum);
|
||
|
||
return false;
|
||
|
||
});
|
||
|
||
function getReSearchObjectsCountsAnalytics() {
|
||
if ($('.object-card__action .fltr-req-list').length > 0) {
|
||
$('.object-card__action .fltr-req-list').each(function(index) {
|
||
let object_id = $(this).data("id");
|
||
if (typeof object_id !== "undefined") {
|
||
axios.post('/ajax/ajax_vue_autosearch.php', {
|
||
request: 'get_reverse_counter',
|
||
object_id: object_id
|
||
}).then((response)=> {
|
||
let time = response.data.time;
|
||
let total = response.data.total;
|
||
if (time && total) {
|
||
$(this).attr("data-time", time);
|
||
$(this).attr("data-total", total);
|
||
$(this).append('<span class="counter">'+total+'</span>');
|
||
}
|
||
}).catch(function (error) {
|
||
console.log(error);
|
||
});
|
||
}
|
||
});
|
||
}
|
||
}
|
||
|
||
function openObjectList(part, objectId) {
|
||
if (objectId) {
|
||
objId = objectId;
|
||
} else {
|
||
var objId = $("#selectedObjId").val();
|
||
}
|
||
if (objId) {
|
||
$('#objectsAnalysisContainer').html('<div class="object-content__preloader" style="display: block;"><img src="/images/rocket-spinner.svg" width="96px"></div>');
|
||
$("#modalObjectsAnalysis_bg").fadeIn(500);
|
||
$("#modalObjectsAnalysis").toggle(10);
|
||
$("body").addClass("lock");
|
||
$.ajax({
|
||
url: '/ajax/analytics/getAnalyticsObjectList.php?page=1&objectId=' + objId + '&analysisPart=' + part,
|
||
success: function (data) {
|
||
$("#objectsAnalysisContainer").html(data);
|
||
setTimeout(function () {
|
||
$('#objectsAnalysisContainer .fotorama').fotorama();
|
||
}, 100);
|
||
$("#modalObjectsAnalysis").get(0).scrollIntoView();
|
||
},
|
||
error: function (XMLHttpRequest, textStatus, errorThrown) {
|
||
console.log("eRROR: " + errorThrown);
|
||
}
|
||
});
|
||
}
|
||
}
|
||
|
||
function showTerritoryMap() {
|
||
$('.modal__content .analytics-obj-list .object').html('Необходимо указать хотя бы одну область на карте');
|
||
|
||
$('#analyticsRadiusBlock').hide();
|
||
|
||
$("#analyticsDempAllPrice").html("-");
|
||
$("#analyticsNowPrice").html("-");
|
||
$("#analyticsAvarageAllPrice").html("-");
|
||
$("#analyticsThreeMonthPrice").html("-");
|
||
$("#analyticsHighAllPrice").html("-");
|
||
$("#analyticsTwelveMonthPrice").html("-");
|
||
$("#analyticsDempMeters").html("-");
|
||
$("#analyticsAvarageMeters").html("-");
|
||
$("#analyticsHighMeters").html("-");
|
||
$("#analyticsMetersTitleWarning").show();
|
||
$("#analyticsDempAllPriceLink").hide();
|
||
$("#analyticsAvarageAllPriceLink").hide();
|
||
$("#analyticsHighAllPriceLink").hide();
|
||
$("#averageCountNumber").html("");
|
||
|
||
//перевключаем сразу на карту
|
||
setTimeout(function () {
|
||
var evt = document.createEvent('HTMLEvents');
|
||
evt.initEvent('click', true, true);
|
||
var el = document.getElementById("loadRadiusDataMapControl");
|
||
el.dispatchEvent(evt);
|
||
}, 10)
|
||
|
||
if (!$('.analytics-obj-map').hasClass('is-active')) {
|
||
$('.analytics-obj-map').addClass("is-active");
|
||
$('.analytics-obj-list').removeClass("is-active");
|
||
}
|
||
|
||
$('.map-view-container .object__list').html('<ul><li><p></p></li></ul>');
|
||
|
||
ymapsDefine();
|
||
|
||
ymaps.ready(['ext.paintOnMap']).then(function () {
|
||
initMap(true);
|
||
|
||
if (myMap && myMap.geoObjects) {
|
||
for (var i = 0; i <= polygons.length; i++) {
|
||
if (polygons[i]) {
|
||
myMap.geoObjects.remove(polygons[i]);
|
||
}
|
||
}
|
||
polygons = [];
|
||
if (objectManager) {
|
||
objectManager.removeAll();
|
||
}
|
||
}
|
||
|
||
if (buttonClearMode == null) {
|
||
// Создадим кнопку для очистки.
|
||
buttonClearMode = new ymaps.control.Button({data: {content: 'Очистить'}, options: {maxWidth: 100, selectOnClick: false}});
|
||
buttonClearMode.events.add('click', function () {
|
||
clearPolygons();
|
||
$('.map-view-container .object__list').html('<ul><li><p></p></li></ul>');
|
||
});
|
||
myMap.controls.add(buttonClearMode);
|
||
}
|
||
|
||
if (buttonEditMode == null) {
|
||
// Создадим кнопку для выбора режима рисования
|
||
buttonEditMode = new ymaps.control.Button({data: {content: 'Выделение области'}, options: {maxWidth: 150}});
|
||
buttonEditMode.events.add('click', function () {
|
||
if (buttonEditMode.isSelected()) {
|
||
loadMapObjectsInPolygons();
|
||
buttonEditMode.data.set('content', 'Выделение области');
|
||
} else {
|
||
buttonEditMode.data.set('content', 'Подтвердить');
|
||
}
|
||
});
|
||
myMap.controls.add(buttonEditMode);
|
||
}
|
||
|
||
var paintProcess;
|
||
|
||
// Опции многоугольника или линии.
|
||
var styles = [
|
||
{strokeColor: '#ff0000', strokeOpacity: 0.6, strokeWidth: 2, fillColor: '#ff0000', fillOpacity: 0.3}
|
||
];
|
||
|
||
var currentIndex = 0;
|
||
|
||
if (mapGroup == null) {
|
||
mapGroup = myMap.events.group();
|
||
}
|
||
|
||
mapGroup.removeAll();
|
||
|
||
// Подпишемся на событие нажатия кнопки мыши.
|
||
mapGroup.add('mousedown', function (e) {
|
||
var button = $('.js-modal-tab.is-active');
|
||
// Если кнопка мыши была нажата с зажатой клавишей "alt", то начинаем рисование контура.
|
||
if (button.attr('data-id') === 'tab_3' && buttonEditMode.isSelected()) {
|
||
if(polygons && polygons.length < 4) {
|
||
if (currentIndex == styles.length - 1) {
|
||
currentIndex = 0;
|
||
} else {
|
||
currentIndex += 1;
|
||
}
|
||
paintProcess = ymaps.ext.paintOnMap(myMap, e, {style: styles[currentIndex]});
|
||
} else {
|
||
alert("Максимальное количество областей = 4");
|
||
}
|
||
}
|
||
});
|
||
|
||
// Подпишемся на событие отпускания кнопки мыши.
|
||
mapGroup.add('mouseup', function (e) {
|
||
if (paintProcess) {
|
||
|
||
// Получаем координаты отрисованного контура.
|
||
var coordinates = paintProcess.finishPaintingAt(e);
|
||
paintProcess = null;
|
||
if (coordinates && coordinates.length > 2) {
|
||
// В зависимости от состояния кнопки добавляем на карту многоугольник или линию с полученными координатами.
|
||
var geoObject = new ymaps.Polygon([coordinates], {}, styles[currentIndex]);
|
||
polygons[polygons.length] = geoObject;
|
||
myMap.geoObjects.add(geoObject);
|
||
} else {
|
||
alert("Количество вершин для области меньше 3, пожалуйста перерисуйте многоугольник более точно");
|
||
}
|
||
}
|
||
});
|
||
}).catch(console.error);
|
||
}
|
||
|
||
function loadMapObjectsInPolygons() {
|
||
var objId = $("#selectedObjId").val();
|
||
|
||
if (objId) {
|
||
$('.map-view-container .object__list').html("");
|
||
|
||
var areaFrom = $("#areaFrom").val();
|
||
var areaTo = $("#areaTo").val();
|
||
var kitchenAreaFrom = $("#kitchenAreaFrom").val();
|
||
var kitchenAreaTo = $("#kitchenAreaTo").val();
|
||
var yearFrom = $("#yearFrom").val();
|
||
var yearTo = $("#yearTo").val();
|
||
var kvType = $("#analytics-filter-kv-type").val();
|
||
var commType = $("#analytics-filter-comm-type").val();
|
||
|
||
var order = $('#filter-sort-order').val();
|
||
|
||
if (myMap && myMap.geoObjects) {
|
||
if (objectManager) {
|
||
objectManager.removeAll();
|
||
}
|
||
}
|
||
|
||
if (polygons && polygons.length) {
|
||
|
||
var geoArr1, geoArr2, geoArr3, geoArr4 = [];
|
||
|
||
if (polygons[0]) {
|
||
geoArr1 = polygons[0].geometry.getCoordinates();
|
||
}
|
||
if (polygons[1]) {
|
||
geoArr2 = polygons[1].geometry.getCoordinates();
|
||
}
|
||
if (polygons[2]) {
|
||
geoArr3 = polygons[2].geometry.getCoordinates();
|
||
}
|
||
if (polygons[3]) {
|
||
geoArr4 = polygons[3].geometry.getCoordinates();
|
||
}
|
||
|
||
var coordsToScript1 = "";
|
||
var coordsToScript2 = "";
|
||
var coordsToScript3 = "";
|
||
var coordsToScript4 = "";
|
||
|
||
if (geoArr1 && geoArr1.length) {
|
||
if (geoArr1[0] && geoArr1[0].length) {
|
||
for (var j = 0; j <= geoArr1[0].length; j++) {
|
||
if (geoArr1[0][j] && geoArr1[0][j].length) {
|
||
if (coordsToScript1) {
|
||
coordsToScript1 += ","
|
||
}
|
||
coordsToScript1 += geoArr1[0][j][0] + "," + geoArr1[0][j][1];
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
if (geoArr2 && geoArr2.length) {
|
||
if (geoArr2[0] && geoArr2[0].length) {
|
||
for (var j = 0; j <= geoArr2[0].length; j++) {
|
||
if (geoArr2[0][j] && geoArr2[0][j].length) {
|
||
if (coordsToScript2) {
|
||
coordsToScript2 += ","
|
||
}
|
||
coordsToScript2 += geoArr2[0][j][0] + "," + geoArr2[0][j][1];
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
if (geoArr3 && geoArr3.length) {
|
||
if (geoArr3[0] && geoArr3[0].length) {
|
||
for (var j = 0; j <= geoArr3[0].length; j++) {
|
||
if (geoArr3[0][j] && geoArr3[0][j].length) {
|
||
if (coordsToScript3) {
|
||
coordsToScript3 += ","
|
||
}
|
||
coordsToScript3 += geoArr3[0][j][0] + "," + geoArr3[0][j][1];
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
if (geoArr4 && geoArr4.length) {
|
||
if (geoArr4[0] && geoArr4[0].length) {
|
||
for (var j = 0; j <= geoArr4[0].length; j++) {
|
||
if (geoArr4[0][j] && geoArr4[0][j].length) {
|
||
if (coordsToScript4) {
|
||
coordsToScript4 += ","
|
||
}
|
||
coordsToScript4 += geoArr4[0][j][0] + "," + geoArr4[0][j][1];
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
if (coordsToScript1 || coordsToScript2 || coordsToScript3 || coordsToScript4) {
|
||
$.ajax({
|
||
url: '/ajax/analytics/loadAnalyticsPolygonsMap.php',
|
||
method: "post",
|
||
data: {
|
||
"objId": objId,
|
||
"areaFrom": areaFrom,
|
||
"areaTo": areaTo,
|
||
"kitchenAreaFrom": kitchenAreaFrom,
|
||
"kitchenAreaTo": kitchenAreaTo,
|
||
"yearFrom": yearFrom,
|
||
"yearTo": yearTo,
|
||
"kvType": kvType,
|
||
"commType": commType,
|
||
"poly1": coordsToScript1,
|
||
"poly2": coordsToScript2,
|
||
"poly3": coordsToScript3,
|
||
"poly4": coordsToScript4,
|
||
"order": order
|
||
},
|
||
success: function (data) {
|
||
var resParsed = JSON.parse(data);
|
||
objectManager.add(resParsed.data);
|
||
eval(resParsed.script);
|
||
checkVisibleOrCenterAnalytics();
|
||
},
|
||
error: function (XMLHttpRequest, textStatus, errorThrown) {
|
||
console.log("eRROR: " + errorThrown + "; status:" + textStatus);
|
||
}
|
||
});
|
||
} else {
|
||
alert("Необходимо нарисовать хотя бы одну область на карте, максимальное кол-во областей 4. Для отрисовки нажмите кнопку редактировать в области карты")
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
function initMap(territory) {
|
||
let latitude = $('#selectedObjLat').val();
|
||
let longitude = $('#selectedObjLon').val();
|
||
var mapList = $('.map-view-container .object__list');
|
||
if (!objectManager) {
|
||
|
||
objectManager = new ymaps.ObjectManager({
|
||
clusterize: false,
|
||
clusterDisableClickZoom: true,
|
||
clusterOpenBalloonOnClick: false,
|
||
geoObjectOpenBalloonOnClick: false,
|
||
clusterIconColor: "#43a047",
|
||
iconColor: "#43a047"
|
||
});
|
||
myMap = new ymaps.Map('analyticsMainMap', {
|
||
center: [latitude, longitude],
|
||
zoom: 12,
|
||
controls: ['zoomControl']
|
||
},{
|
||
fullscreenZIndex : 999999999,
|
||
autoFitToViewport : 'always'
|
||
});
|
||
|
||
objectManager.objects.options.set('iconColor', '#43a047');
|
||
myMap.geoObjects.add(objectManager);
|
||
if (!territory) {
|
||
sendObjectsMapRequest();
|
||
} else {
|
||
loadMapObjectsInPolygons();
|
||
}
|
||
|
||
//зум
|
||
myMap.events.add('boundschange', function (e) {
|
||
accessScroll = true;
|
||
checkVisibleOrCenterAnalytics();
|
||
});
|
||
|
||
//клик по кластеру
|
||
objectManager.clusters.events.add('click', function (e) {
|
||
accessScroll = false;
|
||
var id = e.get('objectId'),
|
||
// Получим геообъекты внутри кластера.
|
||
cluster = objectManager.clusters.getById(id),
|
||
geoObjects = cluster.properties.geoObjects;
|
||
var htm = '';
|
||
var limit = 0;
|
||
var i = 0;
|
||
showRightObject = [];
|
||
geoObjects.forEach(function (geoObject) {
|
||
var objectState = objectManager.getObjectState(geoObject.id);
|
||
if (objectState.isShown) {
|
||
if (limit < 10) {
|
||
limit++;
|
||
htm = htm + ' <li class="object-card item_map' + geoObject.properties.balloonContent + '"></li>';
|
||
}
|
||
showRightObject[i] = geoObject.properties.balloonContent;
|
||
i++;
|
||
}
|
||
});
|
||
mapList.html(htm);
|
||
getAnalyticsBaloonContent();
|
||
});
|
||
|
||
//клик по объекту
|
||
objectManager.objects.events.add('click', function (e) {
|
||
accessScroll = false;
|
||
showRightObject = [];
|
||
// Получим объект, на котором открылся балун.
|
||
var id = e.get('objectId');
|
||
showRightObject[0] = objectManager.objects.getById(id).properties.balloonContent;
|
||
geoObject = objectManager.objects;
|
||
mapList.html('<ul><li class="item_map' + objectManager.objects.getById(id).properties.balloonContent + '"></li></ul>');
|
||
getAnalyticsBaloonContent();
|
||
});
|
||
|
||
return true;
|
||
} else {
|
||
return false;
|
||
}
|
||
}
|
||
function ymapsDefine() {
|
||
ymaps.modules.define('ext.paintOnMap', ['meta', 'util.extend', 'pane.EventsPane', 'Event'], function (provide, meta, extend, EventsPane, Event) {
|
||
'use strict';
|
||
|
||
// zIndex пейна событий карты по умолчанию равен 500.
|
||
// Подробней в документации: https://tech.yandex.ru/maps/doc/jsapi/2.1/ref/reference/map.pane.Manager-docpage/
|
||
var EVENTS_PANE_ZINDEX = 500;
|
||
|
||
var DEFAULT_UNWANTED_BEHAVIORS = ['drag', 'scrollZoom'];
|
||
var DEFAULT_STYLE = {strokeColor: '#0000ff', strokeWidth: 1, strokeOpacity: 1};
|
||
var DEFAULT_TOLERANCE = 16;
|
||
|
||
var badFinishPaintingCall = function () {
|
||
throw new Error('(ymaps.ext.paintOnMap) некорректный вызов PaintingProcess#finishPaintingAt. Рисование уже завершено.');
|
||
};
|
||
|
||
/**
|
||
* @interface ymaps.ext.paintOnMap.PaintingProcess
|
||
*/
|
||
|
||
/**
|
||
* Отключает режим рисования.
|
||
* @function
|
||
* @name ymaps.ext.paintOnMap.PaintingProcess#finishPaintingAt
|
||
* @param {Number[]|ymaps.Event} [positionOrEvent] Координаты точки, в которой рисование должно закончиться.
|
||
* Координаты задаются в пикселях относительно верхнего левого угла карты.
|
||
* @return {Number[]} Координаты.
|
||
*/
|
||
|
||
/**
|
||
* Включает режим рисования.
|
||
* @name ymaps.ext.paintOnMap
|
||
* @param {ymaps.Map} map
|
||
* @param {Number[]|ymaps.Event} [positionOrEvent] Координаты точки, в которой рисование должно закончиться.
|
||
* Координаты задаются в пикселях относительно верхнего левого угла карты.
|
||
* @param {Object} [config]
|
||
* @param {String[]|null} [config.unwantedBehaviors] Список поведений карты, которые должны быть выключены во время
|
||
* рисования. Перетаскивание карты и её масштабирование колесом мыши выключены по умолчанию.
|
||
* @param {Object} [config.style] Стили такие же, как в ymaps.Polygon или ymaps.Polyline.
|
||
* @param {String} [config.style.strokeColor='#0000ff'] Цвет линии или обводки.
|
||
* @param {Number} [config.style.strokeWidth=1] Толщина линии или обводки.
|
||
* @param {Number} [config.style.strokeOpacity=1] Прозрачность линии или обводки.
|
||
* @param {Number} [config.tolerance=16] Уровень упрощения координат в пикселях.
|
||
* @returns {ymaps.ext.paintOnMap.PaintingProcess} Процесс рисования.
|
||
*/
|
||
function paintOnMap(map, positionOrEvent, config) {
|
||
config = config || {};
|
||
var style = extend(DEFAULT_STYLE, config.style || {});
|
||
|
||
var unwantedBehaviors = config.unwantedBehaviors === undefined ?
|
||
DEFAULT_UNWANTED_BEHAVIORS : config.unwantedBehaviors;
|
||
|
||
var pane = new EventsPane(map, {
|
||
css: {position: 'absolute', width: '100%', height: '100%'},
|
||
zIndex: EVENTS_PANE_ZINDEX + 50,
|
||
transparent: true
|
||
});
|
||
|
||
map.panes.append('ext-paint-on-map', pane);
|
||
|
||
if (unwantedBehaviors) {
|
||
map.behaviors.disable(unwantedBehaviors);
|
||
}
|
||
|
||
// Создаём canvas-элемент.
|
||
var canvas = document.createElement('canvas');
|
||
var ctx2d = canvas.getContext('2d');
|
||
var rect = map.container.getParentElement().getBoundingClientRect();
|
||
canvas.width = rect.width;
|
||
canvas.height = rect.height;
|
||
|
||
ctx2d.globalAlpha = style.strokeOpacity;
|
||
ctx2d.strokeStyle = style.strokeColor;
|
||
ctx2d.lineWidth = style.strokeWidth;
|
||
|
||
canvas.style.width = '100%';
|
||
canvas.style.height = '100%';
|
||
|
||
pane.getElement().appendChild(canvas);
|
||
|
||
var firstPosition = positionOrEvent ? toPosition(positionOrEvent) : null;
|
||
var coordinates = firstPosition ? [firstPosition] : [];
|
||
|
||
var bounds = map.getBounds();
|
||
var latDiff = bounds[1][0] - bounds[0][0];
|
||
var lonDiff = bounds[1][1] - bounds[0][1];
|
||
|
||
canvas.onmousemove = function (e) {
|
||
coordinates.push([e.offsetX, e.offsetY]);
|
||
|
||
ctx2d.clearRect(0, 0, canvas.width, canvas.height);
|
||
ctx2d.beginPath();
|
||
|
||
ctx2d.moveTo(coordinates[0][0], coordinates[0][1]);
|
||
for (var i = 1; i < coordinates.length; i++) {
|
||
ctx2d.lineTo(coordinates[i][0], coordinates[i][1]);
|
||
}
|
||
|
||
ctx2d.stroke();
|
||
}.bind(this);
|
||
|
||
// Создаём косвенное обращение, чтобы не сдерживать сборщик мусора.
|
||
var paintingProcess = {
|
||
finishPaintingAt: function (positionOrEvent) {
|
||
paintingProcess.finishPaintingAt = badFinishPaintingCall;
|
||
|
||
// Получаем координаты, прежде чем удалить пейн.
|
||
if (positionOrEvent) {
|
||
coordinates.push(toPosition(positionOrEvent));
|
||
}
|
||
|
||
map.panes.remove(pane);
|
||
if (unwantedBehaviors) {
|
||
map.behaviors.enable(unwantedBehaviors);
|
||
}
|
||
|
||
var tolerance = config.tolerance === undefined ? DEFAULT_TOLERANCE : Number(config.tolerance);
|
||
if (tolerance) {
|
||
coordinates = simplify(coordinates, tolerance);
|
||
}
|
||
// Преобразовываем координаты canvas-элемента в геодезические координаты.
|
||
return coordinates.map(function (x) {
|
||
var lon = bounds[0][1] + (x[0] / canvas.width) * lonDiff;
|
||
var lat = bounds[0][0] + (1 - x[1] / canvas.height) * latDiff;
|
||
|
||
return meta.coordinatesOrder === 'latlong' ? [lat, lon] : [lon, lat];
|
||
});
|
||
}
|
||
};
|
||
|
||
return paintingProcess;
|
||
}
|
||
|
||
function toPosition(positionOrEvent) {
|
||
return positionOrEvent instanceof Event ?
|
||
[positionOrEvent.get('offsetX'), positionOrEvent.get('offsetY')] :
|
||
positionOrEvent;
|
||
}
|
||
|
||
function simplify(coordinates, tolerance) {
|
||
var toleranceSquared = tolerance * tolerance;
|
||
var simplified = [coordinates[0]];
|
||
|
||
var prev = coordinates[0];
|
||
for (var i = 1; i < coordinates.length; i++) {
|
||
var curr = coordinates[i];
|
||
if (Math.pow(prev[0] - curr[0], 2) + Math.pow(prev[1] - curr[1], 2) > toleranceSquared) {
|
||
simplified.push(curr);
|
||
prev = curr;
|
||
}
|
||
}
|
||
|
||
return simplified;
|
||
}
|
||
|
||
provide(paintOnMap);
|
||
});
|
||
}
|
||
|
||
function deleteFromAnalyticsView(id) {
|
||
var objId = $("#selectedObjId").val();
|
||
if (objId) {
|
||
$.ajax({
|
||
url: '/ajax/analytics/addToExclude.php',
|
||
method: "post",
|
||
data: {
|
||
"object_id": objId,
|
||
"exclude_object_id": id
|
||
},
|
||
success: function (data) {
|
||
var button = $('.js-modal-tab.is-active');
|
||
if (button.attr('data-id') === 'tab_1') {
|
||
var link = $('ul.pagination li.active a.obj-analysis-paging2');
|
||
if (link && link.length > 0) {
|
||
var pageNum = link.attr('data-page-num');
|
||
loadCurrentHouseData(pageNum);
|
||
} else {
|
||
loadCurrentHouseData(1);
|
||
}
|
||
}
|
||
if (button.attr('data-id') === 'tab_2') {
|
||
var link = $('ul.pagination li.active a.obj-analysis-paging3');
|
||
if (link && link.length > 0) {
|
||
var pageNum = link.attr('data-page-num');
|
||
loadRadiusOrMapData(pageNum);
|
||
} else {
|
||
loadRadiusOrMapData(1);
|
||
}
|
||
}
|
||
if (button.attr('data-id') === 'tab_3') {
|
||
var link = $('ul.pagination li.active a.obj-analysis-paging15');
|
||
if (link && link.length > 0) {
|
||
var pageNum = link.attr('data-page-num');
|
||
loadRadiusOrMapData(pageNum);
|
||
} else {
|
||
loadRadiusOrMapData(1);
|
||
}
|
||
}
|
||
},
|
||
error: function (XMLHttpRequest, textStatus, errorThrown) {
|
||
console.log("eRROR: " + errorThrown + "; status:" + textStatus);
|
||
}
|
||
});
|
||
}
|
||
}
|
||
|
||
function deleteFromAnalysisPart(id) {
|
||
var objId = $("#selectedObjId").val();
|
||
if (objId) {
|
||
$.ajax({
|
||
url: '/ajax/analytics/addToExclude.php',
|
||
method: "post",
|
||
data: {
|
||
"object_id": objId,
|
||
"exclude_object_id": id
|
||
},
|
||
success: function (data) {
|
||
var part = $('#analysisPartInAnalytics').val();
|
||
var pageNum = 1;
|
||
var link = $('ul.pagination li.active a.obj-analysis-paging10');
|
||
if (link && link.length > 0) {
|
||
pageNum = link.attr('data-page-num');
|
||
part = link.attr('data-part');
|
||
}
|
||
$('#objectsAnalysisContainer').html('<div class="object-content__preloader" style="display: block;"><img src="/images/rocket-spinner.svg" width="96px"></div>');
|
||
$.ajax({
|
||
url: '/ajax/analytics/getAnalyticsObjectList.php?page=' + pageNum + '&objectId=' + objId + '&analysisPart=' + part,
|
||
success: function(data) {
|
||
$('#objectsAnalysisContainer').html(data);
|
||
$("#modalObjectsAnalysis").get(0).scrollIntoView();
|
||
|
||
setTimeout(function() {
|
||
$('#objectsAnalysisContainer .fotorama').fotorama();
|
||
}, 100);
|
||
}
|
||
});
|
||
}
|
||
,
|
||
error: function (XMLHttpRequest, textStatus, errorThrown) {
|
||
console.log("eRROR: " + errorThrown + "; status:" + textStatus);
|
||
}
|
||
});
|
||
}
|
||
}
|
||
|
||
function saveObjectCabinetCompetitors(){
|
||
var objId = $("#selectedObjId").val();
|
||
var cabinetId = $("#cabinet_id").val();
|
||
if (objId) {
|
||
$.ajax({
|
||
url: '/ajax/saveCabinetCompetitors.php',
|
||
method: "post",
|
||
data: {
|
||
"object_id": objId
|
||
},
|
||
success: function (data) {
|
||
$.ajax({
|
||
url: "/ajax/getCabinetCompetitorObjects.php?cabinetId=" + cabinetId,
|
||
success: function (data) {
|
||
$(".info__objects-list").html(data);
|
||
},
|
||
error: function (data) {
|
||
console.log("eRROR: " + errorThrown + "; status:" + textStatus);
|
||
}
|
||
});
|
||
$('.analytics-modal').removeClass('is-opened');
|
||
},
|
||
error: function (XMLHttpRequest, textStatus, errorThrown) {
|
||
console.log("eRROR: " + errorThrown + "; status:" + textStatus);
|
||
}
|
||
});
|
||
}
|
||
} |