如何从谷歌地图的经纬度坐标中获取城市名称?

Posted

技术标签:

【中文标题】如何从谷歌地图的经纬度坐标中获取城市名称?【英文标题】:How to get city name from latitude and longitude coordinates in Google Maps? 【发布时间】:2011-01-18 18:38:51 【问题描述】:

如果我有城镇或地区的经纬度坐标,如何在 Google 地图中获取城市名称?

我尝试使用纬度、经度和国家,但我不知道如何获得城市名称。

【问题讨论】:

【参考方案1】:

Geocoder 对象,您可以调用getFromLocation(double, double, int) 方法。它将返回具有getLocality() 方法的Address 对象列表。

Geocoder gcd = new Geocoder(context, Locale.getDefault());
List<Address> addresses = gcd.getFromLocation(lat, lng, 1);
if (addresses.size() > 0) 
    System.out.println(addresses.get(0).getLocality());

else 
   // do your stuff

【讨论】:

我收到错误消息“等待服务器响应超时”。我已添加 Internet 权限。还需要别的吗? 有时 getLocality() 返回 null 并且城市名称停留在 mAdminArea 对于美国(和其他一些国家)的地址,使用 getAdminArea() 返回状态 请不要使用地理编码器。它在许多设备上引发异常,需要重新启动才能再次正常工作。 getLocality() 有时会返回 nullgetAdminArea() 给出了加拿大的省或州,而getSubAdminAread() 给出了城市,但这很奇怪,例如“多伦多分部”【参考方案2】:

我正在使用此代码。您也可以通过 this 获取有关纬度和经度的城市和其他详细信息:

public class getReverseGeoCoding 
    private String Address1 = "", Address2 = "", City = "", State = "", Country = "", County = "", PIN = "";
    
    public void getAddress() 
        Address1 = "";
        Address2 = "";
        City = "";
        State = "";
        Country = "";
        County = "";
        PIN = "";
        
        try 
            
            JSONObject jsonObj = parser_Json.getJSONfromURL("http://maps.googleapis.com/maps/api/geocode/json?latlng=" + Global.curLatitude + ","
                    + Global.curLongitude + "&sensor=true&key=YOUR_API_KEY");
            String Status = jsonObj.getString("status");
            if (Status.equalsIgnoreCase("OK")) 
                JSONArray Results = jsonObj.getJSONArray("results");
                JSONObject zero = Results.getJSONObject(0);
                JSONArray address_components = zero.getJSONArray("address_components");
                
                for (int i = 0; i < address_components.length(); i++) 
                    JSONObject zero2 = address_components.getJSONObject(i);
                    String long_name = zero2.getString("long_name");
                    JSONArray mtypes = zero2.getJSONArray("types");
                    String Type = mtypes.getString(0);
                    
                    if (TextUtils.isEmpty(long_name) == false || !long_name.equals(null) || long_name.length() > 0 || long_name != "") 
                        if (Type.equalsIgnoreCase("street_number")) 
                            Address1 = long_name + " ";
                         else if (Type.equalsIgnoreCase("route")) 
                            Address1 = Address1 + long_name;
                         else if (Type.equalsIgnoreCase("sublocality")) 
                            Address2 = long_name;
                         else if (Type.equalsIgnoreCase("locality")) 
                            // Address2 = Address2 + long_name + ", ";
                            City = long_name;
                         else if (Type.equalsIgnoreCase("administrative_area_level_2")) 
                            County = long_name;
                         else if (Type.equalsIgnoreCase("administrative_area_level_1")) 
                            State = long_name;
                         else if (Type.equalsIgnoreCase("country")) 
                            Country = long_name;
                         else if (Type.equalsIgnoreCase("postal_code")) 
                            PIN = long_name;
                        
                    
                    
                    // JSONArray mtypes = zero2.getJSONArray("types");
                    // String Type = mtypes.getString(0);
                    // Log.e(Type,long_name);
                
            
            
         catch (Exception e) 
            e.printStackTrace();
        
        
    
    
    public String getAddress1() 
        return Address1;
        
    
    
    public String getAddress2() 
        return Address2;
        
    
    
    public String getCity() 
        return City;
        
    
    
    public String getState() 
        return State;
        
    
    
    public String getCountry() 
        return Country;
        
    
    
    public String getCounty() 
        return County;
        
    
    
    public String getPIN() 
        return PIN;
        
    
    

For more detail on how to get Google Map Api key

JSON 解析器类

public class parser_Json 
    public static JSONObject getJSONfromURL(String url) 

        // initialize
        InputStream is = null;
        String result = "";
        JSONObject jObject = null;

        // http post
        try 
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost(url);
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity entity = response.getEntity();
            is = entity.getContent();

         catch (Exception e) 
            Log.e("log_tag", "Error in http connection " + e.toString());
        

        // convert response to string
        try 
            BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) 
                sb.append(line + "\n");
            
            is.close();
            result = sb.toString();
         catch (Exception e) 
            Log.e("log_tag", "Error converting result " + e.toString());
        

        // try parse the string to a JSON object
        try 
            jObject = new JSONObject(result);
         catch (JSONException e) 
            Log.e("log_tag", "Error parsing data " + e.toString());
        

        return jObject;
    


您可以从这个问题获得更多信息:Get the particular address using latitude and longitude

【讨论】:

@ErumHannan 你可以在你的服务中这样做 ** new getReverseGeoCoding().getCity(); ** 这将返回您当前的 City 或 lat,long 来自 Global 类。 我使用了你的代码,但它返回一个错误,上面写着 "error_message":"您必须使用 API 密钥来验证对 Google Maps Platform API 的每个请求。有关其他信息,请参阅 http: \/\/g.co\/dev\/maps-no-account","re​​sults":[],"status":"REQUEST_DENIED" 我应该如何解决?【参考方案3】:

试试这个

  List<Address> list = geoCoder.getFromLocation(location
            .getLatitude(), location.getLongitude(), 1);
    if (list != null & list.size() > 0) 
        Address address = list.get(0);
        result = address.getLocality();
        return result;

【讨论】:

【参考方案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;

【讨论】:

这增加了哪些现有答案中没有的内容? @OrangeDog 一个带有 Try Catch 异常的简化方法。所以其他人可以很容易地理解它。【参考方案5】:

试试下面的代码希望对你有用:-

CityAsyncTask cst = new CityAsyncTask(HomeScreenUserLocation.this,
                latitude, longitude);
        cst.execute();

        String lo = null;
        try 
            lo = cst.get().toString();
         catch (InterruptedException e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
         catch (ExecutionException e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
        

AsyncTask

public class CityAsyncTask extends AsyncTask<String, String, String> 
    Activity act;
    double latitude;
    double longitude;

    public CityAsyncTask(Activity act, double latitude, double longitude) 
        // TODO Auto-generated constructor stub
        this.act = act;
        this.latitude = latitude;
        this.longitude = longitude;
    

    @Override
    protected String doInBackground(String... params) 
        String result = "";
        Geocoder geocoder = new Geocoder(act, Locale.getDefault());
        try 
            List<Address> addresses = geocoder.getFromLocation(latitude,
                    longitude, 1);
            Log.e("Addresses", "-->" + addresses);
            result = addresses.get(0).toString();
         catch (IOException e) 
            e.printStackTrace();
        
        return result;
    

    @Override
    protected void onPostExecute(String result) 
        // TODO Auto-generated method stub
        super.onPostExecute(result);

    

【讨论】:

【参考方案6】:
 private class MatchingNearByLocationTask extends
        AsyncTask<Void, Void, Void> 
 

    @Override
    protected void onPreExecute() 
        super.onPreExecute();
        // Showing progress dialog

        progressDialog = new ProgressDialog(mContext);
        progressDialog.setMessage("Loading...");
        progressDialog.setCancelable(true);
        progressDialog.show();

    

    @Override
    protected Void doInBackground(Void... arg0) 

        jsonStr = getLocationInfo(Latitude, Longitude).toString();
        if (jsonStr != null) 
            Log.i("location--??", jsonStr);

            JSONObject jsonObj;
            try 
                jsonObj = new JSONObject(jsonStr);

                String Status = jsonObj.getString("status");
                if (Status.equalsIgnoreCase("OK")) 
                    JSONArray Results = jsonObj.getJSONArray("results");
                    JSONObject zero = Results.getJSONObject(0);
                    JSONArray address_components = zero
                            .getJSONArray("address_components");

                    for (int i = 0; i < address_components.length(); i++) 
                        JSONObject zero2 = address_components
                                .getJSONObject(i);
                        String long_name = zero2.getString("long_name");
                        JSONArray mtypes = zero2.getJSONArray("types");
                        String Type = mtypes.getString(0);
                        if (Type.equalsIgnoreCase("administrative_area_level_2")) 
                            // Address2 = Address2 + long_name + ", ";
                            String City = long_name;
                            Log.d(" CityName --->", City + "");
                        
                    
                

            

            catch (JSONException e) 

                e.printStackTrace();
            

        

        return null;
    

    @Override
    protected void onPostExecute(Void result) 
        super.onPostExecute(result);
        // Dismiss the progress dialog
        if (progressDialog.isShowing()) 
            progressDialog.dismiss();
        

    

    @Override
    protected void onCancelled() 

        super.onCancelled();
        progressDialog.dismiss();

    






private JSONObject getLocationInfo(double lat, double lng) 

    HttpGet httpGet = new HttpGet(
            "http://maps.googleapis.com/maps/api/geocode/json?latlng="
                    + lat + "," + lng + "&sensor=false");
    HttpClient client = new DefaultHttpClient();
    HttpResponse response;
    StringBuilder stringBuilder = new StringBuilder();

    try 
        response = client.execute(httpGet);
        HttpEntity entity = response.getEntity();
        InputStream stream = entity.getContent();
        int b;
        while ((b = stream.read()) != -1) 
            stringBuilder.append((char) b);
        
     catch (ClientProtocolException e) 
     catch (IOException e) 
    

    JSONObject jsonObject = new JSONObject();
    try 
        jsonObject = new JSONObject(stringBuilder.toString());
     catch (JSONException e) 
        e.printStackTrace();
    

    return jsonObject;

【讨论】:

【参考方案7】:

试试这个

var geocoder;
geocoder = new google.maps.Geocoder();
var latlng = new google.maps.LatLng(latitude, longitude);

geocoder.geocode(
'latLng': latlng, 
function(results, status) 
    if (status == google.maps.GeocoderStatus.OK) 
            if (results[0]) 
                var add= results[0].formatted_address ;
                var  value=add.split(",");

                count=value.length;
                country=value[count-1];
                state=value[count-2];
                city=value[count-3];
                alert("city name is: " + city);
            
            else  
                alert("address not found");
            
    
     else 
        alert("Geocoder failed due to: " + status);
    

);

【讨论】:

【参考方案8】:

我找到了解决此问题的新方法。在这里,我使用了 google http 服务来获取基于经度和纬度的位置的总信息。您只需要在 url 和您的 api 密钥中传递纬度和经度(例如:latlng=21.1497409, 79.08747970000002 & key=YOUR API KEY)。这是我在ExampleServiceClass 获得的服务

 getService(url) 

    return this.http.get(url).map((data: any) => data.json())


你可以把它放在任何你想要的地方,然后从你需要位置数据的组件中调用下面的服务

this._exampleService.getService("https://maps.googleapis.com/maps/api/geocode/json?latlng=21.1497409, 79.08747970000002&key=YOUR API KEY").subscribe(getplaceData => 
            var placeDataDest: any;
            placeDataDest = getplaceData;
            console.log("i got place id yeee " + placeDataDest['results'][0]['place_id']);
            console.log("i got place details yeee " + placeDataDest['results']);
        );

类似地找到城市名称....希望你会发现这很有用

【讨论】:

【参考方案9】:

请参考以下代码

 Geocoder geocoder = new Geocoder(this, Locale.getDefault());
     List<Address> addresses = geocoder.getFromLocation(latitude, longitude, 1);
     String cityName = addresses.get(0).getAddressLine(0);
     String stateName = addresses.get(0).getAddressLine(1);
     String countryName = addresses.get(0).getAddressLine(2);

【讨论】:

【参考方案10】:

尝试使用这个 api:

网址 ":http://maps.googleapis.com/maps/api/geocode/json?latlng="+String.valueOf(you_lattitude)+","+String.valueOf(your_longitude)

【讨论】:

【参考方案11】:

如果你有一个列表,你可以使用它:

Address address = list.get(0);
String cityname = address.getLocality();

【讨论】:

【参考方案12】:
 com.alibaba.fastjson.JSONObject jsonObject = com.alibaba.fastjson.JSONObject.parseObject(data);
        if("OK".equals(jsonObject.getString("status")))
            String formatted_address;
            JSONArray results = jsonObject.getJSONArray("results");
            if(results != null && results.size() > 0)
                com.alibaba.fastjson.JSONObject object = results.getJSONObject(0);
                String addressComponents = object.getString("address_components");
                formatted_address = object.getString("formatted_address");
                Log.e("amaya","formatted_address="+formatted_address+"--url="+url);
                if(findCity)
                    boolean finded = false;
                    JSONArray ac = JSONArray.parseArray(addressComponents);
                    if(ac != null && ac.size() > 0)
                        for(int i=0;i<ac.size();i++)
                            com.alibaba.fastjson.JSONObject jo = ac.getJSONObject(i);
                            JSONArray types = jo.getJSONArray("types");
                            if(types != null && types.size() > 0)
                                for(int j=0;j<ac.size();j++)
                                    String string = types.getString(i);
                                    if("administrative_area_level_1".equals(string))
                                        finded = true;
                                        break;
                                    
                                
                            
                            if(finded) break;
                        
                    
                    Log.e("amaya","city="+formatted_address);
                else
                    Log.e("amaya","poiName="+hotspotPoi.getPoi_name()+"--"+hotspotPoi);
                
                if(hotspotPoi != null) hotspotPoi.setPoi_name(formatted_address);
                EventBus.getDefault().post(new AmayaEvent.GeoEvent(hotspotPoi));
            
        

这是一种解析谷歌反馈数据的方法。

【讨论】:

【参考方案13】:

工作代码:

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

                String locality = addresses.get(0).getLocality(); // If any additional address line present than only, check with max available address lines by getMaxAddressLineIndex()
                String subLocality = addresses.get(0).getSubLocality(); // If any additional address line present than only, check with max available address lines by getMaxAddressLineIndex()
                //String address = addresses.get(0).getAddressLine(0); // If any additional address line present than only, check with max available address lines by getMaxAddressLineIndex()
                String address1 = addresses.get(0).getAddressLine(1); // If any additional address line present than only, check with max available address lines by getMaxAddressLineIndex()
                String address2 = addresses.get(0).getAddressLine(2); // 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();

【讨论】:

【参考方案14】:
import org.json.JSONObject

fun parseLocation(response: String): GeoLocation? 

val geoCodes by lazy  doubleArrayOf(0.0, 0.0) 

val jObj = JSONObject(response)
if (jObj.has(KEY_RESULTS)) 

    val jArrResults = jObj.getJSONArray(KEY_RESULTS)
    for (i in 0 until jArrResults.length()) 
        val jObjResult = jArrResults.getJSONObject(i)
        //getting latitude and longitude
        if (jObjResult.has(KEY_GEOMETRY)) 
            val jObjGeometry = jObjResult.getJSONObject(KEY_GEOMETRY)

            if (jObjGeometry.has(KEY_LOCATION)) 
                val jObjLocation = jObjGeometry.getJSONObject(KEY_LOCATION)
                if (jObjLocation.has(KEY_LAT)) 
                    geoCodes[0] = jObjLocation.getDouble(KEY_LAT)
                

                if (jObjLocation.has(KEY_LNG)) 
                    geoCodes[1] = jObjLocation.getDouble(KEY_LNG)
                
            
        

        var administrativeAreaLevel1: String? = null

        //getting city
        if (jObjResult.has(KEY_ADDRESS_COMPONENTS)) 

            val jArrAddressComponents = jObjResult.getJSONArray(KEY_ADDRESS_COMPONENTS)
            for (i in 0 until jArrAddressComponents.length()) 

                val jObjAddressComponents = jArrAddressComponents.getJSONObject(i)
                if (jObjAddressComponents.has(KEY_TYPES)) 

                    val jArrTypes = jObjAddressComponents.getJSONArray(KEY_TYPES)
                    for (j in 0 until jArrTypes.length()) 

                        when (jArrTypes.getString(j)) 

                            VALUE_LOCALITY, VALUE_POSTAL_TOWN -> 
                                return GeoLocation(jObjAddressComponents.getString(KEY_LONG_NAME), *geoCodes)
                            

                            ADMINISTRATIVE_AREA_LEVEL_1 -> 
                                administrativeAreaLevel1 = jObjAddressComponents.getString(KEY_LONG_NAME)
                            

                            else -> 
                            
                        
                    
                
            

            for (i in 0 until jArrAddressComponents.length()) 

                val jObjAddressComponents = jArrAddressComponents.getJSONObject(i)
                if (jObjAddressComponents.has(KEY_TYPES)) 

                    val jArrTypes = jObjAddressComponents.getJSONArray(KEY_TYPES)

                    val typeList = ArrayList<String>()
                    for (j in 0 until jArrTypes.length()) 
                        typeList.add(jArrTypes.getString(j))
                    

                    if (typeList.contains(VALUE_SUBLOCALITY)) 
                        var hasSubLocalityLevel = false
                        typeList.forEach  type ->
                            if (type.contains(VALUE_SUBLOCALITY_LEVEL)) 
                                hasSubLocalityLevel = true

                                if (type == VALUE_SUBLOCALITY_LEVEL_1) 
                                    return GeoLocation(jObjAddressComponents.getString(KEY_LONG_NAME), *geoCodes)
                                
                            
                        
                        if (!hasSubLocalityLevel) 
                            return GeoLocation(jObjAddressComponents.getString(KEY_LONG_NAME), *geoCodes)
                        
                    
                
            
        

        if (geoCodes.isNotEmpty()) return GeoLocation(administrativeAreaLevel1, geoCodes = *geoCodes)
     
   
return null


data class GeoLocation(val latitude: Double = 0.0, val longitude: Double = 0.0, val city: String? = null) : Parcelable 

constructor(city: String? = null, vararg geoCodes: Double) : this(geoCodes[0], geoCodes[1], city)

constructor(source: Parcel) : this(source.readDouble(), source.readDouble(), source.readString())

companion object 
    @JvmField
    val CREATOR = object : Parcelable.Creator<GeoLocation> 

        override fun createFromParcel(source: Parcel) = GeoLocation(source)

        override fun newArray(size: Int): Array<GeoLocation?> = arrayOfNulls(size)
    


override fun writeToParcel(dest: Parcel, flags: Int) 
    dest.writeDouble(latitude)
    dest.writeDouble(longitude)
    dest.writeString(city)


override fun describeContents() = 0

【讨论】:

【参考方案15】:

我在巴西。由于区域细节,有时城市以不同的方式出现。我认为在印度和其他国家也是如此。因此,为了防止错误,我进行了此验证:

private fun getAddress(latLng: LatLng): String 
    // 1
    val geocoder = Geocoder(this)
    val addresses: List<Address>?
    var city = "no"

    try 

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

        if (null != addresses && !addresses.isEmpty())  //prevent from error
             //sometimes the city comes in locality, sometimes in subAdminArea.
            if (addresses[0].locality == null) 

                city = addresses[0].subAdminArea
             else 
                city = addresses[0].locality
            

            
     catch (e: IOException) 
        Log.e("MapsActivity", e.localizedMessage)
    

    return city
    

您还可以检查城市是否返回“否”。如果是这样,则无法获取用户位置。 希望对您有所帮助。

【讨论】:

null != addresses &amp;&amp; !addresses.isEmpty() 在 Kotlin 中看起来很糟糕。

以上是关于如何从谷歌地图的经纬度坐标中获取城市名称?的主要内容,如果未能解决你的问题,请参考以下文章

使用标记从谷歌地图获取纬度/经度坐标

从谷歌静态地图中的像素坐标获取经度/纬度

如何通过输入城市/城镇名称从谷歌地图获取餐厅列表?

试图从谷歌地图获取纬度是通过 Android 中的意图返回 null

从谷歌标记获取纬度/经度

如何从谷歌地图中的经纬度获取地址位置。? [关闭]