jQuery и Google Maps JSON ответ
у меня возникли проблемы с получением информации о геолокации из Google maps api
код довольно прямолинейный
$.ajax({
type: "GET",
cache: false,
url: "http://maps.googleapis.com/maps/api/geocode/json",
dataType: "jsonp",
data: {
address: "Ljubljana " + "Slovenia",
sensor: "false"
},
jsonpCallback:'json_response',
success: function(data) {
top.console.debug(data);
$('#location_setter').dialog('close');
},
error: function() {
alert("Error.");
}
});
function json_response(data){
alert("works");
}
Я всегда получаю ошибку обратно. Я тоже пробовал напрямую (я где-то читал, что обратный вызов должен быть установлен в конце...
$.ajax({
type: "GET",
cache: true,
url: "http://maps.googleapis.com/maps/api/geocode/json?address=Ljubljana Slovenia&sensor=false",
dataType: "jsonp",
jsonpCallback:'json_response',
success: function(data) {
top.console.debug(data);
$('#location_setter').dialog('close');
},
error: function() {
alert("Error.");
}
});
url запроса правильно сформировано:
и это дает мне правильный json
пожалуйста, посоветуйте!
Вы можете "играть" с ним в http://jsfiddle.net/PNad9/
4 ответов
если это кому-то помогает... Я сдался, и я полностью меняю саму логику, и теперь она работает так, как ожидалось:
сначала я добавил Google maps js в тело
var script = document.createElement( 'script' );
script.type = 'text/javascript';
script.src = 'http://maps.google.com/maps/api/js?sensor=false&callback=get_longlat';
$("body").append( script );
Как вы можете видеть, я указал функцию обратного вызова get_longlat...
поэтому я определил эту функцию и использовал объект геокода google
function get_longlat(address){
var geocoder = new google.maps.Geocoder();
if(!address){
var p = US.get("location_postal");
var c = US.get("location_city");
var a = US.get("location_address");
var address = a + ', ' + p + ' ' + c + ', Slovenia';
}
if (geocoder) {
geocoder.geocode({ 'address': address }, function (results, status) {
if (status == google.maps.GeocoderStatus.OK) {
US.set("location_lat", results[0].geometry.location.lat(), 60);
US.set("location_lon", results[0].geometry.location.lng(), 60);
$('#location_setter').dialog('close');
}
else {
console.log('No results found: ' + status);
}
});
}
}
переменные США внутри-это наше собственное пространство имен для пользовательских настроек
надеюсь, что это поможет кому-то
вот хороший пост о том, почему вы испытывали поведение из исходного вопроса. URL-адрес, по которому вы отправляете запрос в google (http://maps.googleapis.com/maps/api/geocode/json) не возвращает анализируемый ответ jsonp, он просто возвращает необработанный объект JSON. Google отказывается обернуть JSON в поставляемый обратный вызов.
исправление для этого, более или менее из того, что я могу сказать, состоит в том, чтобы сделать ваш запрос на этот URL: http://maps.google.com/maps/geo и включить ключ API Google Maps в ваш запрос. Также существует некоторая необходимость в обеспечении того, чтобы параметр обратного вызова в запросе был последним параметром строки запроса.
вот jsfiddle анализируемого ответа от службы (даже если он возвращает ошибку, потому что нет действительного ключа API Google Maps):http://jsfiddle.net/sCa33/
другой вариант-сделать то, что вы уже сделали, кажется, и использовать объект геокодера Google для запуска запроса.
Я взглянул на проблему, но я не могу понять, что происходит. Одна вещь, которую я нашел, заключалась в том, что если я добавляю параметр данных к ошибке, а затем предупреждаю(данные.статус) дает код 200. Единственное место, где я мог найти это, было решить его до кода успеха для v2?!
error: function(data) {
alert(data.status);
}
также я не уверен, что вы можете использовать этот jsonp, потому что чтение документации, похоже, помещает дополнительные параметры в строку запроса? Когда я удалил его jsonpcallback и изменил тип данных для json код ответа начал говорить 0.
не так много помощи извините, но я должен идти на работу сейчас.
function codeAddress(address, title, imageURL) {
console.log(address);
geocoder.geocode({'address': address}, function (results, status) {
console.log(results);
if (status == google.maps.GeocoderStatus.OK) {
map.setCenter(results[0].geometry.location);
var marker = new google.maps.Marker({
map: map,
position: results[0].geometry.location,
icon: "",
title: title
});
/* Set onclick popup */
var infowindow = new google.maps.InfoWindow({content: title});
google.maps.event.addListener(marker, 'click', function () {
infowindow.open(marker.get('map'), marker);
});
}
else if (status === google.maps.GeocoderStatus.OVER_QUERY_LIMIT) {
setTimeout(function () {
codeAddress(address, title, imageURL);
}, 250);
} else {
alert("Geocode was not successful for the following reason: " + status);
}
});