/ Scripts & jquery / Автоматическое определение координат по адресу

Автоматическое определение координат по адресу

HIT

01.03.2021

1823

В данном решении используется сервис geocode-maps.yandex.ru.

Функция определения координат по адресу

function get_geolocation($address){

	$geocode = my_url_encode($address);
	$key     = 'yandex-api-key';

	$response = json_decode(file_get_contents('https://geocode-maps.yandex.ru/1.x/?apikey='.$key.'&geocode='.$geocode.'&results=1&format=json'));
 
	if ($response->response->GeoObjectCollection->metaDataProperty->GeocoderResponseMetaData->found > 0) {
		$position = $response->response->GeoObjectCollection->featureMember[0]->GeoObject->Point->pos;
		$position_array = explode(" ", $position);
		return $position_array[1].','.$position_array[0];
	} else { return 'Ничего не найдено'; }
}

// Функция кодировки символов
function my_url_encode($s){
$s= strtr ($s, array (" "=> "%20", "а"=>"%D0%B0", "А"=>"%D0%90","б"=>"%D0%B1", "Б"=>"%D0%91", "в"=>"%D0%B2", "В"=>"%D0%92", "г"=>"%D0%B3", "Г"=>"%D0%93", "д"=>"%D0%B4", "Д"=>"%D0%94", "е"=>"%D0%B5", "Е"=>"%D0%95", "ё"=>"%D1%91", "Ё"=>"%D0%81", "ж"=>"%D0%B6", "Ж"=>"%D0%96", "з"=>"%D0%B7", "З"=>"%D0%97", "и"=>"%D0%B8", "И"=>"%D0%98", "й"=>"%D0%B9", "Й"=>"%D0%99", "к"=>"%D0%BA", "К"=>"%D0%9A", "л"=>"%D0%BB", "Л"=>"%D0%9B", "м"=>"%D0%BC", "М"=>"%D0%9C", "н"=>"%D0%BD", "Н"=>"%D0%9D", "о"=>"%D0%BE", "О"=>"%D0%9E", "п"=>"%D0%BF", "П"=>"%D0%9F", "р"=>"%D1%80", "Р"=>"%D0%A0", "с"=>"%D1%81", "С"=>"%D0%A1", "т"=>"%D1%82", "Т"=>"%D0%A2", "у"=>"%D1%83", "У"=>"%D0%A3", "ф"=>"%D1%84", "Ф"=>"%D0%A4", "х"=>"%D1%85", "Х"=>"%D0%A5", "ц"=>"%D1%86", "Ц"=>"%D0%A6", "ч"=>"%D1%87", "Ч"=>"%D0%A7", "ш"=>"%D1%88", "Ш"=>"%D0%A8", "щ"=>"%D1%89", "Щ"=>"%D0%A9", "ъ"=>"%D1%8A", "Ъ"=>"%D0%AA", "ы"=>"%D1%8B", "Ы"=>"%D0%AB", "ь"=>"%D1%8C", "Ь"=>"%D0%AC", "э"=>"%D1%8D", "Э"=>"%D0%AD", "ю"=>"%D1%8E", "Ю"=>"%D0%AE", "я"=>"%D1%8F", "Я"=>"%D0%AF"));
return $s;
}

// Функция кодировки символов
function my_url_decode($s){
$s= strtr ($s, array ("%20"=>" ", "%D0%B0"=>"а", "%D0%90"=>"А", "%D0%B1"=>"б", "%D0%91"=>"Б", "%D0%B2"=>"в", "%D0%92"=>"В", "%D0%B3"=>"г", "%D0%93"=>"Г", "%D0%B4"=>"д", "%D0%94"=>"Д", "%D0%B5"=>"е", "%D0%95"=>"Е", "%D1%91"=>"ё", "%D0%81"=>"Ё", "%D0%B6"=>"ж", "%D0%96"=>"Ж", "%D0%B7"=>"з", "%D0%97"=>"З", "%D0%B8"=>"и", "%D0%98"=>"И", "%D0%B9"=>"й", "%D0%99"=>"Й", "%D0%BA"=>"к", "%D0%9A"=>"К", "%D0%BB"=>"л", "%D0%9B"=>"Л", "%D0%BC"=>"м", "%D0%9C"=>"М", "%D0%BD"=>"н", "%D0%9D"=>"Н", "%D0%BE"=>"о", "%D0%9E"=>"О", "%D0%BF"=>"п", "%D0%9F"=>"П", "%D1%80"=>"р", "%D0%A0"=>"Р", "%D1%81"=>"с", "%D0%A1"=>"С", "%D1%82"=>"т", "%D0%A2"=>"Т", "%D1%83"=>"у", "%D0%A3"=>"У", "%D1%84"=>"ф", "%D0%A4"=>"Ф", "%D1%85"=>"х", "%D0%A5"=>"Х", "%D1%86"=>"ц", "%D0%A6"=>"Ц", "%D1%87"=>"ч", "%D0%A7"=>"Ч", "%D1%88"=>"ш", "%D0%A8"=>"Ш", "%D1%89"=>"щ", "%D0%A9"=>"Щ", "%D1%8A"=>"ъ", "%D0%AA"=>"Ъ", "%D1%8B"=>"ы", "%D0%AB"=>"Ы", "%D1%8C"=>"ь", "%D0%AC"=>"Ь", "%D1%8D"=>"э", "%D0%AD"=>"Э", "%D1%8E"=>"ю", "%D0%AE"=>"Ю", "%D1%8F"=>"я", "%D0%AF"=>"Я"));
return $s;
}

my_url_encode, my_url_decode — вспомогательные функции по кодировке/декодировке символов для правильного url-запроса.

Использование функции

<?php echo get_geolocation('352332 Краснодарский край, г. Усть-Лабинск, ул. Заполотняная, 19 В') ?>

Ajax-функция определения координат

Добавим функцию подключения скрипта, и немного изменим саму функцию определения координат. my_url_encode также используем.

add_action('wp_print_scripts', 'ajax_geoload_script', 100);
function ajax_geoload_script() {

	wp_register_script('geoload_script', get_template_directory_uri(). '/js/geoload.js', array('jquery'), null, true);
	wp_enqueue_script( 'geoload_script' );

	wp_localize_script( 
		'geoload_script', 
		'geoload_vars', 
		array(
			'geoload_nonce' => wp_create_nonce( 'geoload_nonce' ),
			'geoload_ajax_url' => admin_url( 'admin-ajax.php' ),
		)
	);
}

function get_geoload(){
	
	$geocode = my_url_encode( $_POST['source'] );
	$key = 'yandex-api-key';

	$response = json_decode(file_get_contents('https://geocode-maps.yandex.ru/1.x/?apikey='.$key.'&geocode='.$geocode.'&results=1&format=json'));
 
	if ($response->response->GeoObjectCollection->metaDataProperty->GeocoderResponseMetaData->found > 0) {
		$position = $response->response->GeoObjectCollection->featureMember[0]->GeoObject->Point->pos;
		$position_array = explode(" ", $position);
		$response = $position_array[1].','.$position_array[0];
	} else { $response = 'Ничего не найдено'; }
	
    if ( defined( 'DOING_AJAX' ) && DOING_AJAX ){
        echo $response;
        wp_die();
    }
}

add_action('wp_ajax_geoload', 'get_geoload');
add_action('wp_ajax_nopriv_geoload', 'get_geoload');

Скрипт захвата адреса и передачи координат (geoload.js):

jQuery(document).ready(function($) {
	
	$('.geo-start').click( function(event) {
			
		// Prevent defualt action - opening tag page
		if (event.preventDefault) {
			event.preventDefault();
		} else {
			event.returnValue = false;
		}

		// Get tag slug from title attirbute
	    var source = $(".geo-source").val();

		data = {
			action: 'geoload',
			geoload_nonce: geoload_vars.geoload_nonce,
			source: source,
		};
	  
	  
		$.ajax({
			type: 'post',
			dataType: 'html',
			url: geoload_vars.geoload_ajax_url,
			data: data,
			success: function( data, textStatus, XMLHttpRequest ) {
				$('.geo-target').html(data);
			},
			error: function( MLHttpRequest, textStatus, errorThrown ) {
				$('.geo-target').html('Ошибка запроса');
			}
		})

	});	
  
});

Выводим во фронтенде управляющие элементы:

<input type="text" value="" class="geo-source">
<div class="btn geo-start">Найти координаты</div>
<div class="geo-target"></div>

Массовое добавление координат точкам

Должно быть заполнено метаполе адрес (address). Перебираем все записи у которых не заполнено метаполе координаты (coordinates), и используя первую функцию определения координат по полю адрес прописываем значения координат.

<?php global $post;
$args = array(
	'posts_per_page' => -1,
);

$myposts = get_posts( $args );
$i = 0;
foreach( $myposts as $post ) : setup_postdata($post);

	$coordinates = get_post_meta($post->ID, 'coordinates', 1);

	if( empty($coordinates) ) {
		$i ++;
		$address = get_post_meta($post->ID, 'address', 1);
		$location = get_geolocation($address);
		update_post_meta($post->ID, 'coordinates', $location);
		
		echo $post->post_title.'<br>';
	}

endforeach;
wp_reset_postdata();
echo '<br><br>'.$i.' обновлений'; ?>

Предпочтительно делать в виде шаблона страницы.

[site-socialshare]
  • Похожие записи
  • Комментарии
  • Вложения
Ajax форма с вложением файла

Ajax форма с вложением файла

Долго искал и нашел (здесь www.thenerdyblog.com) отличное решение — форма с вложением файла на ajax. Форма Скрипт Файл-обработчик Если нужно чтобы вложение было обязательным, то в условии else прописываем ошибку: Читать далее »

/
Избранное

Избранное

Реализуем функционал Избранное. Нам надо сделать кнопку добавить в Избранное в шаблоне самой записи и в цикле вывода записей категории. И отдельная страница Избранное где выводятся избранные записи. Плагин Favorites Читать далее »

Опросы на сайте без плагина

Опросы на сайте без плагина

Создадим функционал сбора информации (опросов) от посетителей без использования плагинов, дорабатывая нужные аспекты так как нам нужно. Как создать функционал опросов с помощью плагинов описано здесь. Создадим форму опроса для Читать далее »

Добавить комментарий

Пока нет комментариев. Будь первым!

Автоматическое определение координат по адресу
Пэйджинация
Рекомендации для васПэйджинацияOpttour.ru
Спасибо! Наш менеджер свяжется с Вами в течении 5 минут.