2011-07-19 11 views
25

Jestem zaznajomiony z geolokacją HTML5 w celu zwrócenia przybliżonych współrzędnych położenia użytkownika.Jak mogę znaleźć kraj użytkownika za pomocą geolokacji HTML5?

Jak jednak mogę zwrócić nazwę kraju, w którym znajdują się współrzędne?

+1

zduplikowane pytanie? http://stackoverflow.com/questions/6159074/given-the-lat-long-coordinates-how-can-we-find-out-the-city-country – Kevin

+0

Zobacz prawdopodobnie odpowiedzi na http://stackoverflow.com/questions/4497728/get-country-from-równoleżnik. –

+2

Geolokalizacja nie jest częścią HTML5: http://isgeolocationpartofhtml5.com/ –

Odpowiedz

25
var geocoder = new google.maps.Geocoder(); 
    geocoder.geocode({'latLng': <YOURLATLNGRESPONSEFROMGEO>}, function(results, status) { 
      if (status == google.maps.GeocoderStatus.OK) { 
       if (results[0]) { 
        var loc = getCountry(results); 
       } 
      } 
     }); 

    function getCountry(results) 
    { 
     for (var i = 0; i < results[0].address_components.length; i++) 
     { 
     var shortname = results[0].address_components[i].short_name; 
     var longname = results[0].address_components[i].long_name; 
     var type = results[0].address_components[i].types; 
     if (type.indexOf("country") != -1) 
     { 
      if (!isNullOrWhitespace(shortname)) 
      { 
       return shortname; 
      } 
      else 
      { 
       return longname; 
      } 
     } 
    } 

} 

function isNullOrWhitespace(text) { 
    if (text == null) { 
     return true; 
    } 
    return text.replace(/\s/gi, '').length < 1; 
} 

To właśnie używam :)

+1

To jest prawie idealne, ale google zwraca "Wielka Brytania" zamiast "Anglia" lub "Szkocja" itp. Idealnie musi wrócić "Anglia" itp. Jako cel aplikacji, którą buduję, polega na zidentyfikowaniu między nimi dwóch! :/ – Curt

+0

Przejrzyj różne typy i zobacz, czy możesz pobrać to, co chcesz. http://code.google.com/apis/maps/documentation/geocoding/#Types – slandau

+0

Po to, aby być super wybrednym, ale bezpieczniej jest używać "===" zamiast "==" do porównywania wartości pustych. –

28

Jeśli chcesz tylko kraj, tu jest dużo prostsze podejście z wykorzystaniem ws.geonames.org zamiast Google:

if (navigator.geolocation) { 
    navigator.geolocation.getCurrentPosition(function(position) { 
     $.getJSON('http://ws.geonames.org/countryCode', { 
      lat: position.coords.latitude, 
      lng: position.coords.longitude, 
      type: 'JSON' 
     }, function(result) { 
      alert(result.countryName); 
     }); 
    }); 
}​ 

Normalnie powiedziałbym, że za pomocą Usługa Google oznaczałaby większą niezawodność, ale w przypadku tak wielu usług Google wycofywanych w ostatnim czasie prawdopodobnie warto przyjrzeć się innym rozwiązaniom.


Tak przy okazji, przeprowadziłem eksperymenty, korzystając ze wszystkich bezpłatnych usług geokodowania, jakie mogłem znaleźć. Zwraca kraj i nazwę odpowiedzialnej służby, gdy tylko jeden z nich znajdzie akceptowalny wynik.

Zapraszam do zabawy z nim poprzez JSFiddle: Deferred look up country code via multiple geolocation webapis

+1

Bardzo podoba mi się prostota tej odpowiedzi ... i jej bardziej otwarta odpowiedź;) – Pykler

+1

Najlepsza odpowiedź dla krajów, które blokują Google :) – Armfoot

+0

Błąd: dzierżawa Dodaj nazwę użytkownika do każdego połączenia, aby geony mogły identyfikować aplikacja wywołująca i liczyć kredyty – zloctb

0

Podobne odpowiedź jak z @hippietrail ale z innej usługi bez rejestracji.

if (navigator.geolocation) { 
    navigator.geolocation.getCurrentPosition(function(position) { 

    $.ajax('http://www.datasciencetoolkit.org/coordinates2politics/' 
    + position.coords.latitude + ',' 
    + position.coords.longitude, {dataType: 'jsonp'}) 
    .done(function(data, textStatus, jqXHR) { 
    if (textStatus === 'success') { 
     var country = data[0].politics[0].name 
     alert(country) 
    } 
    }) 
} 
1

zwracać uwagę, czego potrzebujesz ustawić „username” nieruchomości na użyciu tego API, inaczej dostaniesz błąd.

setTimeout(function() { 
       if (navigator.geolocation) { 
        navigator.geolocation.getCurrentPosition(function(position) { 
         $.getJSON('http://api.geonames.org/countryCode', { 
          lat : position.coords.latitude, 
          lng : position.coords.longitude, 
          type : 'JSON', 
          username : 'demo' 
         }, function(result) { 
          alert(result.countryName); 
         }); 
        }); 
       } 

      }, 1000); 
2

Jeśli masz problem z uzyskaniem geolokalizacja pracować jak miałem w Chrome, wtedy mogę polecić ten alternatywny sposób (przykład z jQuery):

$.getJSON("https://freegeoip.net/json/", function(data) { 
    const countryCode = data.country_code; 
    const countryName = data.country_name; 
    const ip = data.ip; 
    const timezone = data.time_zone; 
    const latitude = data.latitude; 
    const longitude = data.longitude; 

    alert("Country Code: " + countryCode); 
    alert("Country Name: " + countryName); 
    alert("IP: " + ip); 
    alert("Time Zone: " + timezone); 
    alert("Latitude: " + latitude); 
    alert("Longitude: " + longitude); 
}); 
+0

schludne rozwiązanie z bardzo kilka linii! również nie wymaga interakcji użytkownika, aby znaleźć swoją lokalizację. – Ander

Powiązane problemy