如何从纬度和经度获取完整地址?

260
我想从Android中的纬度和经度获取以下值:
  1. 街道地址
  2. 城市/州
  3. 邮政编码
  4. 完整地址
如何实现这个功能?

2
你需要使用谷歌的反向API来完成相同的任务。 - Lucifer
3
我的疑问是,这个产品完全免费且没有使用次数限制,还是需要付费? - Tippu Fisal Sheriff
24个回答

592
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


10
getAddressLine() 方法不可靠,因为地址行可能因地理编码详细级别的不同而有所变化。建议使用 getLocality()getCountryName() 方法来获取城市和国家名称。 - akhy
@Shubh - 如果地址行不存在,则返回 NULL。城市名称和国家名称同样适用。如果数据不可用,则返回 NULL。请使用已知的纬度和经度进行测试。 - user370305
12
请尝试此URL:"http://maps.googleapis.com/maps/api/geocode/json?latlng=" + 纬度 + ","+ 经度 + "&sensor=true"。它将返回JSON响应。 - user370305
9
地理编码查找可能需要很长时间。将其作为单独的线程调用会更好。就像Google文档示例中所示。 - Jadamec
1
您不需要指定 Locale.getDefault()new Geocoder(this) 将自动使用默认的语言环境。 - Michel Feinstein
显示剩余11条评论

71

试试这个,我的朋友

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

好的回答。谢谢。 - Stephen
在 for 循环中使用 i <= returnedAddress.getMaxAddressLineIndex() 作为索引,因为索引可能为 0。 - Olaf Achthoven
它给出了 java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 - Aleem Momin

30

城市国家不一定总是出现在地址的第一行和第二行...

示例请看这里

因此,

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

25

从纬度和经度获取地址的最后一个技巧(地理坐标)。您可以简单地通过向Google地图网络服务传递纬度和经度来实现。它是一个GET方法网络服务。

它将返回JSON响应,可以轻松解析以获取地址。其URL为:

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

您可以使用lat,long替换32,75。


这个有文档记录吗? - Derek 朕會功夫
8
现在它已被弃用。 - amit bansode
4
现在没有进行认证,您无法请求该API。 - Giovanka Bisano

11
如果您使用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
}

但是调用此方法时只会返回字符串值。

如果您想获取所有地址,则只需使用此方法/函数。

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

9
在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();
    }
}

6
你想了解地理编码的术语。
简短的故事是你需要做以下事情:
Geocoder geocoder = new Geocoder(this, Locale.getDefault());
List<Address> addresses = geocoder.getFromLocation(lat, lng, 1);

要做更多的事情,您应该在这里阅读有关地理编码器的信息


但是您需要检查您的国家是否支持地理编码。http://elocation.oracle.com/geocoder/gcdemo.jsp - ıllıllı lק ıllıllı

5
  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 "";
    }
}

5

只需使用该方法并传递您的纬度和经度。

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

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

    }

您可以仅使用地址值,因为它会为您提供完整的地址。如果您想要单独的组件,也可以使用其他选项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接