Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

'Uncaught InvalidValueError' (: setCenter: not a LatLng or LatLngLiteral object)

I'm starting to know PHP and JavaScript, mixing them in HTML and using Google Maps API (version 3).

I figured how to 'put' various markers but the console will throw me an error:

" Uncaught InvalidValueError: setCenter: not a LatLng or LatLngLiteral object ".

I think it's because the var created in the loop is not exactly the object needed but instead a string, though this confuses me, I don't know if I'm right.

This is my code: (By the way, the array I'm looping is an array with an array with an array, here's some of it. It follows the pattern, there are in total 6 'places'):

$locations = array(
        array(
            'Location' => array(
                'Title'=>'Place',
                'Description'=>'Some Place',
                'Image'=>'pin1.png',
                'Latitude'=>'20.681775',
                'Longitude'=>'-103.351479'
            )
        ),…

(It continues…).

<!DOCTYPE html>
<html>
  <head>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
    <style type="text/css">
      html { height: 100% }
      body { height: 100%; margin: 0; padding: 0 }
      #map-canvas { height: 100% }
    </style>    

        <script type="text/javascript"
          src="https://maps.googleapis.com/maps/api/js?AIzaSyBVfO8LckdOHAot1a8rZW0bmJIoWO2A3os=API_KEY&sensor=true">
        </script>


      <script type="text/javascript">
      function initialize() {
        var mapOptions = {
          center: (20.68177501, -103.3514794),
          zoom: 15,
          mapTypeId: google.maps.MapTypeId.ROADMAP
        };
        var map = new google.maps.Map(document.getElementById("map-canvas"),
            mapOptions);

        // To add the marker to the map, use the 'map' property
        <?php $i = 0; ?>
        <?php foreach($locations as $key => $value): ?>
                <?php foreach($value as $key => $value): ?>
                    <?php foreach($value as $key => $value): ?>
                        <?php if($key == "Latitude"): ?>
                            <?php $myLatLng = "$value, "; endif;?>
                        <?php if($key == "Longitude"): ?>
                            <?php $myLatLng .="$value"; ?>

        var myLatlng<?php echo $i; ?> = new google.maps.LatLng(<?php echo $myLatLng; ?>);
        var marker<?php echo $i; ?> = new google.maps.Marker({
        position: (myLatlng<?php echo $i; ?>),
        title:"Hello World!"
        });
        marker<?php echo $i; ?>.setMap(map); 

                            <?php $i++; ?>
                        <?php endif; ?>
                    <?php endforeach; ?>
                <?php endforeach; ?>
        <?php endforeach; ?>
      }
      google.maps.event.addDomListener(window, 'load', initialize);
    </script>


  </head>
  <body>
    <div id="map-canvas"/>
  </body>
</html>

And here's a screenshot of that var assigning part:

enter image description here

like image 307
James Avatar asked Nov 15 '13 07:11

James


2 Answers

You are initializing mapOptions in wrong way.

Initialize it in following way..

var mapOptions = {
          center: new google.maps.LatLng(20.68177501, -103.3514794),
          zoom: 15,
          mapTypeId: google.maps.MapTypeId.ROADMAP
        };

Instead of...

var mapOptions = {
          center: (20.68177501, -103.3514794), //this is not correct
          zoom: 15,
          mapTypeId: google.maps.MapTypeId.ROADMAP
        };

Following is corrected code...

<!DOCTYPE html>
<html>
  <head>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
    <style type="text/css">
      html { height: 100% }
      body { height: 100%; margin: 0; padding: 0 }
      #map-canvas { height: 100% }
    </style>    

        <script type="text/javascript"
          src="https://maps.googleapis.com/maps/api/js?AIzaSyBVfO8LckdOHAot1a8rZW0bmJIoWO2A3os=API_KEY&sensor=true">
        </script>


      <script type="text/javascript">
      function initialize() {
        var mapOptions = {
          center: new google.maps.LatLng(20.68177501, -103.3514794),
          zoom: 15,
          mapTypeId: google.maps.MapTypeId.ROADMAP
        };
        var map = new google.maps.Map(document.getElementById("map-canvas"),
            mapOptions);

        // To add the marker to the map, use the 'map' property
        <?php $i = 0; ?>
        <?php foreach($locations as $key => $value): ?>
                <?php foreach($value as $key => $value): ?>
                    <?php foreach($value as $key => $value): ?>
                        <?php if($key == "Latitude"): ?>
                            <?php $myLatLng = "$value, "; endif;?>
                        <?php if($key == "Longitude"): ?>
                            <?php $myLatLng .="$value"; ?>

        var myLatlng<?php echo $i; ?> = new google.maps.LatLng(<?php echo $myLatLng; ?>);
        var marker<?php echo $i; ?> = new google.maps.Marker({
        position: (myLatlng<?php echo $i; ?>),
        title:"Hello World!"
        });
        marker<?php echo $i; ?>.setMap(map); 

                            <?php $i++; ?>
                        <?php endif; ?>
                    <?php endforeach; ?>
                <?php endforeach; ?>
        <?php endforeach; ?>
      }
      google.maps.event.addDomListener(window, 'load', initialize);
    </script>


  </head>
  <body>
    <div id="map-canvas"/>
  </body>
</html>
like image 71
nik Avatar answered Jan 04 '23 08:01

nik


It is also worth noting that Google Maps v3 doesn't appear to sanitize the data values for setting markers. This seems to have changed in the last few weeks, because previously I was passing in icon height as a string for google's MarkerImage function (it is coming from JSON). But that suddenly broke because it wasn't a "number".

Obviously the solution is to pass in a number, or wrap your data in parseInt() or parseFloat() so that the API gets a number or float. Google "should" be sanitizing it's data but it isn't.

var custom_icon = new google.maps.MarkerImage(
    icon_path,
    new google.maps.Size(
        parseInt(icon_options.width),
        parseInt(icon_options.height)
    ),
    new google.maps.Point(
        parseFloat(icon_options.origin_x),
        parseFloat(icon_options.origin_y)
    ),
    new google.maps.Point(
        parseFloat(icon_options.anchor_x),
        parseFloat(icon_options.anchor_y)
    )
);
like image 20
Chadwick Meyer Avatar answered Jan 04 '23 09:01

Chadwick Meyer