2016-11-21 14 views
5

Buduję aplikację przy użyciu Jonic/Angular JS. W określonej zakładce aplikacja może automatycznie wypełniać pola formularza, takie jak nazwa ulicy, numer ulicy itp. Mój problem polega na tym, że w niektórych sytuacjach numer uliczny na przykład nie jest dostępny, a zamiast niego zamiast nazwy ulicy wypełnia się data[0].address_components[0].long_name.Jonic/Angular JS - Uzyskaj konkretne wartości z Reverse Geolocation

Oto kod, który używam:

.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); 
      } 
      } 
     }) 
     }); 
    }; 
}) 

Oto odpowiedź przykład z 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" 
} 

Jak mogę zmienić mój kod tak to sprawdza wartość "types" przed czytania wartość i pozostawia ją pustą, jeśli nie jest dostępna. Aby być bardziej szczegółowym, zamiast używać numeru data[0].address_components[0].long_name, chciałbym uzyskać, jeśli "types" vale jest "street_number".

Odpowiedz

0

Co mam rozumieć to, że jeśli wartość jest równa typy street_number chcesz uzyskać wartość inaczej chcesz umieścić pusty jako wartość ''

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); 
      } 
      } 
     }) 
+0

Muszę na geolokalizacji w mojej aplikacji. za każdym razem, gdy przejdę do konkretnej strony, powinien pojawić się komunikat Pozwól na geolokalizację lub Odmów , więc ten kod jest przydatny do tego lub możesz zasugerować mi, jak dodać to popup, aby poprosić o zezwolenie na geolokalizację .. –

+0

Jak już stwierdziłem w mojej odpowiedzi, to nie jest poprawny, ponieważ sprawdzasz tylko pierwszy element w tablicy. – Jorge

-1

Ryad.iv odpowiedź jest tylko sprawdzanie pierwszy ciąg w tablicy. Aby to działało poprawnie, musisz sprawdzić wszystkie elementy tablicy.

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); 
      } 
      } 
     }) 

To dobry sposób na sprawdzenie tego. W przypadku drugiej odpowiedzi, jeśli street_name jest drugą pozycją macierzy, nie wstawisz jej poprawnie.

Nadzieja pomaga

+0

Nie można wywnioskować, że tablica typów, gdy zawiera "street_number", zawsze będzie tablicą pojedynczego elementu z 'street_number' na pierwszej pozycji. – Jorge

+0

W przypadku street_number, jeśli ma więcej niż jedną wartość, oznacza to, że nie może to być tylko street_number. –

+0

Nie wiesz tego. A jeśli dziś tak to zrobi Google, a jutro zmieni implementację, twoja aplikacja jest zepsuta. Jest głupie, aby tak się stało i przepraszam, ale to bardzo zła odpowiedź. Jestem pewna, że ​​obniżyłeś moją odpowiedź, ale uwierz lub nie, jest to poprawne. – Jorge

0

Trzeba pętli na skutek zadanej znaleźć mecz jak:

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

Można użyć tego kodu, aby znaleźć żadnej innej wartości jak city lub country itp

Powiązane problemy