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

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

HIT

01.03.2021

1159

В данном решении используется сервис 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.' обновлений'; ?>

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

Поделиться в соц. сетях:

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

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

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

/
Подгрузка постов «налету» I: Скроллинг

Подгрузка постов «налету» I: Скроллинг

Добавляем на сайт функционал подгрузки постов «налету». Данная технология применяется в соц. сетях, а также крупных интернет-магазинах. В funсtion.php // Добавляем подгрузку постов function true_loadmore_scripts() { wp_enqueue_script('jquery'); // скорее всего Читать далее »

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

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

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

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

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

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