×
HeadHunter and Superjob rezume updater on Ruby on Rails (21 авг 2017)

Практикуемся в написании кода под rails.

Вопрос Погода по ip на Яндекс-картах

Больше
2 года 9 мес. назад - 2 года 9 мес. назад #1 от Aleksej
Aleksej создал эту тему: Погода по ip на Яндекс-картах
Здесь опубликован код скрипта, демку которого вы можете увидеть в статье блога Погода по ip на Яндекс-картах . Там же и небольшая аннотация/комментарий.

<!DOCTYPE html>
<html>

<head>
    <title>Погода по ip на Яндекс-картах</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <script src="http://api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
    
<?php
$ip = $_SERVER['REMOTE_ADDR'];
include("SxGeo.php");
$SxGeo = new SxGeo('SxGeoCity.dat');
$city = $SxGeo->get($ip);
$loc_array = array($city['city']['lat'],$city['city']['lon']);

$api_key="VASH_API_KEY_WWO"; 
$num_of_days=1; 

$loc_safe = array();
foreach($loc_array as $loc){
    $loc_safe[] = urlencode($loc);
}
$loc_string=implode(',', $loc_safe);

//To add more conditions to the query, just lengthen the url string
$basicurl = sprintf('http://api.worldweatheronline.com/free/v1/weather.ashx?key=%s&q=%s&num_of_days=%s', $api_key, $loc_string, intval($num_of_days));


$xml_response = file_get_contents($basicurl);
$xml = simplexml_load_string($xml_response);



$ss = array();
foreach ($xml[0] as $name => $val) { 
foreach ($val as $name1 => $val1)
{

$ss[$name1] = $val1;
}
}
?>
    
    <script type="text/javascript">
    ymaps.ready(function () {
    myMap = new ymaps.Map('map', {
        zoom: 8,
        center: [<?= $city['city']['lat']?>,<?= $city['city']['lon'] ?>] 
    });
    var myPlacemark = new ymaps.Placemark([<?= $city['city']['lat']?>,<?= $city['city']['lon'] ?>], {
        balloonContent: '<? echo "Температура {$ss["temp_C"]} С";echo "<br>"; echo "Скорость ветра {$ss["windspeedKmph"]} м/сек"; echo "<br>"; echo "Направление ветра {$ss["winddirection"]}"; echo "<br>";echo $ss["weatherDesc"]; ?>'
    }, {
        balloonPanelMaxMapArea: 0
    });

    observeEvents(myMap);

    myMap.geoObjects.add(myPlacemark);
    myPlacemark.balloon.open();
});

function observeEvents (map) {
    var mapEventsGroup,
        mapBalloonEventsGroup = map.balloon.events
            // При открытии балуна начинаем слушать изменение центра карты.
            .add('open', function (e1) {
                var placemark = e1.get('target');

                // Вызываем функцию в двух случаях:
                mapEventsGroup = map.events.group()
                    // 1) в начале движения (если балун во внешнем контейнере);
                    .add('actiontick', function (e2) {
                        if (placemark.options.get('balloonPane') == 'outerBalloon') {
                            setBalloonPane(placemark, e2.get('tick'));
                        }
                    })
                    // 2) в конце движения (если балун во внутреннем контейнере).
                    .add('actiontickcomplete', function (e2) {
                        if (placemark.options.get('balloonPane') != 'outerBalloon') {
                            setBalloonPane(placemark, e2.get('tick'));
                        }
                    });

                // Вызываем функцию сразу после открытия.
                setBalloonPane(placemark);
            })
            // При закрытии балуна удаляем слушатели.
            .add('close', function () {
                mapEventsGroup.removeAll();
            });
}

function setBalloonPane (placemark, mapData) {
    mapData = mapData || {
        globalPixelCenter: myMap.getGlobalPixelCenter(),
        zoom: myMap.getZoom()
    };

    var mapSize = myMap.container.getSize(),
        mapBounds = [
            [mapData.globalPixelCenter[0] - mapSize[0] / 2, mapData.globalPixelCenter[1] - mapSize[1] / 2],
            [mapData.globalPixelCenter[0] + mapSize[0] / 2, mapData.globalPixelCenter[1] + mapSize[1] / 2]
        ],
        balloonPosition = placemark.balloon.getPosition(),
    // Используется при изменении зума.
        zoomFactor = Math.pow(2, mapData.zoom - myMap.getZoom()),
    // Определяем, попадает ли точка привязки балуна в видимую область карты.
        pointInBounds = ymaps.util.bounds.contains(mapBounds, [
            balloonPosition[0] * zoomFactor,
            balloonPosition[1] * zoomFactor
        ]),
        isInOutersPane = placemark.options.get('balloonPane') == 'outerBalloon';

    // Если точка привязки не попадает в видимую область карты, переносим балун во внутренний контейнер
    if (!pointInBounds && isInOutersPane) {
        placemark.options.set({
            balloonPane: 'balloon',
            balloonShadowPane: 'shadows'
        });
        // и наоборот.
    } else if (pointInBounds && !isInOutersPane) {
        placemark.options.set({
            balloonPane: 'outerBalloon',
            balloonShadowPane: 'outerBalloon'
        });
    }
}
   </script> 
    
	<style>
        #map {
            width: auto;
            height: 350px;
        }
    </style>
</head>

<body>
    <div id="map"></div>
</body>

</html>
Последнее редактирование: 2 года 9 мес. назад от Aleksej.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
2 года 8 мес. назад #2 от beginner
beginner ответил в теме Погода по ip на Яндекс-картах
Прикольно, прикольно. А Worldweatheronline это европейцы или американцы?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
2 года 8 мес. назад #3 от Aleksej
Aleksej ответил в теме Погода по ip на Яндекс-картах

beginner пишет: Прикольно, прикольно. А Worldweatheronline это европейцы или американцы?


Англичане, I think. UK, Manchester.
Кстати, чуть подчистил код. Напоминаю, это еще первый Free API (а не второй):

<!DOCTYPE html>
<html>

<head>
    <title>Погода по ip и лично для вас</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <script src="http://api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
    
<?php
$ip = $_SERVER['REMOTE_ADDR'];
include("SxGeo.php");
$SxGeo = new SxGeo('SxGeoCity.dat');
$city = $SxGeo->get($ip);
$loc_array = array($city['city']['lat'],$city['city']['lon']);

$api_key="VASH_API_KEY_WWO"; 
$num_of_days=1; 

$loc_safe = array();
foreach($loc_array as $loc){
    $loc_safe[] = urlencode($loc);
}
$loc_string=implode(',', $loc_safe);
$basicurl = sprintf('http://api.worldweatheronline.com/free/v1/weather.ashx?key=%s&q=%s&num_of_days=%s', $api_key, $loc_string, intval($num_of_days));

$xml_response = file_get_contents($basicurl);
$xml = simplexml_load_string($xml_response);
?>
    
    <script type="text/javascript">
    ymaps.ready(function () {
    myMap = new ymaps.Map('map', {
        zoom: 8,
        center: [<?= $city['city']['lat']?>,<?= $city['city']['lon'] ?>] 
    });
    var myPlacemark = new ymaps.Placemark([<?= $city['city']['lat']?>,<?= $city['city']['lon'] ?>], {
        balloonContent: '<? echo 'Температура '. ($xml->current_condition->temp_C). ' °C';echo "<br>"; echo 'Скорость ветра '. ($xml->current_condition->windspeedKmph). ' км/час'; echo "<br>"; echo 'Направление ветра '. ($xml->current_condition->winddir16Point); echo "<br>";echo ($xml->current_condition->weatherDesc); ?>'
    }, {
        balloonPanelMaxMapArea: 0
    });

    observeEvents(myMap);

    myMap.geoObjects.add(myPlacemark);
    myPlacemark.balloon.open();
});

function observeEvents (map) {
    var mapEventsGroup,
        mapBalloonEventsGroup = map.balloon.events
            // При открытии балуна начинаем слушать изменение центра карты.
            .add('open', function (e1) {
                var placemark = e1.get('target');

                // Вызываем функцию в двух случаях:
                mapEventsGroup = map.events.group()
                    // 1) в начале движения (если балун во внешнем контейнере);
                    .add('actiontick', function (e2) {
                        if (placemark.options.get('balloonPane') == 'outerBalloon') {
                            setBalloonPane(placemark, e2.get('tick'));
                        }
                    })
                    // 2) в конце движения (если балун во внутреннем контейнере).
                    .add('actiontickcomplete', function (e2) {
                        if (placemark.options.get('balloonPane') != 'outerBalloon') {
                            setBalloonPane(placemark, e2.get('tick'));
                        }
                    });

                // Вызываем функцию сразу после открытия.
                setBalloonPane(placemark);
            })
            // При закрытии балуна удаляем слушатели.
            .add('close', function () {
                mapEventsGroup.removeAll();
            });
}

function setBalloonPane (placemark, mapData) {
    mapData = mapData || {
        globalPixelCenter: myMap.getGlobalPixelCenter(),
        zoom: myMap.getZoom()
    };

    var mapSize = myMap.container.getSize(),
        mapBounds = [
            [mapData.globalPixelCenter[0] - mapSize[0] / 2, mapData.globalPixelCenter[1] - mapSize[1] / 2],
            [mapData.globalPixelCenter[0] + mapSize[0] / 2, mapData.globalPixelCenter[1] + mapSize[1] / 2]
        ],
        balloonPosition = placemark.balloon.getPosition(),
    // Используется при изменении зума.
        zoomFactor = Math.pow(2, mapData.zoom - myMap.getZoom()),
    // Определяем, попадает ли точка привязки балуна в видимую область карты.
        pointInBounds = ymaps.util.bounds.contains(mapBounds, [
            balloonPosition[0] * zoomFactor,
            balloonPosition[1] * zoomFactor
        ]),
        isInOutersPane = placemark.options.get('balloonPane') == 'outerBalloon';

    // Если точка привязки не попадает в видимую область карты, переносим балун во внутренний контейнер
    if (!pointInBounds && isInOutersPane) {
        placemark.options.set({
            balloonPane: 'balloon',
            balloonShadowPane: 'shadows'
        });
        // и наоборот.
    } else if (pointInBounds && !isInOutersPane) {
        placemark.options.set({
            balloonPane: 'outerBalloon',
            balloonShadowPane: 'outerBalloon'
        });
    }
}
   </script> 
    
	<style>
        #map {
            width: auto;
            height: 350px;
        }
    </style>
</head>

<body>
    <div id="map"></div>
</body>

</html>

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
2 года 3 нед. назад #4 от fotic
fotic ответил в теме Погода по ip на Яндекс-картах
Как регулировать размеры пропорции балуна в стилях?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
2 года 3 нед. назад #5 от serge
serge ответил в теме Погода по ip на Яндекс-картах
ну например так:

.ymaps-2-1-29-balloon__layout {
width: 220px;
}

А я смогу! - А поглядим! - А я упрямый!

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
1 год 9 мес. назад - 1 год 6 мес. назад #6 от Aleksej
Aleksej ответил в теме Погода по ip на Яндекс-картах
Чуть-чуть упорядочим и значительно упростим код:

<!DOCTYPE html>
<html>

<head>
    <title>Погода по ip на Яндекс-картах</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <script src="http://api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
    
<?php
$ip = $_SERVER['REMOTE_ADDR'];
include("SxGeo.php");
$SxGeo = new SxGeo('SxGeoCity.dat');
$city = $SxGeo->get($ip);
$loc_array = array($city['city']['lat'],$city['city']['lon']);

$api_key="********************************************"; 
$num_of_days=1; 

$loc_safe = array();
foreach($loc_array as $loc){
    $loc_safe[] = urlencode($loc);
}
$loc_string=implode(',', $loc_safe);
$basicurl = sprintf('http://api2.worldweatheronline.com/free/v2/weather.ashx?key=%s&q=%s&num_of_days=%s', $api_key, $loc_string, intval($num_of_days));
$xml = simplexml_load_file($basicurl);
?>
    
<script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
<div class="yandex_map" id="yandex_map">
<script type="text/javascript"> 
var myMap; 
ymaps.ready(init); 
function init () { 
    var myMap = new ymaps.Map("map", { 
            center: [<?= $city['city']['lat']?>,<?= $city['city']['lon'] ?>], 
            zoom: 8, 
            controls: ['zoomControl','fullscreenControl'] 
                }); 
    myPlacemark = new ymaps.Placemark([<?= $city['city']['lat']?>,<?= $city['city']['lon'] ?>], { 
    balloonContent: '<? echo 'Температура '. ($xml->current_condition->temp_C). ' °C';echo "<br>"; echo 'Скорость ветра '. ($xml->current_condition->windspeedKmph). ' км/час'; echo "<br>"; echo 'Направление ветра '. ($xml->current_condition->winddir16Point); echo "<br>";echo ($xml->current_condition->weatherDesc); ?>'}); 
myMap.geoObjects  
.add(myPlacemark);
myPlacemark.balloon.open();
} 
</script> 
<div id="map" style="width:auto; height:350px"></div> 
</div>
</head>

<body>
    <div id="map"></div>
</body>

</html>
Последнее редактирование: 1 год 6 мес. назад от p.rishard.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
1 год 6 мес. назад - 1 год 6 мес. назад #7 от uvlecheniehobby.ru
uvlecheniehobby.ru ответил в теме Погода по ip на Яндекс-картах
у меня ваш код не работает здесь какието бувы и цифры а карты нет
Последнее редактирование: 1 год 6 мес. назад от p.rishard.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
1 год 6 мес. назад #8 от serge
serge ответил в теме Погода по ip на Яндекс-картах

uvlecheniehobby.ru пишет: у меня ваш код не работает здесь какието бувы и цифры а карты нет


Ну, что же делать. Не впадайте в уныние и не теряйте надежду. У нас-то ведь работает, а php - он и в африке php. ;)
Пусть ваш системный администратор настроит адекватно ваш сервер, и все сразу заработает... маленькая подсказка: вполне возможно, понадобится включить allow_url_fopen и short_open_tag. Остальное, соль и сахар, как говорится - по вкусу.

А я смогу! - А поглядим! - А я упрямый!

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
1 год 6 мес. назад #9 от uvlecheniehobby.ru
uvlecheniehobby.ru ответил в теме Погода по ip на Яндекс-картах
то есть я всё правильно делаю-копирую код и вставляю в хидер или футер.А у кого на движке phpbb3 работает погода на яндекс картах?
Вы можите скинуть ссылку на карты с погодой,что бы она была на всю страницу на вашем сайте мастерпро,я бы тогда её проще вставил?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
1 год 6 мес. назад - 1 год 6 мес. назад #10 от Aleksej
Aleksej ответил в теме Погода по ip на Яндекс-картах

uvlecheniehobby.ru пишет: то есть я всё правильно делаю-копирую код и вставляю в хидер или футер.



Не знаю, не уверен.
Попробуйте следующим образом: весь код "как есть" сохраните в файл с любым названием и расширением php, забросьте в публичную директорию вашего веб-сервера и откройте в браузере. Получите карту как раз "на всю страницу".
Не забудьте получить на WWO собственный api_key и указать его в этой строчке:


$api_key="VASH_API_KEY_WWO";


К сожалению, WorldWeatherOnline буквально неделю назад опубликовал в своем фейсбуке (см. по ссылке) известие о том, что прекращает раздачу бесплатных api_key; ну, что ж тут поделаешь. В Европе тоже кризис. Предлагается бесплатный триал сроком на два месяца. Именно по этой причине сейчас готовится к публикации новая версия модуля под Joomla, предлагающая выбор между сервисами WorldWeatherOnline и Weather Underground , последний пока что позволяет, в числе прочего, полностью бесплатный доступ к своему API. По ссылке - демка и рабочая версия кода; возможно, заинтересует.
Последнее редактирование: 1 год 6 мес. назад от p.rishard.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.