<?php
// Собираем адрес из полей объявления (для отображения в метке)
$addr_parts = array();
if (!empty($item['s_zip'])) $addr_parts[] = $item['s_zip'];
if (!empty($item['s_country'])) $addr_parts[] = $item['s_country'];
if (!empty($item['s_region'])) $addr_parts[] = $item['s_region'];
if (!empty($item['s_city'])) $addr_parts[] = $item['s_city'];
if (!empty($item['s_address'])) $addr_parts[] = $item['s_address']; // может содержать координаты
$display_address = implode(", ", $addr_parts);
?>
<!-- Подключаем Leaflet -->
<link rel="stylesheet" href="https://unpkg.com/[email protected]/dist/leaflet.css" />
<script src="https://unpkg.com/[email protected]/dist/leaflet.js"></script>
<!-- Контейнер для карты -->
<div id="map" style="width: 100%; height: 240px;"></div>
<script>
// Функция инициализации карты
function initMap(lat, lon) {
var map = L.map('map').setView([lat, lon], 16);
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
}).addTo(map);
L.marker([lat, lon]).addTo(map)
.bindPopup('<?php echo addslashes($display_address); ?>')
.openPopup();
}
// Получаем значение поля s_address (может быть либо текстовым адресом, либо координатами)
var rawAddress = '<?php echo addslashes($item['s_address']); ?>';
// Проверяем, является ли s_address координатами (формат: "широта, долгота")
var coordsMatch = rawAddress.match(/^([-+]?\d{1,2}\.\d+),\s*([-+]?\d{1,3}\.\d+)$/);
if (coordsMatch) {
// Это координаты – используем их напрямую
var lat = parseFloat(coordsMatch[1]);
var lon = parseFloat(coordsMatch[2]);
initMap(lat, lon);
} else {
// Если нет координат, пробуем геокодировать текстовый адрес
var country = '<?php echo addslashes($item['s_country']); ?>';
var region = '<?php echo addslashes($item['s_region']); ?>';
var city = '<?php echo addslashes($item['s_city']); ?>';
var street = rawAddress; // здесь может быть старый текстовый адрес
var zip = '<?php echo addslashes($item['s_zip']); ?>';
// Выполняем геокодирование, если есть хотя бы улица, город или регион
if (street.trim() !== '' || city.trim() !== '' || region.trim() !== '') {
// Структурированный запрос
var params = new URLSearchParams({
format: 'json',
limit: 1,
countrycodes: 'ru' // ограничиваем Россией (можно убрать или параметризовать)
});
if (street) params.append('street', street);
if (city) params.append('city', city);
if (region) params.append('state', region);
if (country) params.append('country', country);
if (zip) params.append('postalcode', zip);
var url = 'https://nominatim.openstreetmap.org/search?' + params.toString();
fetch(url, {
headers: { 'User-Agent': 'OsclassPlugin/1.0' }
})
.then(response => response.json())
.then(data => {
if (data && data.length > 0) {
var lat = parseFloat(data[0].lat);
var lon = parseFloat(data[0].lon);
initMap(lat, lon);
} else {
// Если структурированный не сработал, пробуем свободный запрос
console.log('Структурированный запрос не дал результатов, пробуем свободный');
var freeUrl = 'https://nominatim.openstreetmap.org/search?format=json&q='
+ encodeURIComponent('<?php echo addslashes($display_address); ?>')
+ '&countrycodes=ru&limit=1';
return fetch(freeUrl, {
headers: { 'User-Agent': 'OsclassPlugin/1.0' }
})
.then(response => response.json())
.then(data => {
if (data && data.length > 0) {
var lat = parseFloat(data[0].lat);
var lon = parseFloat(data[0].lon);
initMap(lat, lon);
} else {
console.log('Адрес не найден');
// Можно скрыть карту или показать сообщение
document.getElementById('map').style.display = 'none';
}
});
}
})
.catch(error => console.error('Ошибка геокодирования:', error));
} else {
console.log('Нет данных для геокодирования');
// Скрываем карту, если нет адреса
document.getElementById('map').style.display = 'none';
}
}
</script>