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

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

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

【问题讨论】:

    标签: android google-maps reverse-geocoding


    【解决方案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 中看起来很糟糕。
                          猜你喜欢
                          • 1970-01-01
                          • 1970-01-01
                          • 2012-06-24
                          • 1970-01-01
                          • 2012-12-04
                          • 2011-09-26
                          • 1970-01-01
                          • 2012-12-27
                          相关资源
                          最近更新 更多