plugin google example angularjs ionic-framework geolocation

angularjs - google - Iónico/Angular JS-Obtenga valores específicos de Geolocalización Inversa



ionic geolocation (3)

Estoy construyendo una aplicación usando Ionic / Angular JS. En una pestaña específica, la aplicación tiene la capacidad de rellenar automáticamente algunos campos de formulario, como el nombre de la calle, el número de la calle, etc. Mi problema es que, en algunas situaciones, el número de la calle no está disponible y los data[0].address_components[0].long_name llena el nombre de la calle en su lugar.

Aquí está el código que uso:

.controller(''PetitionsCtrl'', function($scope, $cordovaGeolocation, $cordovaCamera, $log, $ionicLoading, $http, $timeout, $compile, Upload) { $scope.getLocation = function() { $ionicLoading.show({ templateUrl: ''loading.html'', hideOnStateChange: true }); var posOptions = {timeout: 15000, enableHighAccuracy: true}; $cordovaGeolocation .getCurrentPosition(posOptions) .then(function (position) { $scope.lat = position.coords.latitude; $scope.lng = position.coords.longitude; $scope.pLat = {value: $scope.lat}; $scope.pLng = {value: $scope.lng}; var geocoder = new google.maps.Geocoder(); var latlng = new google.maps.LatLng($scope.lat, $scope.lng); var request = { latLng: latlng }; geocoder.geocode(request, function(data, status) { if (status == google.maps.GeocoderStatus.OK) { if (data[0] != null) { $scope.$apply(function () { $scope.pStreet = {value: data[0].address_components[1].long_name}; $scope.pNumber = {value: data[0].address_components[0].long_name}; $scope.pCity = {value: data[0].address_components[2].long_name}; $scope.pAddress = {value: data[0].formatted_address}; setTimeout(function () { $ionicLoading.hide(); }, 500); }); } else { $log.log("Adresa indisponibila"); setTimeout(function () { $ionicLoading.hide(); }, 500); } } }) }); }; })

Aquí hay una respuesta de ejemplo de Google:

{ "results" : [ { "address_components" : [ { "long_name" : "1600", "short_name" : "1600", "types" : [ "street_number" ] }, { "long_name" : "Amphitheatre Pkwy", "short_name" : "Amphitheatre Pkwy", "types" : [ "route" ] }, { "long_name" : "Mountain View", "short_name" : "Mountain View", "types" : [ "locality", "political" ] }, { "long_name" : "Santa Clara County", "short_name" : "Santa Clara County", "types" : [ "administrative_area_level_2", "political" ] }, { "long_name" : "California", "short_name" : "CA", "types" : [ "administrative_area_level_1", "political" ] }, { "long_name" : "United States", "short_name" : "US", "types" : [ "country", "political" ] }, { "long_name" : "94043", "short_name" : "94043", "types" : [ "postal_code" ] } ], "formatted_address" : "1600 Amphitheatre Parkway, Mountain View, CA 94043, USA", "geometry" : { "location" : { "lat" : 37.4224764, "lng" : -122.0842499 }, "location_type" : "ROOFTOP", "viewport" : { "northeast" : { "lat" : 37.4238253802915, "lng" : -122.0829009197085 }, "southwest" : { "lat" : 37.4211274197085, "lng" : -122.0855988802915 } } }, "place_id" : "ChIJ2eUgeAK6j4ARbn5u_wAGqWA", "types" : [ "street_address" ] } ], "status" : "OK" }

¿Cómo puedo modificar mi código para que compruebe el valor de "types" antes de leer un valor y lo deja en blanco si no está disponible? Para ser más específico, en lugar de usar data[0].address_components[0].long_name para obtener el número de calle, me gustaría obtener si "types" vale es "street_number" .


La respuesta de Ryad.iv es simplemente verificar la primera cadena de la matriz. Para que esto funcione correctamente, debe verificar todos los elementos de la matriz.

geocoder.geocode(request, function(data, status) { if (status == google.maps.GeocoderStatus.OK) { if (data[0] != null) { $scope.$apply(function () { $scope.pStreet = {value: data[0].address_components[1].long_name}; $scope.pNumber = {value: data[0].address_components[0].types.indexOf(''street_number'') !== -1 ? data[0].address_components[0].long_name : ''''}; $scope.pCity = {value: data[0].address_components[2].long_name}; $scope.pAddress = {value: data[0].formatted_address}; setTimeout(function () { $ionicLoading.hide(); }, 500); }); } else { $log.log("Adresa indisponibila"); setTimeout(function () { $ionicLoading.hide(); }, 500); } } })

Esa es la buena manera de verificar esto. Con la otra respuesta, si street_name es la segunda posición de la matriz, no la insertarás correctamente.

Espero eso ayude


Lo que he entendido es que si el valor de los tipos es igual a street_number , quiere obtener el valor; de lo contrario, quiere ponerlo vacío como valor ''''

geocoder.geocode(request, function(data, status) { if (status == google.maps.GeocoderStatus.OK) { if (data[0] != null) { $scope.$apply(function () { $scope.pStreet = {value: data[0].address_components[1].long_name}; $scope.pNumber = {value: data[0].address_components[0].types[0] === ''street_number'' ? data[0].address_components[0].long_name : ''''}; $scope.pCity = {value: data[0].address_components[2].long_name}; $scope.pAddress = {value: data[0].formatted_address}; setTimeout(function () { $ionicLoading.hide(); }, 500); }); } else { $log.log("Adresa indisponibila"); setTimeout(function () { $ionicLoading.hide(); }, 500); } } })


Tienes que recorrer el conjunto de resultados para encontrar una coincidencia como:

Angular.forEach(data[0].address_components, function(val, index){ if (val.type[0]==''street_number'') { $scope.pNumber = {value: val.long_name}; } });

Puede usar este código para buscar cualquier otro valor como city o country etc.