Gdzie ja jestem? - Zdobądź kraj

126

Telefon z Androidem faktycznie dobrze wie, gdzie się znajduje - ale czy istnieje sposób na odzyskanie kraju za pomocą czegoś w rodzaju kodu kraju?

Nie trzeba znać dokładnej pozycji GPS - wystarczy kraj

Najpierw pomyślałem o użyciu strefy czasowej, ale w rzeczywistości potrzebuję więcej informacji, ponieważ ma znaczenie, czy lokalizacja to Nowy Jork czy Lima.

Tło pytania: Mam aplikację, która używa wartości temperatury i chciałbym ustawić domyślną jednostkę na Celsjusza lub Fahrenheita, w zależności od tego, czy lokalizacja jest w USA czy poza nią

DonGru
źródło
14
-1: Na pewno nie chcesz wiedzieć, gdzie jest użytkownik . Chcesz poznać ustawienia regionalne użytkownika. Zaakceptowana odpowiedź właśnie na to odpowiada, ale poza tym jest tutaj całkowicie niewłaściwa, ponieważ wyszukiwanie wskaże tutaj osoby, które faktycznie chcą wiedzieć, gdzie naprawdę jest użytkownik.
Jan Hudec

Odpowiedzi:

96

Spowoduje to ustawienie kodu kraju dla telefonu (język telefonu, NIE lokalizacja użytkownika):

 String locale = context.getResources().getConfiguration().locale.getCountry(); 

można również zamienić getCountry () na getISO3Country (), aby uzyskać 3-literowy kod ISO kraju. Spowoduje to wyświetlenie nazwy kraju :

 String locale = context.getResources().getConfiguration().locale.getDisplayCountry();

Wydaje się to łatwiejsze niż inne metody i polega na ustawieniach lokalizacji w telefonie, więc jeśli użytkownik z USA jest za granicą, prawdopodobnie nadal będzie chciał Fahrenheita i to zadziała :)

Uwaga redakcji : To rozwiązanie nie ma nic wspólnego z lokalizacją telefonu. To jest stałe. Podczas podróży do Niemiec lokalizacja NIE ulegnie zmianie. W skrócie: locale! = Location.

stealthcopter
źródło
83
To nie zadziała w krajach, dla których Android nie ma ustawień regionalnych. Na przykład w Szwajcarii prawdopodobnie ustawiony będzie język niemiecki lub francuski. Ta metoda da ci Niemcy lub Francję, a nie Szwajcarię. Lepiej użyć podejścia LocationManager lub TelephonyManager.
MathewI
5
Nie działa dobrze. Muszę rozróżnić kraj użytkownika dla wszystkich krajów Ameryki Łacińskiej, wszystkie telefony testowe wróciły do ​​USA, nawet jeśli telefon jest w języku angielskim lub hiszpańskim.
htafoya
21
To nie jest odpowiedź na ten tytuł w rachubę. Może mam zestaw telefoniczny na angielski i być w dowolnym miejscu na świecie (mój język ojczysty to nie angielski, ale ja robić mam telefonu ustawiona na (brytyjski) angielski. To jednak nie odpowiadać rzeczywistej pytanie , ponieważ użytkownik chce jednostek nas jeśli jest Amerykaninem, gdziekolwiek akurat się znajduje.
Jan Hudec
2
Nie jest to możliwe rozwiązanie, aby uzyskać nazwę kraju
Aamirkhan
2
Ogólnie jest to dobra odpowiedź, ale zwraca tylko kraj lokalizacji, a nie rzeczywisty kraj.
dst
138
/**
 * Get ISO 3166-1 alpha-2 country code for this device (or null if not available)
 * @param context Context reference to get the TelephonyManager instance from
 * @return country code or null
 */
public static String getUserCountry(Context context) {
    try {
        final TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        final String simCountry = tm.getSimCountryIso();
        if (simCountry != null && simCountry.length() == 2) { // SIM country code is available
            return simCountry.toLowerCase(Locale.US);
        }
        else if (tm.getPhoneType() != TelephonyManager.PHONE_TYPE_CDMA) { // device is not 3G (would be unreliable)
            String networkCountry = tm.getNetworkCountryIso();
            if (networkCountry != null && networkCountry.length() == 2) { // network country code is available
                return networkCountry.toLowerCase(Locale.US);
            }
        }
    }
    catch (Exception e) { }
    return null;
}
krakanie
źródło
14
Działa tylko na telefonach lub innych urządzeniach z kartą SIM. Korzystając z tabletu WIFI, otrzymasz zero. Więc jego użyteczność jest ograniczona.
Bram
1
@Bram To wszystko, co możesz dostać. Więc jest to całkiem przydatne, problem polega tylko na tym, że nie masz innych wiarygodnych źródeł danych, jeśli masz tablet tylko z Wi-Fi.
krakanie
11
Zauważ, że jeśli użytkownik z USA jest na wakacjach we Francji, getSimCountryIsopowie usi getNetworkCountryIsopowiefr
Tim
1
Możesz zmienić toLowerCase()połączenie na toUpperCase().
toobsco42
Potrzebuję kodu, a nie kodu Nazwa; Jak dla USA +1, a nie USA
Shihab Uddin
67

Użyj tego linku http://ip-api.com/json , dostarczy to wszystkich informacji jako json. Z tego json'a możesz łatwo pobrać kraj. Ta strona działa przy użyciu Twojego aktualnego adresu IP, automatycznie wykrywa adres IP i szczegóły odesłania.

Dokumenty http://ip-api.com/docs/api:json Mam nadzieję, że to pomoże.

Przykład json

{
  "status": "success",
  "country": "United States",
  "countryCode": "US",
  "region": "CA",
  "regionName": "California",
  "city": "San Francisco",
  "zip": "94105",
  "lat": "37.7898",
  "lon": "-122.3942",
  "timezone": "America/Los_Angeles",
  "isp": "Wikimedia Foundation",
  "org": "Wikimedia Foundation",
  "as": "AS14907 Wikimedia US network",
  "query": "208.80.152.201"
}

Uwaga : ponieważ jest to rozwiązanie innej firmy, używaj tylko wtedy, gdy inne nie działają.

shine_joseph
źródło
1
Nie jestem pewien, czy dokładnie tego chciał OP, ale i tak naprawdę podoba mi się odpowiedź.
JohnnyLambada
1
Podobnie jak odpowiedź, ponieważ działałoby to również na tabletach (bez karty SIM). Rozwiązanie telefoniczne działa tylko na telefonach z aktywnymi simami. Telefony z dwiema kartami SIM to kolejny problem, ponieważ mogą pochodzić z różnych krajów. Więc prawdopodobnie bardziej sensowne jest poleganie na wspomnianym powyżej rozwiązaniu IP.
Manish Kataria
1
Chociaż, jak zauważyłeś, może to nie być najlepsze podejście do problemu, w rzeczywistości zapewnia prawidłowe rozwiązanie. +1 ode mnie i dziękuję!
Matteo
1
Zawsze źle jest korzystać z firm trzecich, nigdy nie wiadomo, jak stabilne są. na przykład - Parse.
Nativ
1
ale ma ograniczenia. ich system automatycznie blokuje wszelkie adresy IP wykonujące ponad 150 żądań na minutę.
Ram Mandal
62

Właściwie właśnie się dowiedziałem, że istnieje jeszcze jeden sposób uzyskania kodu kraju, przy użyciu metody getSimCountryIso () TelephoneManager:

TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
String countryCode = tm.getSimCountryIso();

Ponieważ jest to kod karty SIM, nie powinien również zmieniać się podczas podróży do innych krajów.

DonGru
źródło
43
To może nie działać, gdy urządzenie nie ma karty SIM, na przykład tabletu
thomasdao
38

Najpierw pobierz LocationManager. Następnie zadzwoń LocationManager.getLastKnownPosition. Następnie utwórz GeoCoder i wywołaj GeoCoder.getFromLocation. Zrób to w osobnym wątku !! To da ci listę Addressobiektów. Zadzwoń Address.getCountryNamei masz to.

Pamiętaj, że ostatnia znana pozycja może być trochę nieaktualna, więc jeśli użytkownik właśnie przekroczył granicę, możesz przez chwilę o tym nie wiedzieć.

EboMike
źródło
W przypadku tej aplikacji zmiana domyślnej jednostki nie byłaby pożądana podczas przenoszenia krajów, ponieważ preferencje użytkownika dotyczące stopni Celsjusza lub Fahrenheita nie ulegną zmianie, gdy wyruszy na nowe ziemie.
stealthcopter,
Muszę wiedzieć, w którym kraju mój użytkownik jest w celu wywołania interfejsu API. Połączenie zwraca lokalizacje w okolicy. Dlatego interesuje mnie tylko prawdziwy kod kraju, w którym znajduje się użytkownik. Tylko po to, aby dać wgląd w to, do czego może być potrzebne powyższe podejście.
vinzenzweber,
Jest to wysoce niedoceniane, ale faktem jest, że jest to najbardziej niezawodne rozwiązanie. Większość powyższych odpowiedzi nie działa w sieci Wi-Fi. Ten udostępniony przez @shine_joseph wygląda dobrze, ale udostępniony interfejs API nie jest przeznaczony do użytku komercyjnego.
Gem,
Używaj ostrożnie. Twoje urządzenie poda lokalizację, nawet jeśli nie jest połączone z siecią, ale Geocoder zazwyczaj zwraca wartość null dla tablicy adresów, jeśli Wi-Fi jest wyłączone, zgłaszając wyjątek, który będziesz musiał spróbować / złapać.
Mike Critchley
17

Oto kompletne rozwiązanie oparte na LocationManager i jako rozwiązanie zastępcze TelephonyManager i lokalizacje dostawcy sieci. Użyłem powyższej odpowiedzi od @Marco W. dla części rezerwowej (świetna odpowiedź sama w sobie!).

Uwaga: kod zawiera PreferencesManager, jest to klasa pomocnicza, która zapisuje i ładuje dane z SharedPrefrences. Używam go, aby zapisać kraj na S "P, odbieram kraj tylko wtedy, gdy jest pusty. W przypadku mojego produktu nie obchodzą mnie wszystkie skrajne przypadki (użytkownik podróżuje za granicę i tak dalej).

public static String getCountry(Context context) {
    String country = PreferencesManager.getInstance(context).getString(COUNTRY);
    if (country != null) {
        return country;
    }

    LocationManager locationManager = (LocationManager) PiplApp.getInstance().getSystemService(Context.LOCATION_SERVICE);
    if (locationManager != null) {
        Location location = locationManager
                .getLastKnownLocation(LocationManager.GPS_PROVIDER);
        if (location == null) {
            location = locationManager
                    .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
        }
        if (location == null) {
            log.w("Couldn't get location from network and gps providers")
            return
        }
        Geocoder gcd = new Geocoder(context, Locale.getDefault());
        List<Address> addresses;
        try {
            addresses = gcd.getFromLocation(location.getLatitude(),
                    location.getLongitude(), 1);

            if (addresses != null && !addresses.isEmpty()) {
                country = addresses.get(0).getCountryName();
                if (country != null) {
                    PreferencesManager.getInstance(context).putString(COUNTRY, country);
                    return country;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    country = getCountryBasedOnSimCardOrNetwork(context);
    if (country != null) {
        PreferencesManager.getInstance(context).putString(COUNTRY, country);
        return country;
    }
    return null;
}


/**
 * Get ISO 3166-1 alpha-2 country code for this device (or null if not available)
 *
 * @param context Context reference to get the TelephonyManager instance from
 * @return country code or null
 */
private static String getCountryBasedOnSimCardOrNetwork(Context context) {
    try {
        final TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        final String simCountry = tm.getSimCountryIso();
        if (simCountry != null && simCountry.length() == 2) { // SIM country code is available
            return simCountry.toLowerCase(Locale.US);
        } else if (tm.getPhoneType() != TelephonyManager.PHONE_TYPE_CDMA) { // device is not 3G (would be unreliable)
            String networkCountry = tm.getNetworkCountryIso();
            if (networkCountry != null && networkCountry.length() == 2) { // network country code is available
                return networkCountry.toLowerCase(Locale.US);
            }
        }
    } catch (Exception e) {
    }
    return null;
}
Nativ
źródło
4
Przepraszamy, ale Twoja odpowiedź naprawdę wymaga przepisania. Kod zawiera wiele bezużytecznego kodu.
ichalos
@ichalos lub nie rozumiesz logiki. Proszę podać 1 przykład nieużywanego kodu w tym fragmencie
Nativ
2
Oczywiście nie rozumiem logiki i proszę, nie odbieram tego źle. Wspominam, że PipplApp, PrefernecesManager itp. Mogły zostać usunięte, a oferowane rozwiązanie mogłoby być nieco bardziej przejrzyste dla czytelników.
ichalos
@ichalos o PiplApp Zgadzam się w 100% z tobą, po prostu go
usuwam
W country = addresses.get(0).getCountryName();twoim kodzie znajduje się, który umieści pełną nazwę kraju w zmiennej country. W tym samym czasie getCountryBasedOnSimCardOrNetwork(Context context)zwracasz kod ISO kraju. Myślę, że chciałeś napisać country = addresses.get(0).getCountryCode();:-)
Firzen
15

Możesz użyć getNetworkCountryIso()od,TelephonyManager aby uzyskać kraj, w którym aktualnie znajduje się telefon (chociaż najwyraźniej jest to zawodne w sieciach CDMA).

Dave Webb
źródło
brzmi to dość prosto i działało dobrze na emulatorze w pierwszej instancji - czy mógłbyś po prostu wyjaśnić, dlaczego jest zawodny w sieciach CDMA?
DonGru
ah okej, rozumiem - bo tak mówi dokumentacja :)
DonGru
Ze względu na aplikację nie byłoby to najlepsze rozwiązanie, ponieważ gdy użytkownik wyjeżdża za granicę, zmieniłaby się jego domyślna jednostka. Bardziej sensowne byłoby posiadanie statycznej jednostki domyślnej opartej na ustawieniach lokalnych telefonu, które następnie można oczywiście zmienić w jakimś ustawieniu.
stealthcopter,
5
String locale = context.getResources().getConfiguration().locale.getCountry(); 

Jest przestarzałe. Użyj tego zamiast tego:

Locale locale;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    locale = context.getResources().getConfiguration().getLocales().get(0);
} else {
    locale = context.getResources().getConfiguration().locale;
}
4gus71n
źródło
1
Czy wymaga pozwolenia i jaki kraj to pokazuje?
CoolMind
4

W przypadku niektórych urządzeń, jeśli domyślny język jest ustawiony inaczej (Hindus może ustawić angielski (USA))

context.getResources().getConfiguration().locale.getDisplayCountry();

poda błędną wartość. więc ta metoda jest zawodna

Ponadto metoda getNetworkCountryIso () w TelephonyManager nie będzie działać na urządzeniach bez karty SIM (tablety WIFI).

Jeśli urządzenie nie ma karty SIM, możemy użyć strefy czasowej, aby uzyskać kraj. W krajach takich jak Indie ta metoda będzie działać

przykładowy kod używany do sprawdzenia, czy kraj to Indie czy nie (identyfikator strefy czasowej: asia / calcutta)

private void checkCountry() {


    TelephonyManager telMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
    if (telMgr == null)
        return;

    int simState = telMgr.getSimState();

    switch (simState) {
        //if sim is not available then country is find out using timezone id
        case TelephonyManager.SIM_STATE_ABSENT:
            TimeZone tz = TimeZone.getDefault();
            String timeZoneId = tz.getID();
            if (timeZoneId.equalsIgnoreCase(Constants.INDIA_TIME_ZONE_ID)) {
               //do something
            } else {
               //do something
            }
            break;

            //if sim is available then telephony manager network country info is used
        case TelephonyManager.SIM_STATE_READY:

           TelephonyManager tm = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
            if (tm != null) {
                String countryCodeValue = tm.getNetworkCountryIso();
                //check if the network country code is "in"
                if (countryCodeValue.equalsIgnoreCase(Constants.NETWORK_INDIA_CODE)) {
                   //do something
                }

                else {
                   //do something
                }

            }
            break;

    }
}
Margines
źródło
1
fajny pomysł, ale strefa czasowa nie jest funkcją specyficzną dla kraju, wiesz o tym, prawda? Na każde 15 stopni południków jest inna strefa czasowa itd.
Gunhan
3

Używając GPS z szerokością i długością geograficzną, możemy uzyskać kod kraju.

Jeśli korzystamy z telefonii, nie zadziała, jeśli nie używamy karty SIM, a lokalnie, w oparciu o język, pokazuje kod kraju w niewłaściwy sposób.

MainActivity.java:

    GPSTracker gpsTrack;
    public static double latitude = 0;
    public static double longitude = 0;

    gpsTrack = new GPSTracker(TabHomeActivity.this);

        if (gpsTrack.canGetLocation()) {
            latitude = gpsParty.getLatitude();
            longitude = gpsParty.getLongitude();

            Log.e("GPSLat", "" + latitude);
            Log.e("GPSLong", "" + longitude);

        } else {
            gpsTrack.showSettingsAlert();

            Log.e("ShowAlert", "ShowAlert");

        }

        countryCode = getAddress(TabHomeActivity.this, latitude, longitude);

        Log.e("countryCode", ""+countryCode);

   public String getAddress(Context ctx, double latitude, double longitude) {
    String region_code = null;
    try {
        Geocoder geocoder = new Geocoder(ctx, Locale.getDefault());
        List<Address> addresses = geocoder.getFromLocation(latitude, longitude, 1);
        if (addresses.size() > 0) {
            Address address = addresses.get(0);


            region_code = address.getCountryCode();


        }
    } catch (IOException e) {
        Log.e("tag", e.getMessage());
    }

    return region_code;
}

GPSTracker.java:

import android.app.AlertDialog;
import android.app.Service;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.provider.Settings;
import android.util.Log;

public class GPSTracker extends Service implements LocationListener {

    private final Context mContext;

    // flag for GPS status
    boolean isGPSEnabled = false;

    // flag for network status
    boolean isNetworkEnabled = false;

    // flag for GPS status
    boolean canGetLocation = false;

    Location location; // location
    double latitude; // latitude
    double longitude; // longitude

    // The minimum distance to change Updates in meters
    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters

    // The minimum time between updates in milliseconds
    private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute

    // Declaring a Location Manager
    protected LocationManager locationManager;

    public GPSTracker(Context context) {
        this.mContext = context;
        getLocation();
    }

    public Location getLocation() {
        try {
            locationManager = (LocationManager) mContext
                    .getSystemService(LOCATION_SERVICE);

            // getting GPS status
            isGPSEnabled = locationManager
                    .isProviderEnabled(LocationManager.GPS_PROVIDER);

            // getting network status
            isNetworkEnabled = locationManager
                    .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

            if (!isGPSEnabled && !isNetworkEnabled) {
                // no network provider is enabled
            } else {
                this.canGetLocation = true;
                // First get location from Network Provider
                if (isNetworkEnabled) {
                    locationManager.requestLocationUpdates(
                            LocationManager.NETWORK_PROVIDER,
                            MIN_TIME_BW_UPDATES,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    Log.d("Network", "Network");
                    if (locationManager != null) {
                        location = locationManager
                                .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                        if (location != null) {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                        }
                    }
                }
                // if GPS Enabled get lat/long using GPS Services
                if (isGPSEnabled) {
                    if (location == null) {
                        locationManager.requestLocationUpdates(
                                LocationManager.GPS_PROVIDER,
                                MIN_TIME_BW_UPDATES,
                                MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                        Log.d("GPS Enabled", "GPS Enabled");
                        if (locationManager != null) {
                            location = locationManager
                                    .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                            if (location != null) {
                                latitude = location.getLatitude();
                                longitude = location.getLongitude();
                            }
                        }
                    }
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        return location;
    }

    /**
     * Stop using GPS listener
     * Calling this function will stop using GPS in your app
     * */
    public void stopUsingGPS(){
        if(locationManager != null){
            locationManager.removeUpdates(GPSTracker.this);
        }
    }

    /**
     * Function to get latitude
     * */
    public double getLatitude(){
        if(location != null){
            latitude = location.getLatitude();
        }

        // return latitude
        return latitude;
    }

    /**
     * Function to get longitude
     * */
    public double getLongitude(){
        if(location != null){
            longitude = location.getLongitude();
        }

        // return longitude
        return longitude;
    }

    /**
     * Function to check GPS/wifi enabled
     * @return boolean
     * */
    public boolean canGetLocation() {
        return this.canGetLocation;
    }



    public void showSettingsAlert() {
        final AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
        builder.setMessage("Your GPS seems to be disabled, do you want to enable it?")
                .setCancelable(false)
                .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    public void onClick(@SuppressWarnings("unused") final DialogInterface dialog, @SuppressWarnings("unused") final int id) {
                        mContext.startActivity(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));
                    }
                })
                .setNegativeButton("No", new DialogInterface.OnClickListener() {
                    public void onClick(final DialogInterface dialog, @SuppressWarnings("unused") final int id) {
                        dialog.cancel();
                    }
                });
        final AlertDialog alert = builder.create();
        alert.show();
    }

    @Override
    public void onLocationChanged(Location location) {
    }

    @Override
    public void onProviderDisabled(String provider) {
    }

    @Override
    public void onProviderEnabled(String provider) {
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
    }

    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }

}

Log:

E / countryCode: IN

Edycja: użyj dostawcy lokalizacji połączonej, aby uzyskać aktualizację szerokości i długości geograficznej w celu uzyskania lepszych wyników.

Steve
źródło
Co to jest gpsParty ()? To nie jest zdefiniowane
Nikola C
-2

Użyłem bazy danych GEOIP i utworzyłem funkcję. Możesz skorzystać z tego łącza bezpośrednio http://jamhubsoftware.com/geoip/getcountry.php

{"country":["India"],"isoCode":["IN"],"names":[{"de":"Indien","en":"India","es":"India","fr":"Inde","ja":"\u30a4\u30f3\u30c9","pt-BR":"\u00cdndia","ru":"\u0418\u043d\u0434\u0438\u044f","zh-CN":"\u5370\u5ea6"}]}

możesz pobrać pliki autoload.php i .mmdb z https://dev.maxmind.com/geoip/geoip2/geolite2/

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
$ip_address = $_SERVER['REMOTE_ADDR'];
//$ip_address = '3.255.255.255';

require_once 'vendor/autoload.php';

use GeoIp2\Database\Reader;

// This creates the Reader object, which should be reused across
// lookups.
$reader = new Reader('/var/www/html/geoip/GeoLite2-City.mmdb');

// Replace "city" with the appropriate method for your database, e.g.,
// "country".
$record = $reader->city($ip_address);

//print($record->country->isoCode . "\n"); // 'US'
//print($record->country->name . "\n"); // 'United States'
$rows['country'][] = $record->country->name;
$rows['isoCode'][] = $record->country->isoCode;
$rows['names'][] = $record->country->names;
print json_encode($rows);
//print($record->country->names['zh-CN'] . "\n"); // '美国'
//
//print($record->mostSpecificSubdivision->name . "\n"); // 'Minnesota'
//print($record->mostSpecificSubdivision->isoCode . "\n"); // 'MN'
//
//print($record->city->name . "\n"); // 'Minneapolis'
//
//print($record->postal->code . "\n"); // '55455'
//
//print($record->location->latitude . "\n"); // 44.9733
//print($record->location->longitude . "\n"); // -93.2323
?>
arun-r
źródło