用户共享GEOlocation不适用于Google地方

时间:2012-12-01 13:35:59

标签: javascript html5 geolocation google-places-api google-places

我不知道如何在SO中搜索这个,所以我问了一个新问题。可能导致什么或我的代码的具体问题是什么:Javascript(createElement()appendChild)生成的HTML没有在Opera和Firefox中显示,但它在Chromium中有效。

HTML生成代码:

function typesOfPlaces(map, bounds) {
  var allowedTypes = [
    "amusement_park",
    "aquarium",
    "art_gallery",
    "cemetery",
    "church",
    "city_hall",
    "hindu_temple",
    "mosque",
    "museum",
    "night_club",
    "park",
    "place_of_worship",
    "rv_park",
    "spa",
    "synagogue",
    "travel_agency",
    "zoo"
  ];
  var typesToDisplay = new Array();
  var request =  {
    bounds: bounds,
    types: allowedTypes
  };
  var service = new google.maps.places.PlacesService(map);
  service.nearbySearch(request, function(results, status) {
    if(status == google.maps.places.PlacesServiceStatus.OK) {
      for(var i = 0; i < results.length; i++) {
        for(var j = 0; j < results[i].types.length; j++) {
          for(var k = 0; k < allowedTypes.length; k++) {
            if(results[i].types[j] == allowedTypes[k]) {
              var allowed = true;
              for(var x = 0; x < typesToDisplay.length; x++) {
                if(allowedTypes[k]==typesToDisplay[x]) {
                  allowed = false;
                }
              }
              if(allowed) {
                typesToDisplay.push(allowedTypes[k]);
              }
            }
          }
        }
      }
      var parent = document.getElementById("types");
      for(var i = 0; i < typesToDisplay.length; i++) {
        var typeBox = document.createElement("div");
        var checkBox = document.createElement("input");
        var checkID = randomString(10);
        var label = document.createElement("label");
        checkBox.setAttribute("type", "checkbox");
        checkBox.setAttribute("id", checkID);
        label.setAttribute("for", checkID);
        label.innerHTML = typesToDisplay[i];
        typeBox.appendChild(checkBox);
        typeBox.appendChild(label);
        parent.appendChild(typeBox);
      }
    }
  });
}//END OF Function

更新评论

randomString只是用于生成随机字符串的SO代码:

function randomString(L) {
  var s= '';
  var randomchar=function() {
    var n= Math.floor(Math.random()*62);
    if(n<10) return n; //1-10
    if(n<36) return String.fromCharCode(n+55); //A-Z
    return String.fromCharCode(n+61); //a-z
  }
  while(s.length< L) s+= randomchar();
  return s;
}

div #types确实存在,它看起来像这样:

<html>
  <head>
    ...
    <script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?key=MyKey&sensor=false&libraries=places&language=lt"></script>
  </head>
  <body>
    <div>
      <div>
        <div id="types"></div>
      </div>
    </div>
  </body>
</html>

您可以通过查看<head>标记的<script>部分来查看google.maps.places.PlacesService的导入,其中您可以看到“&amp; libraries = places”。

某些测试后的第二次更新

确定。我已经发现,如果我拒绝在歌剧中的位置共享它是有效的(它在铬中起作用,因为默认它甚至不会问用户他是否善意与网站分享他的地理位置)

地理位置代码:

function initGeo()
{
    if (navigator.geolocation)
    {
        navigator.geolocation.getCurrentPosition(successFunction, errorFunction);
    }
    else
    {
        errorFunction();
    }
}

所以,不起作用的功能是successFunction(如果用户友好地分享他的地理位置,则会启动)

function successFunction(position)
{
    var geocoder = new google.maps.Geocoder();
    var abstract_location;
    var latlng = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
    geocoder.geocode({'latLng': latlng}, function(results, status) 
    {
        if (status == google.maps.GeocoderStatus.OK) 
        {
            abstract_location = new google.maps.LatLngBounds(
                results[0].geometry.viewport.getSouthWest(), 
                results[0].geometry.viewport.getNorthEast());
        }
        else
        {
            alert("NOT SUCCESS 1");
        }
        showGMap(latlng, abstract_location);
    });
}

errorFunction,默认情况下成功处理chrome,如果拒绝访问地理位置,则在Opera上成功运行:

function errorFunction(error)
{
    var geocoder = new google.maps.Geocoder();
    if(google.loader.ClientLocation)
    {
        var latlng = new google.maps.LatLng(google.loader.ClientLocation.latitude, google.loader.ClientLocation.longitude);
        geocoder.geocode({'latLng': latlng}, function(results, status) 
        {
            if (status == google.maps.GeocoderStatus.OK) 
            {
                var abstract_location = new google.maps.LatLngBounds(
                    results[0].geometry.viewport.getSouthWest(), 
                    results[0].geometry.viewport.getNorthEast());
            }
            else
            {
                alert("NOT SUCCESS 2");
            }
            showGMap(latlng, abstract_location);
        });
    }
    else
    {
        geocoder.geocode( {'address': 'Vilnius Region, Lithuania'}, function(results, status) 
        {
            if (status == google.maps.GeocoderStatus.OK) 
            {
                var latlng = results[0].geometry.location;
                var abstract_location = new google.maps.LatLngBounds(
                    results[0].geometry.viewport.getSouthWest(), 
                    results[0].geometry.viewport.getNorthEast());
                showGMap(latlng, abstract_location);
            }
            else
            {
                alert("NOT SUCCESS 3");
            }
        });
    }
}

Nor Chromium和Opera不会给我任何错误,也不会给我一般的错误,也不会给我带来任何错误。

所以问题在于成功的功能。因为它甚至没有给我提醒(typesToDisplay.length)[正如Stuart在评论中所建议的] - 这意味着根本没有警报 - 如果出现错误,我会得到aswer 4,因此我可以看到我的生成HTML。

如果成功,则只有空(没有任何附加的孩子)#types。

我没有看到导致成功功能的原因是NOTSUCCESS(:))

1 个答案:

答案 0 :(得分:0)

好的,所以我已经弄明白了 - 虽然很简单......

你得到的地理位置数据是一个地址,所以界限非常小,你必须用反向地理编码提取城市(结果[6] .formatted_address),然后你对反向地理编码进行地理编码(如此混淆,虽然地理编码 - &gt;反转 - >再次地理编码)然后它可以工作!

所以问题在于地理编码(没想到地址的边界不是整个城市(首先应该是显而易见的,但事实并非如此)。

HTML5地理编码可能有关于城市的信息(不仅是lan和lng,firefox有东西,但那只是firefox,而不是整个HTML5),但我不知道它是否好(缺乏我的在这个特定领域的个人知识)

所以如果有人做了类似的事情 - &gt; 检查界限;)

感谢您,感谢您的评论和观点。