Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript geolocation.getCurrentPosition在夜间失败--如何提供自己的api密钥?_Javascript_Ruby On Rails_Google Chrome_Firefox_Geolocation - Fatal编程技术网

Javascript geolocation.getCurrentPosition在夜间失败--如何提供自己的api密钥?

Javascript geolocation.getCurrentPosition在夜间失败--如何提供自己的api密钥?,javascript,ruby-on-rails,google-chrome,firefox,geolocation,Javascript,Ruby On Rails,Google Chrome,Firefox,Geolocation,这是一个很长的问题,答案可能很短 在我的rails 5应用程序中,我使用geolocation api的这个相当基本的JS实现从浏览器获取用户位置: 更新:以下是使用geocomplete插件()的整个脚本: <script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?key=<%=ENV['GOOGLE_MAPS_API_KEY']%>&language=<%=I18n

这是一个很长的问题,答案可能很短

在我的rails 5应用程序中,我使用geolocation api的这个相当基本的JS实现从浏览器获取用户位置:


更新:以下是使用geocomplete插件()的整个脚本:

<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?key=<%=ENV['GOOGLE_MAPS_API_KEY']%>&language=<%=I18n.locale%>&libraries=places"></script>

<script>
  $(function(){
    var geolocation = null;
    var lati  = null;
    var longi = null;

    //start by drawing a default map
    nogeoloc(); 
    function nogeoloc() {
      geo(lati,longi);
      console.log("no geolocation");
    }

    // check for geolocation support
    if (window.navigator && window.navigator.geolocation) {
      geolocation = window.navigator.geolocation;
    }
    if (geolocation) {
      geolocation.getCurrentPosition(success, error, positionOptions);
    }
    var positionOptions = {
      enableHighAccuracy: true,
      timeout: 10 * 1000, // 10 seconds
    };
    //in case of user permission, center the map at user' location
    function success(position) {
      lati  = position.coords.latitude;
      longi = position.coords.longitude;
      geo(lati,longi);
      console.log("geo data obtained");
    }
    // if denied permission or error, do nothing
    function error(positionError) {
      console.log("error");
      console.log(positionError);
    }

    // map drawing using the geocomplete library
    function geo(lati,longi){
      var myloc = false;
      if(lati && longi) {
        myloc = [lati, longi];
      }
      var options = {
        map: ".map_canvas",
        mapOptions: {
          scrollwheel: true
        },
        location: myloc ,
        details: "form",
        detailsAttribute: "geocompname",
        markerOptions: {
          draggable: true
        }
      };
      $("#geocomplete").geocomplete(options);
      var geocoder = new google.maps.Geocoder();
      var map = $("#geocomplete").geocomplete("map");
      var marker = $("#geocomplete").geocomplete("marker");

      if(lati && longi) {
        map.panTo({ lat: lati, lng: longi});
        marker.setPosition({ lat: lati, lng: longi});
        $("input[geocompname=lat]").val(lati);
        $("input[geocompname=lng]").val(longi);  
        geocoder.geocode({'location': {lat: lati, lng: longi}}, function(results, status) {
          if (status == google.maps.GeocoderStatus.OK) {
            if (results[0]) {
              $("input[geocompname=formatted_address]").val(results[0].formatted_address);
            }
          }
        });
      }
      $("#geocomplete").bind("geocode:dragged", function(event, latLng){
        $("input[geocompname=lat]").val(latLng.lat());
        $("input[geocompname=lng]").val(latLng.lng());
        map.panTo(latLng);
        geocoder.geocode({'latLng': latLng }, function(results, status) {
          if (status == google.maps.GeocoderStatus.OK) {
            if (results[0]) {
              $("input[geocompname=formatted_address]").val(results[0].formatted_address);
            }
          }
        });
      });
    }
  });
</script>

$(函数(){
var geolocation=null;
var-lati=null;
var longi=null;
//从绘制默认地图开始
nogeoloc();
函数nogeoloc(){
geo(拉蒂、朗吉);
控制台日志(“无地理位置”);
}
//检查地理定位支持
if(window.navigator&&window.navigator.geolocation){
地理位置=window.navigator.geology;
}
if(地理定位){
getCurrentPosition(成功、错误、位置选项);
}
变量位置选项={
EnableHighAccurance:正确,
超时:10*1000,//10秒
};
//如果用户允许,请将地图居中放置在用户位置
功能成功(职位){
纬度=位置坐标纬度;
longi=位置坐标经度;
geo(拉蒂、朗吉);
控制台日志(“获得的地理数据”);
}
//如果拒绝许可或错误,请不要执行任何操作
功能错误(位置错误){
控制台日志(“错误”);
控制台日志(位置错误);
}
//使用geocomplete库绘制地图
地理功能(纬度、经度){
var myloc=false;
if(纬度和经度){
myloc=[lati,longi];
}
变量选项={
地图:“.map_canvas”,
地图选项:{
滚轮:对
},
地点:myloc,
详情:“表格”,
detailsAttribute:“geocompname”,
标记选项:{
德拉格布尔:是的
}
};
$(“#geocomplete”)。geocomplete(选项);
var geocoder=new google.maps.geocoder();
var map=$(“#地理完整”).geocomplete(“地图”);
var marker=$(“#地理完整”).地理完整(“标记”);
if(纬度和经度){
panTo地图({lat:lati,lng:longi});
设置位置({lat:lati,lng:longi});
$(“输入[geocompname=lat]”)val(lati);
$(“输入[geocompname=lng]”)val(longi);
地理编码({'location':{lat:lati,lng:longi}}),函数(结果,状态){
if(status==google.maps.GeocoderStatus.OK){
如果(结果[0]){
$(“输入[geocompname=formatted_address]”)val(结果[0]。formatted_address);
}
}
});
}
$(“#geocomplete”).bind(“地理代码:拖动”,函数(事件,latLng){
$(“输入[geocompname=lat]”)val(latLng.lat());
$(“输入[geocompname=lng]”)val(latLng.lng());
panTo地图(拉丁美洲);
geocoder.geocode({'latLng':latLng},函数(结果,状态){
if(status==google.maps.GeocoderStatus.OK){
如果(结果[0]){
$(“输入[geocompname=formatted_address]”)val(结果[0]。formatted_address);
}
}
});
});
}
});

有趣的是,这个实现在白天工作正常(我在德国),但在晚上在Firefox和Chrome中都返回一个错误:)

Firefox中返回的错误代码是:
{code:2,消息:“获取位置时出现未知错误”}
,Chrome打印更多信息:
消息:“网络位置提供商位于”https://www.googleapis.com/“:返回错误代码403。”

通过谷歌搜索,结果表明403意味着已达到所提供api密钥的使用限制。这解释了为什么我的代码白天工作,晚上开始失败:)

为了测试这一点,我打开了firefox配置,并将我自己的google api密钥插入geo.wifi.uri,瞧,它工作了

现在我的问题是:

1) 这个问题出现在google自己的浏览器(Chrome)中,即使Mozilla的live示例失败(),您能指望google/Mozilla等通过增加请求限制很快解决这个问题吗

2) 请求通过站点访问者的浏览器发送。有没有办法将我自己的google密钥传递给GeolocationAPI,以便浏览器在请求中使用它而不是默认的


3) 上面的代码在我的三星s6手机的chrome浏览器中运行良好,但在使用三星互联网浏览器的同一部手机上不起作用。有什么提示吗?

您是否尝试过geolocation.watchPosition以防它起作用?

geo函数的作用是什么?您是否获得用户的位置详细信息(例如城市、地址等)?地理定位服务不应抛出错误。。我猜你正在同时使用谷歌地图或谷歌地点API。有关更多详细信息,请参见此处:。我也遇到了类似的问题,在谷歌上增加了一张信用卡,解决了我的问题(他们不向你收费,这只是证明你不是机器人,增加了你的限制……但也有付费计划)

我更新了我的问题,将整个脚本包括在内。是的,我确实使用了Places和地理编码API,但它们通过我的API密钥,工作正常。如果我让Firefox使用我的密钥,地理定位也可以很好地工作。我的问题是,如果您访问我的网站,我如何在“您的”浏览器中包含我的密钥。您也可以在@treecon answer上看到我的评论。如果firefox live示例不起作用,那么问题肯定出在地理定位服务中。watchPosition目前也不起作用,请参见两天前的工作。还要注意Firefox示例不起作用