Wo bin ich? - Holen Sie sich Land

126

Ein Android-Handy weiß eigentlich ganz genau, wo es sich befindet - aber gibt es eine Möglichkeit, das Land anhand eines Ländercodes abzurufen?

Sie müssen die genaue GPS-Position nicht kennen - das Land ist ausreichend

Ich habe zuerst daran gedacht, die Zeitzone zu verwenden, aber eigentlich brauche ich mehr Informationen, da es einen Unterschied macht, ob der Ort New York oder Lima ist.

Hintergrund der Frage: Ich habe eine Anwendung, die Temperaturwerte verwendet, und ich möchte die Standardeinheit entweder auf Celsius oder Fahrenheit einstellen, je nachdem, ob sich der Standort in den USA oder außerhalb befindet

DonGru
quelle
14
-1: Sie möchten definitiv nicht wissen, wo sich der Benutzer befindet . Sie möchten die Ländereinstellung des Benutzers kennen. Die akzeptierte Antwort beantwortet genau das, ist aber ansonsten völlig unangemessen, da die Suche hier Personen anzeigt, die tatsächlich wissen möchten, wo sich der Benutzer wirklich befindet.
Jan Hudec

Antworten:

96

Dadurch wird der für das Telefon festgelegte Ländercode (Telefonsprache, NICHT Benutzerstandort) festgelegt:

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

Sie können auch getCountry () durch getISO3Country () ersetzen , um einen dreistelligen ISO-Code für das Land zu erhalten. Dies erhält den Ländernamen :

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

Dies scheint einfacher zu sein als die anderen Methoden und hängt von den Lokalisierungseinstellungen des Telefons ab. Wenn ein US-Benutzer im Ausland ist, möchte er wahrscheinlich immer noch Fahrenheit und das funktioniert :)

Anmerkung der Redaktion : Diese Lösung hat nichts mit dem Standort des Telefons zu tun. Es ist konstant. Wenn Sie nach Deutschland reisen, ändert sich das Gebietsschema NICHT. Kurzum: Gebietsschema! = Ort.

Stealthcopter
quelle
83
Dies funktioniert nicht in Ländern, für die Android kein Gebietsschema hat. In der Schweiz wird die Sprache wahrscheinlich auf Deutsch oder Französisch eingestellt. Diese Methode gibt Ihnen Deutschland oder Frankreich, nicht die Schweiz. Verwenden Sie besser den LocationManager- oder TelephonyManager-Ansatz.
MathewI
5
Funktioniert nicht gut Ich muss das Benutzerland für alle lateinamerikanischen Länder unterscheiden. Alle Testtelefone sind in die USA zurückgekehrt, auch wenn das Telefon auf Englisch oder Spanisch ist.
Htafoya
21
Dies beantwortet nicht den Titel der Frage. Ich kann das Telefon auf Englisch eingestellt habe und seine überall in der Welt (meine Muttersprache ist nicht Englisch, aber ich tue mein Handy auf (British) Englisch habe. Es ist jedoch die eigentliche Frage nicht zu beantworten , weil Benutzer US - Einheiten wollen , wenn Er ist USAianer, wo immer er sich gerade befindet
Jan Hudec,
2
Nicht die praktikable Lösung, um den
Ländernamen
2
Es ist im Allgemeinen eine gute Antwort, gibt jedoch nur das Land des Gebietsschemas zurück, nicht das tatsächliche Land.
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;
}
krächzen
quelle
14
Funktioniert nur auf Telefonen oder anderen Geräten mit einer SIM-Karte. Bei Verwendung auf einem WIFI-Tablet erhalten Sie null. Daher ist seine Nützlichkeit begrenzt.
Bram
1
@Bram Das ist alles was du bekommen kannst. Es ist also ziemlich nützlich. Das Problem ist nur, dass Sie keine anderen zuverlässigen Datenquellen haben, wenn Sie ein Tablet nur mit WLAN haben.
Caw
11
Beachten Sie, dass, wenn ein Benutzer aus den USA im Urlaub in Frankreich ist, getSimCountryIsosagen wird usund getNetworkCountryIsosagen wirdfr
Tim
1
Möglicherweise möchten Sie den toLowerCase()Anruf in ändern toUpperCase().
toobsco42
Ich brauche Code, nicht Code Name; Wie für USA +1 nicht die USA
Shihab Uddin
67

Verwenden Sie diesen Link http://ip-api.com/json , hier werden alle Informationen als json bereitgestellt. Von diesem json können Sie das Land leicht bekommen. Diese Site verwendet Ihre aktuelle IP-Adresse und erkennt automatisch die IP- und Sendback-Details.

Docs http://ip-api.com/docs/api:json Hoffe, es hilft.

Beispiel 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"
}

Hinweis : Da dies eine Lösung von Drittanbietern ist, verwenden Sie sie nur, wenn andere nicht funktionierten.

schein_joseph
quelle
1
Ich bin mir nicht sicher, ob das genau das ist, was das OP wollte, aber ich mag die Antwort trotzdem sehr.
Johnny Lambada
1
Wie die Antwort, da dies auch auf Tablets (ohne Sim) funktionieren würde. Die Telefonielösung funktioniert nur auf Telefonen mit aktiven Sims. Dual-SIM-Telefone sind ein weiteres Problemszenario, da sie möglicherweise aus verschiedenen Ländern stammen. Daher ist es wahrscheinlich sinnvoller, sich auf die oben erwähnte IP-Lösung zu verlassen.
Manish Kataria
1
Auch wenn dies, wie Sie bereits betont haben, möglicherweise nicht der beste Ansatz für das Problem ist, bietet es tatsächlich eine gültige Lösung. +1 von mir und danke!
Matteo
1
Es ist immer schlecht, Dritte zu benutzen, man kann nie wissen, wie stabil es ist. zum Beispiel - Parse.
Nativ
1
aber es hat Einschränkungen. Ihr System sperrt automatisch alle IP-Adressen, die mehr als 150 Anfragen pro Minute ausführen.
Ram Mandal
62

Eigentlich habe ich gerade herausgefunden, dass es noch eine Möglichkeit gibt, einen Ländercode mit der Methode getSimCountryIso () zu erhalten TelephoneManager:

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

Da es sich um den Simulationscode handelt, sollte er sich auch bei Reisen in andere Länder nicht ändern.

DonGru
quelle
43
Dies funktioniert möglicherweise nicht, wenn das Gerät keine SIM-Karte hat, z. B. Tablet
Thomasdao
38

Holen Sie sich zuerst den LocationManager. Dann rufen Sie an LocationManager.getLastKnownPosition. Erstellen Sie dann einen GeoCoder und rufen Sie an GeoCoder.getFromLocation. Tun Sie dies in einem separaten Thread! Dadurch erhalten Sie eine Liste der AddressObjekte. Ruf an Address.getCountryNameund du hast es verstanden.

Denken Sie daran, dass die letzte bekannte Position etwas veraltet sein kann. Wenn der Benutzer gerade die Grenze überschritten hat, wissen Sie möglicherweise eine Weile nichts davon.

EboMike
quelle
Für diese Anwendung wäre eine Änderung der Standardeinheit nicht erwünscht, wenn Länder verschoben werden, da sich die Präferenz des Benutzers für Celsius oder Fahrenheit nicht ändert, wenn er sich in neue Länder wagt.
Stealthcopter
Ich muss wissen, in welchem ​​Land sich mein Benutzer für einen API-Aufruf befindet. Der Anruf gibt Standorte in der Umgebung zurück. Daher interessiert mich nur der reale Ländercode, in dem sich der Benutzer gerade befindet. Nur um einen Einblick zu geben, wofür der oben genannte Ansatz erforderlich sein könnte.
Vinzenzweber
Dies ist stark unterbewertet ans, aber Tatsache ist, dass dies die zuverlässigste Lösung ist. Die meisten der oben genannten Antworten funktionieren nicht für WLAN-Netzwerke. Die von @shine_joseph bereitgestellte sieht gut aus, aber die bereitgestellte API ist nicht für den kommerziellen Gebrauch bestimmt.
Gem
Mit Vorsicht verwenden. Ihr Gerät gibt Ihnen einen Standort, auch wenn es nicht vernetzt ist. Der Geocoder gibt jedoch normalerweise eine Null für das Adressarray zurück, wenn WLAN deaktiviert ist, wodurch eine Ausnahme ausgelöst wird, die Sie versuchen / abfangen müssen.
Mike Critchley
17

Hier finden Sie eine Komplettlösung, die auf dem LocationManager und als Ersatz für den TelephonyManager und die Standorte des Netzwerkanbieters basiert. Ich habe die obige Antwort von @Marco W. für den Fallback-Teil verwendet (großartige Antwort als solche!).

Hinweis: Der Code enthält PreferencesManager. Dies ist eine Hilfsklasse, die Daten aus SharedPrefrences speichert und lädt. Ich verwende es, um das Land in S "P zu speichern. Ich erhalte das Land nur, wenn es leer ist. Bei meinem Produkt kümmere ich mich nicht wirklich um alle Randfälle (Benutzer reist ins Ausland und so weiter).

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
quelle
4
Entschuldigung, aber Ihre Antwort muss wirklich neu geschrieben werden. Der Code enthält viele unbrauchbare Codes.
Ichalos
@ichalos oder du hast die Logik nicht verstanden. Bitte geben Sie mir 1 Beispiel für unbenutzten Code in diesem Snippet
Nativ
2
Natürlich habe ich die Logik verstanden und bitte verstehe sie nicht falsch. Ich erwähne, dass PipplApp, PrefernecesManager usw. entfernt worden sein könnten und die angebotene Lösung für die Leser etwas klarer sein könnte.
Ichalos
@ichalos über die PiplApp Ich stimme Ihnen zu 100% zu, ich entferne sie einfach
Nativ
Es gibt country = addresses.get(0).getCountryName();in Ihrem Code, der den vollständigen Namen des Landes in die Variable setzt country. Gleichzeitig geben getCountryBasedOnSimCardOrNetwork(Context context)Sie in der Methode den ISO-Code des Landes zurück. Ich glaube, dass Sie schreiben wollten country = addresses.get(0).getCountryCode();:-)
Firzen
15

Sie können getNetworkCountryIso()von verwendenTelephonyManager , um das Land zu ermitteln, in dem sich das Telefon gerade befindet (obwohl dies in CDMA-Netzwerken anscheinend unzuverlässig ist).

Dave Webb
quelle
Das klingt ziemlich einfach und hat in erster Linie beim Emulator gut funktioniert. Können Sie einfach erklären, warum es in CDMA-Netzwerken unzuverlässig ist?
DonGru
ah okay, ich habe es verstanden - weil die Dokumentation es sagt :)
DonGru
Aufgrund der Anwendung wäre dies nicht die beste Lösung, da sich die Standardeinheit eines Benutzers ändern würde, wenn er ins Ausland reist. Es wäre sinnvoller, eine statische Standardeinheit zu haben, die auf den Gebietsschemaeinstellungen des Telefons basiert und dann natürlich irgendwo in einer Einstellung geändert werden kann.
Stealthcopter
5
String locale = context.getResources().getConfiguration().locale.getCountry(); 

Ist veraltet. Verwenden Sie stattdessen Folgendes:

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
quelle
1
Benötigt es eine Erlaubnis und welches Land zeigt es?
CoolMind
4

Wenn für einige Geräte die Standardsprache anders eingestellt ist (ein Inder kann dann Englisch (US) einstellen)

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

gibt einen falschen Wert. Daher ist diese Methode nicht zuverlässig

Die Methode getNetworkCountryIso () von TelephonyManager funktioniert auch nicht auf Geräten ohne SIM-Karte (WIFI-Tablets).

Wenn ein Gerät keine SIM-Karte hat, können wir die Zeitzone verwenden, um das Land zu ermitteln. Für Länder wie Indien wird diese Methode funktionieren

Beispielcode zur Überprüfung des Landes ist Indien oder nicht (Zeitzonen-ID: Asien / Kalkutta)

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;

    }
}
Spanne
quelle
1
Gute Idee, aber die Zeitzone ist keine länderspezifische Funktion, die Sie kennen, oder? Für alle 15 Grad Meridiane gibt es eine andere Zeitzone usw.
Gunhan
3

Mit GPS mit Längen- und Breitengrad können wir den Ländercode erhalten.

Wenn wir Telefonie verwenden, funktioniert dies nicht, wenn wir keine SIM-Karte verwenden. In der Ländereinstellung wird der Ländercode je nach Sprache falsch angezeigt.

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

Bearbeiten: Verwenden Sie Fused Location Provider , um Längen- und Breitengrade zu aktualisieren und bessere Ergebnisse zu erzielen.

Steve
quelle
Was ist gpsParty ()? Es ist nicht definiert
Nikola C
-2

Ich habe GEOIP db verwendet und eine Funktion erstellt. Sie können diesen Link direkt nutzen 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"}]}

Sie können die Dateien autoload.php und .mmdb von https://dev.maxmind.com/geoip/geoip2/geolite2/ herunterladen.

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
quelle