【问题标题】:How to make google maps api get user's current location to be stored it in the database?如何让谷歌地图 api 获取用户的当前位置并将其存储在数据库中?
【发布时间】:2018-02-16 15:07:27
【问题描述】:

我已经实现了一个关于如何让用户在地图上选择位置并将其存储在数据库中的教程,来自google maps API

但是,似乎有一个我无法解决的问题,地图没有获取用户的当前位置,它只提供了要在代码中定义的给定坐标。例如本教程定义了加利福尼亚的地图坐标:

var map;
      var marker;
      var infowindow;
      var messagewindow;

      function initMap() {
        var california = {lat: 37.4419, lng: -122.1419};
        map = new google.maps.Map(document.getElementById('map'), {
          center: california,
          zoom: 13
        });

        infowindow = new google.maps.InfoWindow({
          content: document.getElementById('form')
        });

        messagewindow = new google.maps.InfoWindow({
          content: document.getElementById('message')
        });

        google.maps.event.addListener(map, 'click', function(event) {
          marker = new google.maps.Marker({
            position: event.latLng,
            map: map
          });


          google.maps.event.addListener(marker, 'click', function() {
            infowindow.open(map, marker);
          });
        });
      }

      function saveData() {
        var name = escape(document.getElementById('name').value);
        var address = escape(document.getElementById('address').value);
        var type = document.getElementById('type').value;
        var latlng = marker.getPosition();
        var url = 'phpsqlinfo_addrow.php?name=' + name + '&address=' + address +
                  '&type=' + type + '&lat=' + latlng.lat() + '&lng=' + latlng.lng();

        downloadUrl(url, function(data, responseCode) {

          if (responseCode == 200 && data.length <= 1) {
            infowindow.close();
            messagewindow.open(map, marker);
          }
        });
      }

      function downloadUrl(url, callback) {
        var request = window.ActiveXObject ?
            new ActiveXObject('Microsoft.XMLHTTP') :
            new XMLHttpRequest;

        request.onreadystatechange = function() {
          if (request.readyState == 4) {
            request.onreadystatechange = doNothing;
            callback(request.responseText, request.status);
          }
        };

        request.open('GET', url, true);
        request.send(null);
      }

      function doNothing () {
      }

上面的代码将只显示代码中定义的坐标的地图

代码的 HTML 是:

<div id="map" height="460px" width="100%"></div>
    <div id="form">
      <table>
      <tr><td>Name:</td> <td><input type='text' id='name'/> </td> </tr>
      <tr><td>Address:</td> <td><input type='text' id='address'/> </td> </tr>
      <tr><td>Type:</td> <td><select id='type'> +
                 <option value='bar' SELECTED>bar</option>
                 <option value='restaurant'>restaurant</option>
                 </select> </td></tr>
                 <tr><td></td><td><input type='button' value='Save' onclick='saveData()'/></td></tr>
      </table>
    </div>
    <div id="message">Location saved</div>

我试图用以下函数替换它,该函数获取当前位置,但没有成功,当我运行代码时,代码停止向我显示地图:

 if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(function (p) {
        var LatLng = new google.maps.LatLng(p.coords.latitude, p.coords.longitude);
        var mapOptions = {
            center: LatLng,
            zoom: 13,
            mapTypeId: google.maps.MapTypeId.ROADMAP

        };


        var map = new google.maps.Map(document.getElementById("dvMap"), mapOptions);
        var marker = new google.maps.Marker({
            position: LatLng,
            map: map,
            title: "<div style = 'height:60px;width:200px'><b>Your location:</b><br />Latitude: " + p.coords.latitude + "<br />Longitude: " + p.coords.longitude
        });
        google.maps.event.addListener(marker, "click", function (e) {
            var infoWindow = new google.maps.InfoWindow();
            infoWindow.setContent(marker.title);
            infoWindow.open(map, marker);
        });
    });
} else {
    alert('Geo Location feature is not supported in this browser.');
}

此代码的 HTML 将是:&lt;div id="dvMap" style="width: 400px; height: 300px"&gt;&lt;/div&gt;

当然还有 API 源代码:

<script async defer
    src="https://maps.googleapis.com/maps/api/js?key=YOURAPI">
    </script>

当我分别尝试每个代码时,每个代码都会给我不同的输出,所以第一个代码会给我与谷歌教程相同的输出,其中包含城市地图。第二个代码会给我一张地图,让我知道当前的位置,但如果我试图合并两者,它将不起作用。

有人可以告诉我如何让地图在谷歌地图教程中以相同的方式运行,以及使地图直接到达用户位置的功能,这样他就可以轻松存储它而不是在地图中寻找它整个城市或国家?

【问题讨论】:

  • 第二位代码还在initMap() 中吗?如果是这样,请更新它以显示整个功能。
  • 您的浏览器是否启用了地理定位功能?如果在 getCurrentPosition() 函数中添加 alert('Hello'); 会发生什么?
  • Archer 先生/女士,我不明白您所说的第二段代码是什么意思,但我现在会用整个代码更新它。 Jaipradeesh 先生/女士这是关于跟踪和存储的,我只想存储当前位置,就像他想存储他的地址一样。 Mr/Ms Upsidown 是的,它已启用,我按照你说的做了,它停止显示地图:|
  • 您的 HTML 代码在哪里?您应该发布所有必要的代码,以便我们能够重现问题!检查您的地图创建。在第一段代码中,地图 DIV 是 map,在第二段代码中是 dvMap,那么哪个是正确的?!

标签: javascript html google-maps-api-3


【解决方案1】:

您的代码包含几个问题,我不会在这里更正。

initMap() 函数的末尾添加它,它将使地图以您的位置为中心,而不会更改您的第一个脚本的任何其他功能。

if (navigator.geolocation) {

  navigator.geolocation.getCurrentPosition(function(p) {
    var LatLng = new google.maps.LatLng(p.coords.latitude, p.coords.longitude);

    // Set the map center on user location
    map.setCenter(LatLng);
  });

} else {
  alert('Geo Location feature is not supported in this browser.');
}

【讨论】:

    【解决方案2】:

    试试看:

       var options = {
            enableHighAccuracy: true,
            timeout: 5000,
            maximumAge: 0
        };
    
        if (navigator.geolocation) {
            navigator.geolocation.getCurrentPosition(success, error, options);
        } else {
            alert('Geo Location feature is not supported in this browser.');
        }
    
        function success(p) {
            var LatLng = new google.maps.LatLng(p.coords.latitude, p.coords.longitude);
            var mapOptions = {
                center: LatLng,
                zoom: 13,
                mapTypeId: google.maps.MapTypeId.ROADMAP
    
            };
    
    
            var map = new google.maps.Map(document.getElementById("dvMap"), mapOptions);
            var marker = new google.maps.Marker({
                position: LatLng,
                map: map,
                title: "<div style = 'height:60px;width:200px'><b>Your location:</b><br />Latitude: " + p.coords.latitude + "<br />Longitude: " + p.coords.longitude
            });
            google.maps.event.addListener(marker, "click", function (e) {
                var infoWindow = new google.maps.InfoWindow();
                infoWindow.setContent(marker.title);
                infoWindow.open(map, marker);
            });
        }
    
        function error(err) {
            alert('ERROR(' + err.code + '): ' + err.message);
        }
    

    【讨论】:

    • Ms.Toto,这是从上面的评论中请求的试用版,我删除了它,我已经更新了代码。请检查一下
    • 当你执行时:navigator.geolocation.getCurrentPosition 当询问用户是否启用当前位置时,导航器显示一个windows权限?
    • 是的,它向我显示了它要求允许此页面获取位置的窗口,然后我单击允许,因此它向我显示了包含我当前位置的地图。但是,当我将此函数用于问题中的第一个代码并运行代码时,整个地图将停止显示,并且浏览器不会要求任何内容!
    • 我更新了代码,请试一试并分享结果。
    • 一个观察:div map id 是 dvMap 还是应该是 divMap ? document.getElementById("dvMap")
    猜你喜欢
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多