OpenStreetMaps Osclass Plugin

OpenStreetMaps Osclass Plugin 1.6.2

Нет прав на скачивание
  • Создатель Темы Создатель Темы theresa
  • Дата начала Дата начала
Присоединился
Сент 11, 2021
Сообщения
9,269
Оценка реакций
2,995
Credits
$11,890
thanks to dear member @theresa submitted a new resource:

OpenStreetMaps Osclass Plugin - allows to put listings on map and provide better visual to present and search listings on your class

Просмотреть вложение 41940
OpenStreetMaps Osclass Plugin allows to put listings on map and provide better visual to present and search listings on your classifieds.

Don't you want to pay to Google for using google maps? We neither, as google recently introduced billing plan for using google map services and ended up free services. To use google api now you have to put your credit card here first! OpenStreetMaps is totally free!

Free google maps for osclass​

...

Read more about this resource...
 
Карту OpenStreetMaps также можно встроить в другие плагины например в яндекс карту
заменить в плагине яндекс карт map.php
Код:
<?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: '&copy; <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>
 
Вверх