标记不显示在谷歌地图上,但在控制台中没有错误

时间:2015-08-18 11:35:54

标签: javascript php json google-maps

一直在拉我的头发一段时间:尝试使用json从我的数据库中获取lat / lng值,然后使用这些值将标记输出到谷歌地图上。目前,地图显示时没有标记,控制台中没有错误。任何帮助将不胜感激!

 <script type="text/javascript">
       var map = null;

       function addMarker(lat,lng) {
             marker = new google.maps.Marker({
             position: new google.maps.LatLng(lat,lng),
             map: map,
           });
     }


      function initialize() {
      var mapOptions = {
      center: {lat: 54.872128, lng: - 6.284874},
      zoom: 13
     };
    map = new google.maps.Map(document.getElementById('map-canvas'),
    mapOptions);

   $(document).ready(function(){

   $.getJSON('MarkersController.php', function(data){


         var locations = JSON.parse(data);

         for(var i =0; i<locations.length; i++){
               addMarker(locations['lat'], locations['lng']);
      }
});
});


}

 google.maps.event.addDomListener(window, 'load', initialize);

用于从mysql中检索的php脚本:

<?php

include('DB_INFO.php');

// Opens a connection to a MySQL server.

$connection = mysqli_connect($server, $username, $password);

if (!$connection) {
    die('Not connected : ' . mysqli_error());
}
// Sets the active MySQL database.
$db_selected = mysqli_select_db($database, $connection);

if (!$db_selected) {
    die('Can\'t use db : ' . mysqli_error());
}

// Selects all the rows in the markers table.
$query = 'SELECT * FROM tester';
$result = mysqli_query($query);

if (!$result) {
    die('Invalid query: '. mysqli_error());
}

$list = array();
while ($row = mysqli_fetch_assoc($result)) {
    $list[] = $row;
}
header('Content-Type: application/json');
echo json_encode($list);
?>

4 个答案:

答案 0 :(得分:11)

如果你有一个标记集合,我认为你应该使用这种方式迭代集合并赋予i元素:

for(var i =0; i<locations.length; i++){
  addMarker(locations[i].lat, locations[i].lng);
}

proof of concept fiddle

答案 1 :(得分:7)

您可以尝试更改为以下内容。

while ($row = mysqli_fetch_assoc($result)) {
    //Assuming "lat" is column name in tester table. Please change it if required.
    $lat= $rows['lat'];

    //Assuming "lng" is column name in tester table. Please change it if required.
    $lng= $rows['lng'];

    $list[] = array('lat' => $lat, 'lng' => $lng);
}

答案 2 :(得分:7)

我使用原型制作了这个,代码更清晰。一个例子(你正在使用jquery):

创建3个脚本:

  1. 地图脚本
  2. JSONParser脚本
  3. 主要脚本
  4. 首先创建用于使用谷歌地图的原型函数:

     var MapUtil = (function($) {
    
        var mapProp = {
            center: new google.maps.LatLng(-38.4529181, -63.5989206),
            zoom: 4,
            mapTypeId: google.maps.MapTypeId.ROADMAP
        };
    
        /**
         * @returns
         * Maps options for create a google map
         */
        function getMapProperties() {
            return mapProp;
        }
    
        /**
         * Create simple marker
         * @param lat
         * Latitude for the marker
         * @param lng
         * Longitude for the marker
         * @param myMap
         * Actual map
         * @returns
         * Return a new google map marker
         */
         function simpleMarker(lat, lng, myMap) {
             var marker = new google.maps.Marker({
                 //add the marker options
                 position: new google.maps.LatLng(lat, lng),
                 draggable:true,
                 animation: google.maps.Animation.DROP,
                 map: myMap,
             });
    
            return marker;
         }
    
        return {
            getMapProperties: getMapProperties,
            simpleMarker: simpleMarker,
        };
    
    })(jQuery);
    

    然后创建JSONParser以将JSON转换为javascript对象:

    var JSONParser = (function($){
    
        /**
         * @return An array with the markers parsed
         */
        function getMarkers(json) {
            var markers = [];
            for (int i = 0; i < json.length; i++) {
                markers.push({json[i].lat,json[i].lng});
            }
    
            return markers;
        }
    
        return {
            getMarkers : getMarkers,
        };
    
    })(jQuery);
    

    你的主要剧本:

    $(document).ready(function() {
        var myMap = null;
    
        //add the map to the page
        google.maps.event.addDomListener(window, 'load', initialize);
    
        /**
         * Init Google Maps
         */
        function initialize() {
            var map=new google.maps.Map(document.getElementById("googleMap"), 
                    MapUtil.getMapProperties());
            myMap = map;
    
            createMarkers();
        }
    
        function createMarkers() {
            //retrieve the information
            $.ajax({             
                type: 'post',
                url: 'MarkersController.php',
                data: {},
                success: function (data) {
                    var json= $.parseJSON(data);
                    var markers = JSONParser.getMarkers(json);
    
                    for (var i = 0; i < markers.length; i++) {
                        MapUtil.simpleMarker(marker[i].lat, marker[i].lng, myMap);
                    }
                }
            });
        }
    });
    

    然后按以下顺序将脚本添加到html:

    <script src="...path.../map-utils.js"></script>
    <script src="...path.../json-pareser.js"></script>
    <script src="...path.../main.js"></script>
    

    关于地图或json的其他功能,请添加额外的方法!

答案 3 :(得分:1)

你想使用这样的东西:

google.maps.event.addListenerOnce(map, 'idle', function(){
  // Code Here..but jquery might load first or last.. see below.
});

如果我没弄错的话,你的DOM已准备好在你的地图之前。 我通常创建一个被调用两次的函数,第二次调用它加载JS ...所以第一次调用通常是jQuery,第二次是映射就绪..然后在那里运行任何与地图相关的代码。

我如何做的例子..用非常基本的术语......

var iLoadPoints = 0;
function mapReady() {
    if (iLoadPoints==2) {   // Map & jQuery Ready To Use
        // RUN CODE HERE... At this point, run the getJSON and so on...
    } else {    // Loader Not Ready... Escape function and ignore until next call
        return false;
    }
}

$(function() {
    iLoadPoints += 1;
    mapReady();
});
google.maps.event.addListenerOnce(map, 'idle', function(){
    iLoadPoints += 1;
    mapReady();
});

我假设如果你回调lat / long到控制台你得到它们......就像数据确实存在一样。

编辑:同样建议并且注意到,循环确实需要使用i变量来选择循环中的当前项目,如scaisEdge所示/

for(var i =0; i<locations.length; i++){
    addMarker(locations[i].lat, locations[i].lng);
}

从您的评论中修改:我相信更像这样......

var iLoadPoints =0; 
function mapReady(){ 
    if(iLoadPoints === 2){
        initialize(); 
    }else {
        return false;
    }
} 
google.maps.event.addListenerOnce(map, 'idle', function(){ 
    iLoadPoints+=1; 
    mapReady(); 
}); 
google.maps.event.addDomListener(window, 'load', function(){
    iLoadPoints+=1; 
    mapReady(); 
}); 

您还可以将mapReady缩短为更像......

function mapReady(){ 
    if(iLoadPoints === 2) initialize(); 
} 

整个想法是mapReady是一个简单的捕获...你可以将if语句添加到初始化函数..同样的效果,整个概念是你需要等待两个不同的定时Ready事件,它可以用两个布尔或其他方法..

在过去的测试中,如果我从我的localhost加载一个网站,并有类似google地图的东西..本地jQuery将是即时的,gmaps将始终落后......所以有时我会遇到无法加载已经配置的/数据驱动的地图。

或者更多......仅此一点应该有效..

var iLoadPoints =0; 
google.maps.event.addListenerOnce(map, 'idle', function(){ 
    iLoadPoints+=1; 
    if (iLoadPoints===2) initialize(); 
}); 
google.maps.event.addDomListener(window, 'load', function(){
    iLoadPoints+=1; 
    if (iLoadPoints===2) initialize(); 
});