Berkutman
@Berkutman

Как передать значения двумерного массива из БД MySQL в Google Maps API для обработки GeoCoder по имени адреса?

Имеется БД где хранятся value в столбцах form_city и form_name
form_city - город
form_name - Название учебного заведения
Необходимо передать эти значения из БД в массив js для обработки geocoder

На данный момент статически написанный массив ( С ним все работает )

var address = new Array (
    'Москва, Московский государственный университет имени М.В.Ломоносова',
    'Санкт-Петербург, Санкт-Петербургский государственный университет'
	);


Создав двумерный массив в php я попытался его передать в массив на JS

<?php
$result = db_query("SELECT value FROM webform WHERE name = 'form_name' UNION ALL SELECT value FROM webform WHERE name = 'form_city'")->fetchAllAssoc('value');
$json = json_encode($result);
?>


var address = new Array ('<?php echo $json;?>');

В ответ от geocoder я получаю за место маркеров на карте ZERO_RESULTS

По всей видимости я не правильно составляю массив

Весь код
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf8" />
<title>Жопа</title>
    <style>
      #map {
        height: 600px;
      }
    </style>
  </head>
<body>
<div id="map"></div>
<?php
$result = db_query("SELECT value FROM webform WHERE name = 'form_name' UNION ALL SELECT value FROM webform WHERE name = 'form_city'")->fetchAllAssoc('value');
$json = json_encode($result);
?>
    <script>
      var geocoder;
      var map;
	  
var address = new Array ('<?php echo $json;?>');
    
      function initMap() {
        var map = new google.maps.Map(document.getElementById('map'), {
    center: new google.maps.LatLng(61.52401, 105.31875600000001),
    zoom: 3
        });
        geocoder = new google.maps.Geocoder();
		address.forEach(n => codeAddress(n, geocoder, map));

      }
	  
	  


function codeAddress(address, geocoder, map) {
  geocoder.geocode({ address }, function(results, status) {
    if (status == google.maps.GeocoderStatus.OK) {
      var marker = new google.maps.Marker({
        map: map,
        position: results[0].geometry.location,
	title: address
      });
	  var infowindow = new google.maps.InfoWindow({
    content: address
  });
  
  marker.addListener('click', function() {
    infowindow.open(map, marker);
  });
    } 
	else {
      alert('Geocode was not successful for the following reason: ' + status);
    }
  });
}   
</script>
    <script async defer src="https://maps.googleapis.com/maps/api/js?key=API-KEY&callback=initMap">
    </script>
  </body>
</html>


P.S Может кому пригодится ещё добавил условия для обработки статусов:
else if (status === 'OVER_QUERY_LIMIT') {
          setTimeout(() => {
            codeAddress(address, geocoder, map);
          }, 1);
        }
			else if (status === 'ZERO_RESULTS') {
		console.log('STATUS ZERO BLABLABLA');
        }
  • Вопрос задан
  • 117 просмотров
Решения вопроса 1
nokimaro
@nokimaro Куратор тега PHP
<div id="map"></div>
<?php
$arr = [];
$result = db_query("SELECT sid, name, value FROM webform WHERE name IN('form_name', 'form_city')");
foreach ($result as $record)
{
    $arr[$record->sid][$record->name] = $record->value;
}

$adresses = [];
foreach($arr as $row)
{
    $adresses[] = "{$row['form_city']}, {$row['form_name']}";
}

$js_str_address_arr = json_encode(array_values($adresses));
?>
    <script>
      var geocoder;
      var map;

var address = <?php echo $js_str_address_arr;?>;

      function initMap() {
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
SaveTime Москва
от 160 000 ₽
TopHit.ru Москва
от 80 000 до 120 000 ₽
Авто-Траст Екатеринбург
от 90 000 до 130 000 ₽
02 апр. 2020, в 16:57
5000 руб./за проект
02 апр. 2020, в 16:49
15000 руб./за проект