@hollanditkzn

Как отображать не долготу и широту а адрес?

Как сделать так чтобы отображать в gridview отображать не долготу и широту, а именно адрес, как понимаю или сохранять изначально улица и дом, или можно как-то из долготы и широты, чтобы отображался адрес?
Как понимаю что лучше смотреть как понимаю на rest api?
Как я реализовал
В виджете YandexMap
class YandexMap extends Widget
{
    public $data = null;
    public function init()
    {
        parent::init();
    }

    public function run()
    {
        $this->view->registerJsFile('https://api-maps.yandex.ru/2.1/?lang=ru_RU', ['type' => 'text/javascript']);
        $this->view->registerJsFile('@web/js/yandexMap.js');
        if($this->data != null){
            $script = <<<JS
let myGeocode;
yamps.ready(
    myGeocode = new yamps.geocode([$this->data]);
    myGeocode.then(
        function(res){
            return res.geoObjects.get(0).properties.get('name');
        },
        function(err){
            alert(err);
        }
    )
)
JS;

        }
    }
}

В gridview в аттрибуте
[
                'attribute' => 'to',
                'format' => 'raw',
                'value' => function($courier){
                    return '<span class="shipping">Откуда: </span>'.\frontend\components\YandexMap::widget(['data' => $courier->to]) ;
                },
                'contentOptions' => ['class' => 'textTr tr202'],
            ],

Если конечно нужно посмотреть на сам файл yandex.Map.js То вот
let searchControl,
    suggestView;

ymaps.ready(init);

function init(){
    suggestView = new ymaps.SuggestView('toMap');
    suggestView = new ymaps.SuggestView('fromMap');
    searchControl = new ymaps.control.SearchControl({
        options: {
            float: 'left',
            floatIndex: 100,
            noPlacemark: true
        }
    });
    geoObject('#toMap', '#toInput');
    geoObject('#fromMap', '#fromInput');

    function geoObject(idInput, toInput){
        $(idInput).on('change', function () {
            let value = $(this).val();
            searchControl.search(value).then(function () {
                let geoOjectsArray = searchControl.getResultsArray();
                if(geoOjectsArray.length){
                    let coordinat = geoOjectsArray[0].geometry.getCoordinates();
                    $(toInput).val(coordinat);
                    console.log(coordinat);
                }
            });
        });
    }
}

И еще вопрос, если делать так, то разумно, ведь надо будет каждый запрос надо отправлять на api, что лучше получать данные из бд, и в бд хранить координаты и улицу
  • Вопрос задан
  • 253 просмотра
Решения вопроса 1
@micronull
Есть несколько способов.
1. При создании записи сразу сохранять данные адреса, предварительно получив их из API Яндекса или другого сервиса.
2. Если данных адреса по координатам нет, то периодически их заполнять при выполнении некоего скрипта по задаче cron. Сам скрипт опять же обращается в API Яндекса, получает адрес и сохраняет в базу.
3. Иметь некую картографическую базу данных, в которой есть адреса и координаты. С помощью не хитрого SQL запроса можно получить адрес. Тут подойдет база ОСМ (OpenStreetMap).

В вашем случае будет правильней сопоставить 1 и 2 способ вместе. Т.е. в момент создания записи (например на html форме) запрашивать координаты у пользователя и по ним заполнять поле с адресом. Если произошла ошибка, то сохраняем только координаты, потом по крону их заполним.

Третий способ чреват тем, что база ОСМ очень большая и далеко не все данные правильны. Зато это бесплатно. API Яндекса при большом количестве запросов блокируется и требует денег.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы