Получить город от результатов геокодера?
У вас возникли проблемы с получением содержимого различных массивов из результатов геокодирования.
item.formatted_address работает, но не item.address_components.locality?
geocoder.geocode( {'address': request.term }, function(results, status) {
response($.map(results, function(item) {
alert(item.formatted_address+" "+item.address_components.locality)
}
});
//возвращаемый массив:
"results" : [
{
"address_components" : [
{
"long_name" : "London",
"short_name" : "London",
"types" : [ "locality", "political" ]
} ],
"formatted_address" : "Westminster, London, UK" // rest of array...
любая помощь оценена!
Ос
Ответы
Ответ 1
Получил эту работу в конце, используя:
var arrAddress = item.address_components;
var itemRoute='';
var itemLocality='';
var itemCountry='';
var itemPc='';
var itemSnumber='';
// iterate through address_component array
$.each(arrAddress, function (i, address_component) {
console.log('address_component:'+i);
if (address_component.types[0] == "route"){
console.log(i+": route:"+address_component.long_name);
itemRoute = address_component.long_name;
}
if (address_component.types[0] == "locality"){
console.log("town:"+address_component.long_name);
itemLocality = address_component.long_name;
}
if (address_component.types[0] == "country"){
console.log("country:"+address_component.long_name);
itemCountry = address_component.long_name;
}
if (address_component.types[0] == "postal_code_prefix"){
console.log("pc:"+address_component.long_name);
itemPc = address_component.long_name;
}
if (address_component.types[0] == "street_number"){
console.log("street_number:"+address_component.long_name);
itemSnumber = address_component.long_name;
}
//return false; // break the loop
});
Ответ 2
попробовал несколько разных запросов:
MK107BX
Кливленд Парк Полумесяц, Великобритания
как вы говорите, размер массива возвращен несогласован, но город для обоих результатов, похоже, находится в элементе address_component с типом [ "местность", "политический" ]. Возможно, вы могли бы использовать это как индикатор?
EDIT: получить объект локации с помощью jQuery, добавить это в свою функцию ответа:
var arrAddress = item.results[0].address_components;
// iterate through address_component array
$.each(arrAddress, function (i, address_component) {
if (address_component.types[0] == "locality") // locality type
console.log(address_component.long_name); // here your town name
return false; // break the loop
});
Ответ 3
Мне пришлось создать программу, которая заполняла поля широты, долготы, города, округа и штата в форме пользователя, когда пользователь нажимает на местоположение на карте. Страница находится в http://krcproject.groups.et.byu.net и является формой пользователя, которая позволяет публике вносить вклад в базу данных. Я не претендую на роль эксперта, но он отлично работает.
<script type="text/javascript">
function initialize()
{
//set initial settings for the map here
var mapOptions =
{
//set center of map as center for the contiguous US
center: new google.maps.LatLng(39.828, -98.5795),
zoom: 4,
mapTypeId: google.maps.MapTypeId.HYBRID
};
//load the map
var map = new google.maps.Map(document.getElementById("map"), mapOptions);
//This runs when the user clicks on the map
google.maps.event.addListener(map, 'click', function(event)
{
//initialize geocoder
var geocoder = new google.maps.Geocoder()
//load coordinates into the user form
main_form.latitude.value = event.latLng.lat();
main_form.longitude.value = event.latLng.lng();
//prepare latitude and longitude
var latlng = new google.maps.LatLng(event.latLng.lat(), event.latLng.lng());
//get address info such as city and state from lat and long
geocoder.geocode({'latLng': latlng}, function(results, status)
{
if (status == google.maps.GeocoderStatus.OK)
{
//break down the three dimensional array into simpler arrays
for (i = 0 ; i < results.length ; ++i)
{
var super_var1 = results[i].address_components;
for (j = 0 ; j < super_var1.length ; ++j)
{
var super_var2 = super_var1[j].types;
for (k = 0 ; k < super_var2.length ; ++k)
{
//find city
if (super_var2[k] == "locality")
{
//put the city name in the form
main_form.city.value = super_var1[j].long_name;
}
//find county
if (super_var2[k] == "administrative_area_level_2")
{
//put the county name in the form
main_form.county.value = super_var1[j].long_name;
}
//find State
if (super_var2[k] == "administrative_area_level_1")
{
//put the state abbreviation in the form
main_form.state.value = super_var1[j].short_name;
}
}
}
}
}
});
});
}
</script>
Ответ 4
Я предполагаю, что вы хотите получить город и штат/провинцию:
var map_center = map.getCenter();
reverseGeocode(map_center);
function reverseGeocode(latlng){
geocoder.geocode({'latLng': latlng}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
var level_1;
var level_2;
for (var x = 0, length_1 = results.length; x < length_1; x++){
for (var y = 0, length_2 = results[x].address_components.length; y < length_2; y++){
var type = results[x].address_components[y].types[0];
if ( type === "administrative_area_level_1") {
level_1 = results[x].address_components[y].long_name;
if (level_2) break;
} else if (type === "locality"){
level_2 = results[x].address_components[y].long_name;
if (level_1) break;
}
}
}
updateAddress(level_2, level_1);
}
});
}
function updateAddress(city, prov){
// do what you want with the address here
}
Не пытайтесь вернуть результаты, поскольку вы обнаружите, что они undefined - результат асинхронной службы. Вы должны вызвать функцию, такую как updateAddress();
Ответ 5
Я думаю, что это настоящая боль, что google не предоставляет каких-либо функциональных возможностей для их получения. В любом случае, я считаю, что лучший способ найти правильный объект:
geocoder.geocode({'address': request.term }, function(results, status){
response($.map(results, function(item){
var city = $.grep(item.address_components, function(x){
return $.inArray('locality', x.types) != -1;
})[0].short_name;
alert(city);
}
});
Ответ 6
// Use Google Geocoder to get Lat/Lon for Address
function codeAddress() {
// Function geocodes address1 in the Edit Panel and fills in lat and lon
address = document.getElementById("tbAddress").value;
geocoder.geocode({ 'address': address }, function (results, status) {
if (status == google.maps.GeocoderStatus.OK) {
loc[0] = results[0].geometry.location.lat();
loc[1] = results[0].geometry.location.lng();
document.getElementById("tbLat").value = loc[0];
document.getElementById("tbLon").value = loc[1];
var arrAddress = results[0].address_components;
for (ac = 0; ac < arrAddress.length; ac++) {
if (arrAddress[ac].types[0] == "street_number") { document.getElementById("tbUnit").value = arrAddress[ac].long_name }
if (arrAddress[ac].types[0] == "route") { document.getElementById("tbStreet").value = arrAddress[ac].short_name }
if (arrAddress[ac].types[0] == "locality") { document.getElementById("tbCity").value = arrAddress[ac].long_name }
if (arrAddress[ac].types[0] == "administrative_area_level_1") { document.getElementById("tbState").value = arrAddress[ac].short_name }
if (arrAddress[ac].types[0] == "postal_code") { document.getElementById("tbZip").value = arrAddress[ac].long_name }
}
document.getElementById("tbAddress").value = results[0].formatted_address;
}
document.getElementById("pResult").innerHTML = 'GeoCode Status:' + status;
})
}
Ответ 7
//if (arrAddress[ac].types[0] == "street_number") { alert(arrAddress[ac].long_name) } // SOKAK NO
//if (arrAddress[ac].types[0] == "route") { alert(arrAddress[ac].short_name); } // CADDE
//if (arrAddress[ac].types[0] == "locality") { alert(arrAddress[ac].long_name) } // İL
//if (arrAddress[ac].types[0] == "administrative_area_level_1") { alert(arrAddress[ac].short_name) } // İL
//if (arrAddress[ac].types[0] == "postal_code") { alert(arrAddress[ac].long_name); } // POSTA KODU
//if (arrAddress[ac].types[0] == "neighborhood") { alert(arrAddress[ac].long_name); } // Mahalle
//if (arrAddress[ac].types[0] == "sublocality") { alert(arrAddress[ac].long_name); } // İlçe
//if (arrAddress[ac].types[0] == "country") { alert(arrAddress[ac].long_name); } // Ülke
Ответ 8
Вот некоторый код, который вы можете использовать с библиотекой lodash js: (просто замените $scope.x своим собственным именем переменной, чтобы сохранить значение)
_.findKey(vObj.address_components, function(component) {
if (component.types[0] == 'street_number') {
$scope.eventDetail.location.address = component.short_name
}
if (component.types[0] == 'route') {
$scope.eventDetail.location.address = $scope.eventDetail.location.address + " " + component.short_name;
}
if (component.types[0] == 'locality') {
$scope.eventDetail.location.city = component.long_name;
}
if (component.types[0] == 'neighborhood') {
$scope.eventDetail.location.neighborhood = component.long_name;
}
});
Ответ 9
Я использовал функцию lodash, называемую find, которая возвращает объект, для которого предикат возвращает true. Так просто!
let city = find(result, (address) => {
return typeof find(address.types, (a) => { return a === 'locality'; }) === 'string';
});
Ответ 10
Возвращает местность, если существует. Если нет - возвращает administrative_area_1
city = results[0].address_components.filter(function(addr){
return (addr.types[0]=='locality')?1:(addr.types[0]=='administrative_area_level_1')?1:0;
});