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

如果我有一个城镇或地区的经纬度坐标,我如何在谷歌地图中获得城市名称?

我试过用经度和纬度,我得到了国家,但我不知道如何得到城市名称。

217260 次浏览

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
}

我在用这个密码。你也可以使用 this 来获得 city 和其他经纬度的详细信息:

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;
        

}
    

}

获取更多关于如何获取 Google Map Api 密钥的详细信息

JSON PARSER 类

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


}

你可以从这个问题得到更多的信息: 使用经纬度获取特定的地址

尝试下面的代码,希望为您使用充分:-

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


}
}

试试这个

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

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

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

我有新办法来解决这个问题。在这里,我使用 google http 服务来获得基于经纬度的位置信息。你只需要传递 url 经纬度和你的 API 密钥(ex: latlng = 21.1497409,79.0874797000002 & 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']);
});

同样找到城市名称... ... 希望你会发现这个有用

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

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

请参考以下代码

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

尝试使用这个 api:

URL“ : http://maps.googleapis.com/maps/api/geocode/json?latlng=”+ String.valueOf (yout _ lattitude) + “ ,”+ String.valueOf (your _ longtude)

工作守则:

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

试试这个

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

);

只要使用这个方法,并通过你的 lat,long。

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

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

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
}

您还可以检查 city 是否返回“ no”。如果是,则无法获得用户位置。 希望能有帮助。