-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathobject_manager.js
More file actions
255 lines (225 loc) · 10.2 KB
/
Copy pathobject_manager.js
File metadata and controls
255 lines (225 loc) · 10.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
$(function() {
ymaps.ready(init);
function init() {
var myPlacemark,
myMap = new ymaps.Map('map', {
center: [43.242673, 76.956335],
zoom: 11,
controls: ['zoomControl', 'typeSelector', 'fullscreenControl', ]
}, {
searchControlProvider: 'yandex#search'
});
// Слушаем клик на карте.
myMap.events.add('click', function(e) {
var coords = e.get('coords');
// Если метка уже создана – просто передвигаем ее.
if (myPlacemark) {
myPlacemark.geometry.setCoordinates(coords);
}
// Если нет – создаем.
else {
myPlacemark = createPlacemark(coords);
myMap.geoObjects.add(myPlacemark);
// Слушаем событие окончания перетаскивания на метке.
myPlacemark.events.add('dragend', function() {
getAddress(myPlacemark.geometry.getCoordinates());
});
}
getAddress(coords);
});
// Создание метки.
function createPlacemark(coords) {
return new ymaps.Placemark(coords, {
iconCaption: 'поиск...'
}, {
preset: 'islands#violetDotIconWithCaption',
draggable: true
});
}
// Определяем адрес по координатам (обратное геокодирование).
function getAddress(coords) {
myPlacemark.properties.set('iconCaption', 'поиск...');
ymaps.geocode(coords).then(function(res) {
var firstGeoObject = res.geoObjects.get(0);
myPlacemark.properties
.set({
// Формируем строку с данными об объекте.
iconCaption: [
// Название населенного пункта или вышестоящее административно-территориальное образование.
firstGeoObject.getLocalities().length ? firstGeoObject.getLocalities() : firstGeoObject.getAdministrativeAreas(),
// Получаем путь до топонима, если метод вернул null, запрашиваем наименование здания.
firstGeoObject.getThoroughfare() || firstGeoObject.getPremise()
].filter(Boolean).join(', '),
// В качестве контента балуна задаем строку с адресом объекта.
balloonContent: firstGeoObject.getAddressLine()
});
});
}
// Создаем коллекцию, и массив для хранения наших точек.
myCollection = new ymaps.GeoObjectCollection(), myPoints = [];
$.ajax({
url: "/api/read.php",
type: "GET",
contentType: 'application/json',
success: function(data, textStatus, xhr) {
myPoints = data;
// Заполняем коллекцию данными.
for (var i = 0, l = myPoints.length; i < l; i++) {
var point = myPoints[i];
myCollection.add(new ymaps.Placemark(
point.coords, {
balloonContentBody: point.text
}
));
}
// Добавляем коллекцию меток на карту.
myMap.geoObjects.add(myCollection);
},
error: function(xhr, resp, text) {
// вывести ошибку в консоль
console.log(xhr, resp, text);
}
});
}
});
//Модуль поиска по адресу и получение координат
$(function() {
ymaps.ready(init2);
function init2() {
// Подключаем поисковые подсказки к полю ввода.
var suggestView = new ymaps.SuggestView('suggest'),
map,
placemark;
// При клике по кнопке запускаем верификацию введёных данных.
$('#button').bind('click', function(e) {
geocode();
});
function geocode() {
// Забираем запрос из поля ввода.
var request = $('#suggest').val();
// Геокодируем введённые данные.
ymaps.geocode(request).then(function(res) {
var obj = res.geoObjects.get(0),
error, hint;
if (obj) {
// Об оценке точности ответа геокодера можно прочитать тут: https://tech.yandex.ru/maps/doc/geocoder/desc/reference/precision-docpage/
switch (obj.properties.get('metaDataProperty.GeocoderMetaData.precision')) {
case 'exact':
break;
case 'number':
case 'near':
case 'range':
error = 'Неточный адрес, требуется уточнение';
hint = 'Уточните номер дома';
break;
case 'street':
error = 'Неполный адрес, требуется уточнение';
hint = 'Уточните номер дома';
break;
case 'other':
default:
error = 'Неточный адрес, требуется уточнение';
hint = 'Уточните адрес';
}
} else {
error = 'Адрес не найден';
hint = 'Уточните адрес';
}
// Если геокодер возвращает пустой массив или неточный результат, то показываем ошибку.
if (error) {
showError(error);
showMessage(hint);
} else {
showResult(obj);
}
}, function(e) {
console.log(e)
})
}
function showResult(obj) {
// Удаляем сообщение об ошибке, если найденный адрес совпадает с поисковым запросом.
$('#suggest').removeClass('input_error');
$('#notice').css('display', 'none');
// Сохраняем полный адрес для сообщения под картой.
address = [obj.getCountry(), obj.getAddressLine()].join(', ');
//Из объекта берем координаты
сoord = obj.geometry.getCoordinates();
//Показываем форму
$('#footer').css('display', 'block');
//Вставляем в инпуты значения
document.getElementById("address").setAttribute('value', address);
document.getElementById("latitude").setAttribute('value', сoord[0]);
document.getElementById("longitude").setAttribute('value', сoord[1]);
//Есть проблема jquery val не вставляет в html значенние
// $('#address').val(address);
}
function showError(message) {
$('#notice').text(message);
$('#suggest').addClass('input_error');
$('#notice_footer').css('display', 'block');
$('#notice').css('display', 'block');
}
function showMessage(message) {
$('#notice').css('display', 'block');
$('#message').text(message);
}
}
});
// Отдельная функция для сериализации объекта
$.fn.serializeObject = function() {
var o = {};
var a = this.serializeArray();
$.each(a, function() {
if (o[this.name]) {
if (!o[this.name].push) {
o[this.name] = [o[this.name]];
}
o[this.name].push(this.value || '');
} else {
o[this.name] = this.value || '';
}
});
return o;
};
// будет работать, если создана форма адреса
$(document).on('click', '#save_address', function() {
// получение данных формы
var form_data = JSON.stringify($('#create-address-form').serializeObject());
// отправка данных формы в API
$.ajax({
url: "/api/create.php",
type: "POST",
contentType: 'application/json',
data: form_data,
success: function(result) {
// адрес был добавлен
console.log(result);
alert("Адрес добавлен");
document.location.reload();
},
error: function(xhr, resp, text) {
// вывести ошибку в консоль
console.log(xhr, resp, text);
}
});
return false;
});
function deleteAddress(id) {
if (confirm('Удаляем адрес?')) {
$.ajax({
url: "/api/delete.php",
type: "POST",
dataType: 'json',
data: JSON.stringify({ id: id }),
success: function(result) {
alert("Адрес успешно удален");
document.location.reload();
},
error: function(xhr, resp, text) {
console.log(xhr, resp, text);
}
});
} else {
alert("Адрес не удален");
}
}