使用googleapis检测地理位置,并使用jQuery从openweathermap接收此位置的当前天气
我试图获取当前位置并获取该位置的当前天气。
这是我的 jQuery:
$(document).ready(function(){
function getCity(position) {
function getPosition() {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(getCity);
} else {
alert("Geolocation is not supported by this browser.");
}
}
var url = "https://maps.googleapis.com/maps/api/geocode/json? latlng=" + position.coords.latitude + "," + position.coords.longitude;
var city,
country;
$.getJSON(url, function(response) {
city = response.results[0].address_components[2].short_name;
country = response.results[0].address_components[5].short_name;
$('.yourLocationGoesHere').attr('value', city + ", " + country);
});
// Get weather by your location
var celsius, fahrenheit, iconCode, iconUrl;
$.getJSON("http://api.openweathermap.org/data/2.5/weather?q=" + city + "&APPID=7f5806c8f3fd28b03e2d6580a50732d6", function (data) {
celsius = Math.round(data.main.temp - 273.15);
fahrenheit = Math.round(9/5 * (data.main.temp - 273) + 32);
iconCode = data.weather[0].icon;
iconUrl = "http://openweathermap.org/img/w/" + iconCode + ".png";
$(".icon").html("<img src='" + iconUrl + "'>");
$(':radio').change(function(){
// "this" will be the checked radio element
if (this.id === 'celsius'){
$(".showDegree").html(celsius + "°C");
}else{
$(".showDegree").html(fahrenheit + "°F");
}
});
});
}
});
我做错了什么。请帮忙。
答案 0 :(得分:1)
您必须始终了解变量可用性。如果你在(回调)函数中定义它们,你将无法在它之外访问它们(我的意思是celsius fahrenheit iconCode
和iconUrl
)。
因此,您可以在函数之前定义它们,就像使用city
和country
一样,或者将使用它们的代码放在同一个函数中。
另外请记住,如果您选择第一个解决方案,则在服务器响应之后执行回调函数,这需要一些时间,因此无论如何变量都不会立即可用。因此,在这种情况下,您应该在回调函数中处理传入的数据。
答案 1 :(得分:1)
你去吧:
$(document).ready(function(){
//Check geolocation success
if (navigator.geolocation) {
console.log('Geolocation API success')
// Geolocation API not supported by current browser
} else {
console.log('Geolocation API is not supported by your browser')
};
});
// Get latitude and longitude
navigator.geolocation.getCurrentPosition(function(position){
var lat = position.coords.latitude;
var long = position.coords.longitude;
console.log("Your latitude is: " + lat + " and your longitude is: " + long);
// Get formatted address using reverse geocoding for latitude/longitude
$.getJSON('https://maps.googleapis.com/maps/api/geocode/json?latlng=' + lat + ',' + long + '&key=AIzaSyCJw0QfJXXleECtFD5031OMG75lZMiC6dY', function(response){
$('.yourLocationGoesHere').text(response.results[7].formatted_address);
})
$.getJSON('',)
});
答案 2 :(得分:0)
让我们尝试一下,我希望这是通过使用地理定位和Openweather API获取当前天气的更好解决方案。只需传递您的OpenWeather API密钥,您将获得一个JSON数组,获取您的位置和当前天气。而且,您还可以使用所需的天气图标。
let loc = document.getElementById("location");
let tempIcon = document.getElementById("temp-icon")
let tempValue = document.getElementById("temp-value");
let tempUnit = document.getElementById("temp-unit");
let climate = document.getElementById("climate");
let iconFile;
window.addEventListener("load", () => {
let long;
let lat;
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition((position) => {
long = position.coords.longitude;
lat = position.coords.latitude;
const proxy = "https://cors-anywhere.herokuapp.com/";
const api = `${proxy}http://api.openweathermap.org/data/2.5/weather?lat=${lat}&lon=${long}&appid=Your OpenWeather API KEy`;
fetch(api)
.then((response) => {
return response.json();
})
.then((data) => {
console.log(data);
const { name } = data;
const { feels_like, temp, temp_max, temp_min } = data.main;
const { id, icon, main } = data.weather[0];
tempValue.textContent = Math.round(feels_like - 273);
loc.textContent = name;
climate.textContent = main;
if (id<250){
tempIcon.src = './icons/storm.svg' ;
}
else if (id<350){
tempIcon.src = './icons/drizzle.svg' ;
}
else if (id<550){
tempIcon.src = './icons/rain.svg' ;
}
else if (id<650){
tempIcon.src = './icons/snow.svg' ;
}
else if (id<800){
tempIcon.src = './icons/atmosphere.svg' ;
}
else if (id===800){
tempIcon.src = './icons/sun.svg' ;
}
else if(id>800){
tempIcon.src = './icons/clouds.svg' ;
}
console.log(
Math.round(temp - 273),
Math.round(temp_max - 273),
Math.round(temp_min - 273)
);
console.log(name);
});
});
}
});