緯度と経度から完全な住所を取得するにはどうすればよいですか?


203

Androidで緯度と経度から次の値を取得したい

  1. 住所
  2. 都市国家
  3. 郵便番号
  4. 完全な住所

これを達成する方法は?


2
同じためにGoogleのReverse APIを使用する必要があります
Lucifer

ただし、住所1に都市が、行2に国が取得されない場合があります... コードはここにあります
chiragkyada

そこで私の答えをチェックしてください。stackoverflow.com/questions/16515682/…–
Debasish Ghosh 2018

回答:


508
Geocoder geocoder;
List<Address> addresses;
geocoder = new Geocoder(this, Locale.getDefault());

addresses = geocoder.getFromLocation(latitude, longitude, 1); // Here 1 represent max location result to returned, by documents it recommended 1 to 5

String address = addresses.get(0).getAddressLine(0); // If any additional address line present than only, check with max available address lines by getMaxAddressLineIndex()
String city = addresses.get(0).getLocality();
String state = addresses.get(0).getAdminArea();
String country = addresses.get(0).getCountryName();
String postalCode = addresses.get(0).getPostalCode();
String knownName = addresses.get(0).getFeatureName(); // Only if available else return NULL

利用可能な詳細については、Android-Location-Addressをご覧ください。


入力した住所は完全な住所ですか、それとも住所ですか?
UMAR 2012

アドレスは..また、私はそれはあなたが必要なすべての詳細が含まれていると思うリストのアドレスを見て、通りの住所である
user370305

9
getAddressLine()住所行はジオコーディングの詳細レベルに応じて異なる可能性があるため、都市/国の取得には信頼できません。使用getLocality()してgetCountryName()代わりに。
akhy 2013

10
@Shubh-このURLを試してください- "http://maps.googleapis.com/maps/api/geocode/json?latlng=" + latitude + ","+ longitude + "&sensor=true"。Jsonレスポンスを返します。
user370305 2014年

8
ジオコーダーの検索には時間がかかる場合があります。別のスレッドと呼ぶ方がずっと良いです。同様にGoogleドキュメントの例
Jadamec

63

これを試してください

 private String getCompleteAddressString(double LATITUDE, double LONGITUDE) {
            String strAdd = "";
            Geocoder geocoder = new Geocoder(this, Locale.getDefault());
            try {
                List<Address> addresses = geocoder.getFromLocation(LATITUDE, LONGITUDE, 1);
                if (addresses != null) {
                    Address returnedAddress = addresses.get(0);
                    StringBuilder strReturnedAddress = new StringBuilder("");

                    for (int i = 0; i <= returnedAddress.getMaxAddressLineIndex(); i++) {
                        strReturnedAddress.append(returnedAddress.getAddressLine(i)).append("\n");
                    }
                    strAdd = strReturnedAddress.toString();
                    Log.w("My Current loction address", strReturnedAddress.toString());
                } else {
                    Log.w("My Current loction address", "No Address returned!");
                }
            } catch (Exception e) {
                e.printStackTrace();
                Log.w("My Current loction address", "Canont get Address!");
            }
            return strAdd;
        }

いいAnwer。ありがとう。
Steve

forループでは、インデックスが0になる可能性があるため、i <= returnedAddress.getMaxAddressLineIndex()を使用します
Olaf Achthoven

java.lang.IndexOutOfBoundsException:Index:0、Size:0
Aleem Momin

25

都市が常に住所1と2に入るとは限りません...

例は こちら

そう、

Geocoder geocoder = new Geocoder(context, Locale.getDefault());

List<Address> addresses  = geocoder.getFromLocation(latitude,longitude, 1);
String address = addresses.get(0).getAddressLine(0);
String city = addresses.get(0).getLocality();
String state = addresses.get(0).getAdminArea();
String zip = addresses.get(0).getPostalCode();
String country = addresses.get(0).getCountryName();

24

Lat-Longからアドレスを取得する最後のトリックがあります(地理座標)ます。単に緯度と経度を渡してgoogle-mapsウェブサービスを押すことができます。これは単にGETメソッドのWebサービスです。

簡単に解析してアドレスを取得できるJSON応答を返します。このURLは次のとおりです。

http://maps.googleapis.com/maps/api/geocode/json?latlng=32,75&sensor=true

32,75を lat、longに置き換えることができます。


これはどこかに文書化されていますか...?
Derek━會功夫2017

5
現在は非推奨です。
amit bansode 2018

8

onCreate()..

LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 30000, 0, this);
    Criteria criteria = new Criteria();
    String bestProvider = locationManager.getBestProvider(criteria, true);
    Location location = locationManager.getLastKnownLocation(bestProvider);

    if (location == null) {
        Toast.makeText(getApplicationContext(), "GPS signal not found",
                3000).show();
    }
    if (location != null) {
        Log.e("location", "location--" + location);
        Log.e("latitude at beginning",
                "@@@@@@@@@@@@@@@" + location.getLatitude());
        onLocationChanged(location);
    }

onLocationChanged()にコードを記述します

@Override
public void onLocationChanged(Location location) {

    Geocoder geocoder;
    List<Address> addresses;
    geocoder = new Geocoder(this, Locale.getDefault());

    latitude = location.getLatitude();
    longitude = location.getLongitude();

    Log.e("latitude", "latitude--" + latitude);

    try {
        Log.e("latitude", "inside latitude--" + latitude);
        addresses = geocoder.getFromLocation(latitude, longitude, 1);

        if (addresses != null && addresses.size() > 0) {
            String address = addresses.get(0).getAddressLine(0); 
            String city = addresses.get(0).getLocality();
            String state = addresses.get(0).getAdminArea();
            String country = addresses.get(0).getCountryName();
            String postalCode = addresses.get(0).getPostalCode();
            String knownName = addresses.get(0).getFeatureName(); 

            locationTxt.setText(address + " " + city + " " + country);
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

4

ジオコーディングという用語を探しています。

短い話はあなたがしなければならないことです:

Geocoder geocoder = new Geocoder(this, Locale.getDefault());
List<Address> addresses = geocoder.getFromLocation(lat, lng, 1);

詳細については、こちらのジオコーダーを参照してください


ただし、国がジオコーディングをサポートしていることを確認する必要があります。 elocation.oracle.com/geocoder/gcdemo.jsp
ıllıllıリットルקıllıllı

4
  public static String getAddressFromLatLng(Context context, LatLng latLng) {
    Geocoder geocoder;
    List<Address> addresses;
    geocoder = new Geocoder(context, Locale.getDefault());
    try {
        addresses = geocoder.getFromLocation(latLng.latitude, latLng.longitude, 1);
        return addresses.get(0).getAddressLine(0);
    } catch (Exception e) {
        e.printStackTrace();
        return "";
    }
}

4

Geocoderクラスを使用して、緯度と経度から完全な住所を取得するのは非常に簡単です。コードサンプルに続いて。お役に立てれば!

 if (l != null) {
        val lat = l.latitude
        val lon = l.longitude

        val geocoder = Geocoder(this, Locale.getDefault())
        val addresses: List<Address>

        addresses = geocoder.getFromLocation(lat, lon, 1) 

        val address = addresses[0].getAddressLine(0)
        val address2 = addresses[0].getAddressLine(1)
        val city = addresses[0].locality
        val state = addresses[0].adminArea
        val country = addresses[0].countryName
        val postalCode = addresses[0].postalCode
        val knownName = addresses[0].featureName

        val message =
                "Emergency situation. Call for help. My location is: " + address + "." + "http://maps.google.com/maps?saddr=" + lat + "," + lon

    }

すべての完全な住所を取得できるため、住所の値のみを使用できます。個別のコンポーネントが必要な場合は、他のコンポーネントも使用できます。


4

このメソッドを使用して、緯度、経度を渡します。

public static void getAddress(Context context, double LATITUDE, double LONGITUDE{
    //Set Address
    try {
        Geocoder geocoder = new Geocoder(context, Locale.getDefault());
        List<Address> addresses = geocoder.getFromLocation(LATITUDE, LONGITUDE, 1);

        if (addresses != null && addresses.size() > 0) {
            String address = addresses.get(0).getAddressLine(0); // If any additional address line present than only, check with max available address lines by getMaxAddressLineIndex()
            String city = addresses.get(0).getLocality();
            String state = addresses.get(0).getAdminArea();
            String country = addresses.get(0).getCountryName();
            String postalCode = addresses.get(0).getPostalCode();
            String knownName = addresses.get(0).getFeatureName(); // Only if available else return NULL
            Log.d(TAG, "getAddress:  address" + address);
            Log.d(TAG, "getAddress:  city" + city);
            Log.d(TAG, "getAddress:  state" + state);
            Log.d(TAG, "getAddress:  postalCode" + postalCode);
            Log.d(TAG, "getAddress:  knownName" + knownName);
        }

    } catch (IOException e) {
        e.printStackTrace();
    }
    return;
}

2
  Geocoder geocoder =new Geocoder(mContext, Locale.getDefault());
 // Get the current location from the input parameter list
  Location loc = params[0];
 // Create a list to contain the result address
  List<Address> addresses = null;
  try {
     addresses = geocoder.getFromLocation(loc.getLatitude(),
             loc.getLongitude(), 10);
 } catch (IOException e1) {
           Log.e("LocationSampleActivity","IO Exception in getFromLocation()");
      e1.printStackTrace();

 } catch (IllegalArgumentException e2) {
 // Error message to post in the log
 String errorString = "Illegal arguments " +
         Double.toString(loc.getLatitude()) +
         " , " +
         Double.toString(loc.getLongitude()) +
         " passed to address service";
 Log.e("LocationSampleActivity", errorString);
 e2.printStackTrace();

 }
 Address address=null;
 String zip=null;
 String city=null;
 String state=null;
 StringBuffer st=new StringBuffer();
 // If the reverse geocode returned an address
 if (addresses != null && addresses.size() > 0) {
 String       add=addresses.get(0).getAddressLine(0)+","
  +addresses.get(0).getSubAdminArea()+","
  +addresses.get(0).getSubLocality();
  city=addresses.get(0).getLocality();
  state=addresses.get(0).getAdminArea();
     // Get the first address
  for(int i=0 ;i<addresses.size();i++){
  address = addresses.get(i);
   if(address.getPostalCode()!=null){
zip=address.getPostalCode();
break;
     }

      }

2

次のコードを使用して簡単にアドレスを取得できます。

import java.io.IOException;
import java.util.List;
import java.util.Locale;

import android.app.AlertDialog;
import android.app.Service;
import android.content.Context;
import android.content.DialogInterface;
import java.io.IOException;
import java.util.List;
import java.util.Locale;

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

public class GPSService extends Service implements LocationListener {

// saving the context for later use
private final Context mContext;

// if GPS is enabled
boolean isGPSEnabled = false;
// if Network is enabled
boolean isNetworkEnabled = false;
// if Location co-ordinates are available using GPS or Network
public boolean isLocationAvailable = false;

// Location and co-ordinates coordinates
Location mLocation;
double mLatitude;
double mLongitude;

// Minimum time fluctuation for next update (in milliseconds)
private static final long TIME = 30000;
// Minimum distance fluctuation for next update (in meters)
private static final long DISTANCE = 20;

// Declaring a Location Manager
protected LocationManager mLocationManager;

public GPSService(Context context) {
    this.mContext = context;
    mLocationManager = (LocationManager) mContext
            .getSystemService(LOCATION_SERVICE);

}

/**
 * Returs the Location
 * 
 * @return Location or null if no location is found
 */
public Location getLocation() {
    try {

        // Getting GPS status
        isGPSEnabled = mLocationManager
                .isProviderEnabled(LocationManager.GPS_PROVIDER);

        // If GPS enabled, get latitude/longitude using GPS Services
        if (isGPSEnabled) {
            mLocationManager.requestLocationUpdates(
                    LocationManager.GPS_PROVIDER, TIME, DISTANCE, this);
            if (mLocationManager != null) {
                mLocation = mLocationManager
                        .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                if (mLocation != null) {
                    mLatitude = mLocation.getLatitude();
                    mLongitude = mLocation.getLongitude();
                    isLocationAvailable = true; // setting a flag that
                                                // location is available
                    return mLocation;
                }
            }
        }

        // If we are reaching this part, it means GPS was not able to fetch
        // any location
        // Getting network status
        isNetworkEnabled = mLocationManager
                .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

        if (isNetworkEnabled) {
            mLocationManager.requestLocationUpdates(
                    LocationManager.NETWORK_PROVIDER, TIME, DISTANCE, this);
            if (mLocationManager != null) {
                mLocation = mLocationManager
                        .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                if (mLocation != null) {
                    mLatitude = mLocation.getLatitude();
                    mLongitude = mLocation.getLongitude();
                    isLocationAvailable = true; // setting a flag that
                                                // location is available
                    return mLocation;
                }
            }
        }
        // If reaching here means, we were not able to get location neither
        // from GPS not Network,
        if (!isGPSEnabled) {
            // so asking user to open GPS
            askUserToOpenGPS();
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
    // if reaching here means, location was not available, so setting the
    // flag as false
    isLocationAvailable = false;
    return null;
}

/**
 * Gives you complete address of the location
 * 
 * @return complete address in String
 */
public String getLocationAddress() {

    if (isLocationAvailable) {

        Geocoder geocoder = new Geocoder(mContext, Locale.getDefault());
        // Get the current location from the input parameter list
        // Create a list to contain the result address
        List<Address> addresses = null;
        try {
            /*
             * Return 1 address.
             */
            addresses = geocoder.getFromLocation(mLatitude, mLongitude, 1);
        } catch (IOException e1) {
            e1.printStackTrace();
            return ("IO Exception trying to get address:" + e1);
        } catch (IllegalArgumentException e2) {
            // Error message to post in the log
            String errorString = "Illegal arguments "
                    + Double.toString(mLatitude) + " , "
                    + Double.toString(mLongitude)
                    + " passed to address service";
            e2.printStackTrace();
            return errorString;
        }
        // If the reverse geocode returned an address
        if (addresses != null && addresses.size() > 0) {
            // Get the first address
            Address address = addresses.get(0);
            /*
             * Format the first line of address (if available), city, and
             * country name.
             */
            String addressText = String.format(
                    "%s, %s, %s",
                    // If there's a street address, add it
                    address.getMaxAddressLineIndex() > 0 ? address
                            .getAddressLine(0) : "",
                    // Locality is usually a city
                    address.getLocality(),
                    // The country of the address
                    address.getCountryName());
            // Return the text
            return addressText;
        } else {
            return "No address found by the service: Note to the developers, If no address is found by google itself, there is nothing you can do about it.";
        }
    } else {
        return "Location Not available";
    }

}



/**
 * get latitude
 * 
 * @return latitude in double
 */
public double getLatitude() {
    if (mLocation != null) {
        mLatitude = mLocation.getLatitude();
    }
    return mLatitude;
}

/**
 * get longitude
 * 
 * @return longitude in double
 */
public double getLongitude() {
    if (mLocation != null) {
        mLongitude = mLocation.getLongitude();
    }
    return mLongitude;
}

/**
 * close GPS to save battery
 */
public void closeGPS() {
    if (mLocationManager != null) {
        mLocationManager.removeUpdates(GPSService.this);
    }
}

/**
 * show settings to open GPS
 */
public void askUserToOpenGPS() {
    AlertDialog.Builder mAlertDialog = new AlertDialog.Builder(mContext);

    // Setting Dialog Title
    mAlertDialog.setTitle("Location not available, Open GPS?")
    .setMessage("Activate GPS to use use location services?")
    .setPositiveButton("Open Settings", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            mContext.startActivity(intent);
            }
        })
        .setNegativeButton("Cancel",new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
                }
            }).show();
}

/** 
 * Updating the location when location changes
 */
@Override
public void onLocationChanged(Location location) {
    mLatitude = location.getLatitude();
    mLongitude = location.getLongitude();
}

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

}

2

クラスを作成できます

public class GeoLocation {

private Context mContext;

private String mLatitude;
private String mLongtitude;
private String mStreet;
private String mHouseNumber;
private String mPostalCode;
private String mCity;

private Location mMarkerLocation;

public GeoLocation (Context context) {
    mContext = context;
}

public String getStreet () {
    return mStreet;
}

public String getHouseNumber () {
    return mHouseNumber;
}

public String getPostalCode () {
    return mPostalCode;
}

public String getCity () {
    return mCity;
}

public String getLatitude () {
    return mLatitude;
}

public String getLongtitude () {
    return mLongtitude;
}

// Lookup address via reverse geolocation
// Call this one
public void lookUpAddress (Location markerLocation) {
    mMarkerLocation = markerLocation;
    if (Geocoder.isPresent()) {
        (new GetAddressTask(mContext)).execute();
    }
}

public class GetAddressTask extends AsyncTask<android.location.Location, Void, String> {

    public GetAddressTask (Context context) {
        super();
        mContext = context;
    }

    @Override
    protected String doInBackground (android.location.Location... params) {
        Geocoder geocoder =
                new Geocoder(mContext, Locale.getDefault());
        android.location.Location location = params[0];

        List<Address> addresses = null;
        try {
            if (mMarkerLocation != null) {
                addresses = geocoder.getFromLocation(mMarkerLocation.getLatitude(),
                        mMarkerLocation.getLongitude(), 1);
            }
        } catch (IOException exception) {
            Log.e("ComplaintLocation",
                    "IO Exception in getFromLocation()", exception);

            return ("IO Exception trying to get address");
        } catch (IllegalArgumentException exception) {
            String errorString = "Illegal arguments " +
                    Double.toString(location.getLatitude()) + " , " +
                    Double.toString(location.getLongitude()) + " passed to address service";
            Log.e("LocationSampleActivity", errorString, exception);

            return errorString;
        }

        if (addresses != null && addresses.size() > 0) {
            Address address = addresses.get(0);

            if (address.getMaxAddressLineIndex() > 0) {
                return String.format(
                        "%s/%s/%s/%s/%s/%s",
                        address.getLatitude(), // 0
                        address.getLongitude(), // 1
                        address.getThoroughfare(), // 2
                        address.getSubThoroughfare(), //3
                        address.getPostalCode(), // 4
                        address.getLocality()); // 5
            } else {
                return String.format(
                        "%s/%s/%s/%s",
                        address.getLatitude(), // 0
                        address.getLongitude(), // 1
                        address.getPostalCode(), // 2
                        address.getLocality()); // 3
            }
        } else return "No address found";
    }

    // Format address string after lookup
    @Override
    protected void onPostExecute (String address) {

        String[] addressFields = TextUtils.split(address, "/");
        Log.d("ADDRESS ARRAY", Arrays.toString(addressFields));

        // Workaround: doInBackground can only return Strings instead of, for example, an
        // Address instance or a String[] directly. To be able to use TextUtils.isEmpty()
        // on fields returned by this method, set each String that currently reads "null" to
        // a null reference
        for (int fieldcnt = 0; fieldcnt < addressFields.length; ++fieldcnt) {
            if (addressFields[fieldcnt].equals("null"))
                addressFields[fieldcnt] = null;
        }

        switch (addressFields.length) {
            case 4:
                mStreet = null;
                mHouseNumber = null;
                mLatitude = addressFields[0];
                mLongtitude = addressFields[1];
                mPostalCode = addressFields[2];
                mCity = addressFields[3];
                break;
            case 6:
                mLatitude = addressFields[0];
                mLongtitude = addressFields[1];
                mStreet = addressFields[2];
                mHouseNumber = addressFields[3];
                mPostalCode = addressFields[4];
                mCity = addressFields[5];
                break;
            default:
                mLatitude = null;
                mLongtitude = null;
                mStreet = null;
                mHouseNumber = null;
                mPostalCode = null;
                mCity = null;
                break;
        }

        Log.d("GeoLocation Street", mStreet);
        Log.d("GeoLocation No.", mHouseNumber);
        Log.d("GeoLocation Postalcode", mPostalCode);
        Log.d("GeoLocation Locality", mCity);
        Log.d("GeoLocation Lat/Lng", "[" + mLatitude + ", " + mLongtitude + 
    "]");
    }
 }
   }

次に、それを使用してインスタンス化します

GeoLocation geoLocation = new GeoLocation(getActivity()); // or (this) if 
called from an activity and not from a fragment
mGeoLocation.lookUpAddress(LOCATION_FROM_MAP);

2

Googleドキュメント(https://developer.android.com/training/location/display-address#java)によって提案されたソリューションをまだ提供している人はいません。正しいソリューションでは、IntentServiceを使用して、逆ジオコーディングのネットワーク呼び出しを行う必要があります。

特定のアクティビティに関連付けられていないため、AsyncTaskではなくインテントサービスが使用されます。すなわち。独自のライフサイクルがあります。IntentServiceは、ジオコーディングが完了すると自動的に停止します。

public class GeocodingService extends IntentService {

    public GeocodingService() {
        super("GeocodingService");
    }


    @Override
    protected void onHandleIntent(@Nullable Intent intent) {
        if (intent == null) {
            return;
        }

        Geocoder geocoder = new Geocoder(this, Locale.getDefault());
        String errorMessage = "";
        BCCDatabase BCCDatabase = skicompanion.skicompanion.storage.BCCDatabase.getInstance(getApplicationContext());

        // Get the location passed to this service through an extra.
        Location location = intent.getParcelableExtra(
                "location");
        long trackID = intent.getLongExtra("trackID", -1);

        List<Address> addresses = null;
        String addressString = "";

        try {
            addresses = geocoder.getFromLocation(
                    location.getLatitude(),
                    location.getLongitude(),
                    1);
        } catch (IOException ioException) {
            // Catch network or other I/O problems.
            errorMessage = "service not available";
            Log.d(Constants.SkiCompanionDebug, errorMessage, ioException);
        } catch (IllegalArgumentException illegalArgumentException) {
            // Catch invalid latitude or longitude values.
            errorMessage = "invalid lat long used";
            Log.d(Constants.SkiCompanionDebug, errorMessage + ". " +
                    "Latitude = " + location.getLatitude() +
                    ", Longitude = " +
                    location.getLongitude(), illegalArgumentException);
        }

        // Handle case where no address was found.
        if (addresses == null || addresses.size()  == 0) {
            if (errorMessage.isEmpty()) {
                errorMessage = "no address found";
                Log.d(Constants.SkiCompanionDebug, errorMessage);
            }
        } else {
            if(addresses.get(0).getLocality() != null){
                addressString += addresses.get(0).getLocality() + ", ";
            }
            if(addresses.get(0).getAdminArea() != null){
                addressString += addresses.get(0).getAdminArea() + ", ";
            }
            if(addresses.get(0).getCountryName() != null){
                addressString += addresses.get(0).getCountryName();
            }
            //updating DB
            BCCDatabase.setTrackLocation(trackID, addressString);

            Log.d(Constants.SkiCompanionDebug, "address found: "+ addressString);
        }
    }
}

同意します。逆ジオコーディングにはIntentServiceを使用する必要があります。
mrisek

2

これを使用してください:D

緯度と経度のjsonデータを取得します。

https://maps.googleapis.com/maps/api/geocode/json?key=AIzaSyAr29XeWWAeWZcrOgjjfs3iSnqkWtAz4No&latlng=2.1812,102.4266&sensor=true

自分の場所で緯度、経度を変更します。

https://maps.googleapis.com/maps/api/geocode/json?key= <\ API_KEY_HERE>&latlng = "latitude"、 "longitude"&sensor = true

<\ API_KEY_HERE>は独自のキーで変更できます。

新しいAPIキーのGoogleコンソールでAPIサービスを有効にする必要があります。

それが役に立てば幸い:D


2

1-onCreateメソッドでLocationManagerおよびLocationListenerの変数を作成します。

2-権限があるかどうかを確認するため、場所の更新を実行し、locationManagerからlastKnownLocationを取得します。それ以外の場合は、権限を要求します

3-メインクラスでonRequestPermissionResultを作成し、権限があるかどうかを確認してから、場所の更新を実行します

4-Geocoder変数を含む個別のメソッドを作成し、場所から座標を配置するリストを作成します。これにより、リストが存在するかどうかを確認し、リストに必要な各情報が存在するかどうかを確認するには、(getThoroughfare = =>番地)、(getLocality ==>市/州)、(getPostalCode ==>郵便番号)、(getAdminArea ==>完全な住所)

5-最後に、(lastKnownLocationパラメータ==>でアプリの実行時にアドレスを表示する)で権限を確認した後、(Locationパラメータ==>でonLocationChangedで場所が変更されたときにアドレスを表示する)でそのメソッドを呼び出します

コード部分:

LocationManager locationManager;

LocationListener locationListener;

@SuppressLint("MissingPermission")
@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    locationManager  = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

    locationListener = new LocationListener() {

        @Override
        public void onLocationChanged(Location location) {

            updateLocation(location);

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

        }
        @Override
        public void onProviderEnabled(String provider) {
        }
        @Override
        public void onProviderDisabled(String provider) {
        }
    };

    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED){

        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);

        Location lastKnownLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

        updateLocation(lastKnownLocation);

    }else {

        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){

        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED){

            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
        }
    }
}


public void updateLocation ( Location location){


    Geocoder geocoder = new Geocoder(getApplicationContext(), Locale.getDefault());
    try {
        List<Address> listAddresses = geocoder.getFromLocation(location.getLatitude(),location.getLongitude(),1);

        String address = "Could not find location :(";

        if (listAddresses != null && listAddresses.size() > 0) {

            if (listAddresses.get(0).getThoroughfare() != null) {

                address = listAddresses.get(0).getThoroughfare() + " ";
            }

            if (listAddresses.get(0).getLocality() != null) {

                address += listAddresses.get(0).getLocality() + " ";
            }

            if (listAddresses.get(0).getPostalCode() != null) {

                address += listAddresses.get(0).getPostalCode() + " ";
            }

            if (listAddresses.get(0).getAdminArea() != null) {

                address += listAddresses.get(0).getAdminArea();
            }
        }

        Log.i("Address",address);

    } catch (Exception e) {

        e.printStackTrace();

    }
}
}

1

ここに画像の説明を入力してください

           double latitude = networkLocation.getLatitude();
           double longitude = networkLocation.getLongitude();
           LocationAddress locationAddress = new LocationAddress();
           locationAddress.getAddressFromLocation(latitude , longitude , getApplicationContext(), new GeocoderHandler());

詳細については、ここをクリックしてください


64
lngとlatから隠された情報を見つけることができます
Mina Gabriel

ハハハハ... ;-P
MAS。ジョン

1

ジオコーダーを使用して以下のコードを使用してみてください:

  Geocoder gcd = new Geocoder(MainActivity.this, Locale.getDefault());
  List<Address> geoAddresses = geoAddresses = gcd.getFromLocation(location.getLatitude(), location.getLongitude(), 1);
  if (geoAddresses.size() > 0) {
      String mUserLocation = "";
      for (int i = 0; i < 4; i++) { //Since it return only four value we declare this as static.
           mUserLocation = mUserLocation + geoAddresses.get(0).getAddressLine(i).replace(",", "") + ", ";
        } 
    }

1
public String getAddress(LatLng latLng) {
    String cAddress = "";
    if (latLng == null) {
        errorMessage = "no_location_data_provided";
        Log.wtf(TAG, errorMessage);
        return "";
    }
    Geocoder geocoder = new Geocoder(this, Locale.getDefault());

    // Address found using the Geocoder.
    List<Address> addresses = null;

    try {
        // Using getFromLocation() returns an array of Addresses for the area immediately
        // surrounding the given latitude and longitude. The results are a best guess and are
        // not guaranteed to be accurate.
        addresses = geocoder.getFromLocation(
                latLng.latitude,
                latLng.longitude,
                // In this sample, we get just a single address.
                1);
    } catch (IOException ioException) {
        // Catch network or other I/O problems.
        errorMessage = "service_not_available";
        Log.e(TAG, errorMessage, ioException);
    } catch (IllegalArgumentException illegalArgumentException) {
        // Catch invalid latitude or longitude values.
        errorMessage = "invalid_lat_long_used";
        Log.e(TAG, errorMessage + ". " +
                "Latitude = " + latLng.latitude +
                ", Longitude = " + latLng.longitude, illegalArgumentException);
    }

    // Handle case where no address was found.
    if (addresses == null || addresses.size() == 0) {
        if (errorMessage.isEmpty()) {
            errorMessage = "no_address_found";
            Log.e(TAG, errorMessage);
        }
    } else {
        Address address = addresses.get(0);
        ArrayList<String> addressFragments = new ArrayList<String>();
        // Fetch the address lines using {@code getAddressLine},
        // join them, and send them to the thread. The {@link android.location.address}
        // class provides other options for fetching address details that you may prefer
        // to use. Here are some examples:
        // getLocality() ("Mountain View", for example)
        // getAdminArea() ("CA", for example)
        // getPostalCode() ("94043", for example)
        // getCountryCode() ("US", for example)
        // getCountryName() ("United States", for example)
        String allAddress = "";
        for (int i = 0; i < address.getMaxAddressLineIndex(); i++) {
            addressFragments.add(address.getAddressLine(i));
            allAddress += address.getAddressLine(i) + " ";
        }
        if (address.getAdminArea() != null) {
            state = address.getAdminArea();
        } else {
            state = "";
        }
        if (address.getLocality() != null) {
            city = address.getLocality();
        } else {
            city = "";
        }
        if (address.getPostalCode() != null) {
            postalCode = address.getPostalCode();
        } else {
            postalCode = "";
        }

        Log.i(TAG, "address_found");
        //driverAddress = TextUtils.join(System.getProperty("line.separator"), addressFragments);
        cAddress = allAddress;
        Log.e("result", cAddress.toString());
    }
    return cAddress;
}

この方法を使用して、適切な完全な住所をジオコーディングできます。


1

Kotlin言語を使用している場合は、このメソッドを作成して住所の場所を直接取得します

private fun getAddress(latLng: LatLng): String {

    val geocoder = Geocoder(this, Locale.getDefault())
    val addresses: List<Address>?
    val address: Address?
    var addressText = ""

        addresses = geocoder.getFromLocation(latLng.latitude, latLng.longitude, 1)

        if (addresses.isNotEmpty()) {
            address = addresses[0]
                addressText = address.getAddressLine(0)
        }else{
            addressText = "its not appear"
        }
    return addressText
}

しかし、このメソッドは、このメソッドを呼び出すとString値を返すだけです

すべてのアドレスを取得したい場合は、このメソッド/関数を使用します

fun getAddress(latLng: LatLng){

val geocoder = Geocoder(this, Locale.getDefault())
val addresses: List<Address>?
val address: Address?
var fulladdress = ""
    addresses = geocoder.getFromLocation(latLng.latitude, latLng.longitude, 1)

    if (addresses.isNotEmpty()) {
        address = addresses[0]
        fulladdress = address.getAddressLine(0) // If any additional address line present than only, check with max available address lines by getMaxAddressLineIndex
        var city = address.getLocality();
        var state = address.getAdminArea();
        var country = address.getCountryName();
        var postalCode = address.getPostalCode();
        var knownName = address.getFeatureName(); // Only if available else return NULL
    }else{
        fulladdress = "Location not found"
    }

}


私が探していたものとまったく同じです。ありがとうAzhar
Raghib Arshi

0

このようにして、緯度と経度から完全な住所を取得できます。

  public class MainActivity extends AppCompatActivity {

         ...

  private Geocoder geocoder;
  private TextView mAddressTxtVu;

         ...


  // I assume that you got latitude and longitude correctly 

  mLatitude  =  20.23232
  mLongitude =  32.999

  String errorMessage = "";

  geocoder = new Geocoder(context, Locale.getDefault());

  List<Address> addresses = null;

  try {
              addresses = geocoder.getFromLocation(
                       mlattitude,
                       mlongitude,
                       1);
      } catch (IOException e) {
              errorMessage = getString(R.string.service_not_available);
              Log.e(TAG, errorMessage, e);
      } catch (IllegalArgumentException illegalArgumentException) {
                        // Catch invalid latitude or longitude values.
              errorMessage = getString(R.string.invalid_lat_long_used);
              Log.e(TAG, errorMessage + ". " + "Latitude = " + mlattitude +", Longitude = " + mlongitude, illegalArgumentException);
      }

      // Handle case where no address was found.
      if (addresses == null || addresses.size() == 0) {
             if (errorMessage.isEmpty()) {
                      errorMessage = getString(R.string.no_address_found);
                      Log.e(TAG, errorMessage);
             }

      } else {
             Address address = addresses.get(0);
             ArrayList<String> addressFragments = new ArrayList<String>();

             // Fetch the address lines using getAddressLine,
             // join them, and send them to the thread.
             for (int i = 0; i <= address.getMaxAddressLineIndex(); i++) {
                      addressFragments.add(address.getAddressLine(i));
             }
             // Log.i(TAG, getString(R.string.address_found));


    mAddressTxtVu.setText(TextUtils.join(System.getProperty("line.separator"),
                                addressFragments));
                    }

0

緯度と経度の値を渡す必要があります。

Geocoder geocoder;
        List<Address> addresses;
        geocoder = new Geocoder(getContext(), Locale.getDefault());

        try {
            addresses = geocoder. getFromLocation(latitude, longitude, 1); // Here 1 represent max location result to returned, by documents it recommended 1 to 5
            String address = addresses.get(0).getAddressLine(0); // If any additional address line present than only, check with max available address lines by getMaxAddressLineIndex()
            String city = addresses.get(0).getLocality();
            String state = addresses.get(0).getAdminArea();
            String country = addresses.get(0).getCountryName();
            String postalCode = addresses.get(0).getPostalCode();
            String knownName = addresses.get(0).getFeatureName(); // Only if available else return NULL

            System.out.println(address+"-------------");
        } catch (IOException e) {
            e.printStackTrace();
        }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.