2017-08-10 150 views
1

我正在尝试根据该人的位置自动更改坐标。因此,我使用DarkSky的经纬度API,并试图在Google的反向地理编码代码中使用这些坐标,以使其返回用户可以看到的地址。目前,用户只能看到坐标。我已经能够成功查询国家,但无法获取地址。出于这个原因,我正在采取不同的方法,以便我可以找到用户所在的国家和地址。我如何使用Google的反向地理编码来分发地址?我提供了一个链接到我的codepen(其中有插件)从Google的反向地址解析中获取地址

https://codepen.io/baquino1994/pen/ayJOod?editors=1010

HTML

<head> 
    <meta charset ="utf-8" /> 
    <meta name = "viewport" content ="width=device-width, intitial-scale = 1"/> 
    <link rel = "stylesheet" href ="style.css"/> 
    <link rel = "http://ipinfo.io"/> 
    <title>Weather</title> 
    <link href="https://fonts.googleapis.com/css?family=Monoton" rel="stylesheet"> 
    <script src = https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js></script> 
</head> 



<body> 
<header> 
    <h1><div id="minutely"></div></h1> 
<h2><div id="location"></div></h2> 
</header> 
    <p><span id="city"</span></p> 


    <p> <span id="country"></span></p> 
    <div id="temp" id="tempunit"></div> 
    <button class="btn btn-primary" id="BT1">Change Metric</button> 

</body> 

JS

function weather(){ 
    function success(position){ 
     var latitude = position.coords.latitude; 
    var longitude= position.coords.longitude; 
     // location.innerHTML = "Latitude:" + latitude+"°"+ "Longitude: " + longitude+'°'; 
     var theUrl = url +apiKey + "/"+ latitude+","+ longitude +"?callback=?"; 

    $.getJSON(theUrl, function(data){ 
     $("#temp").html(data.currently.temperature) 
$("#minutely").html(data.minutely.summary) 


    $.ajax({ 
     url:'https://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-73.961452&key=AIzaSyBpiTf5uzEtJsKXReoOKXYw4RO0ayT2Opc', dataType: 'json', 
    success: function(results){ 
     $("#city").text(results.results[3].address_components[4].long_name) 
    $("#country").text(results.results[0].address_components[3].types) 

    } 


} 




    )} 
      ); 


    function initMap() { 
    var map = new google.maps.Map(document.getElementById('map'), { 
    zoom: 8, 
    center: {lat: 40.731, lng: -73.997} 
    }); 
    var geocoder = new google.maps.Geocoder; 
    var infowindow = new google.maps.InfoWindow; 

    document.getElementById('submit').addEventListener('click', function() { 
    geocodeLatLng(geocoder, map, infowindow); 
    }); 
} 

function geocodeLatLng(geocoder, map, infowindow) { 
    var input = document.getElementById('latlng').value; 
    var latlngStr = input.split(',', 2); 
    var latlng = {lat: parseFloat(latlngStr[0]), lng: parseFloat(latlngStr[1])}; 
    geocoder.geocode({'location': latlng}, function(results, status) { 
    if (status === 'OK') { 
     if (results[0]) { 
     map.setZoom(11); 
     var marker = new google.maps.Marker({ 
      position: latlng, 
      map: map 
     }); 
     infowindow.setContent(results[0].formatted_address); 
     infowindow.open(map, marker); 
     } else { 
     window.alert('No results found'); 
     } 
    } else { 
     window.alert('Geocoder failed due to: ' + status); 
    } 
    }); 
} 




    } 


var location = document.getElementById("location"); 
var apiKey = "3827754c14ed9dd9c84afdc4fc05a1b3"; 
var url = "https://api.darksky.net/forecast/"; 
navigator.geolocation.getCurrentPosition(success); 
// location.innerHTML = "Locating..."; 

    } 
$(document).ready(function(){ 
weather(); 
}); 

回答

1

欢迎计算器!
第一条经验法则永远不会发布包含您项目关键信息的代码,例如上面提到的apiKey
从我的理解,似乎想从响应如下(JSON对象)通过反向地理编码返回,提取的国家和城市是包含结果对象中address_components阵列的结构
enter image description here

要提取所需的信息我建议你迭代address_components数组并检查types[0]。从google docs

  1. 国家表示国家政治实体,且通常 由地理编码器所返回的订单类型。
  2. administrative_area_level_1表示低于国家一级的一阶民事实体 。通常这是状态
  3. 地点表示一个合并的城市或城镇政治实体。

在你的代码中,我看到:

$("#city").text(results.results[3].address_components[4].long_name) 
$("#country").text(results.results[0].address_components[3].types) 

与城市和国家替换此如上所述,我认为你是好去:)

希望这有助于!