Android 如何从谷歌地图中的经纬度坐标中获取城市名称?
如果我有一个城镇或地区的经纬度坐标,我如何在谷歌地图中获得城市名称 我尝试使用纬度、经度和国家,但我不知道如何获取城市名称。从对象中,可以调用该方法。它将返回具有方法的对象列表Android 如何从谷歌地图中的经纬度坐标中获取城市名称?,android,google-maps,reverse-geocoding,Android,Google Maps,Reverse Geocoding,如果我有一个城镇或地区的经纬度坐标,我如何在谷歌地图中获得城市名称 我尝试使用纬度、经度和国家,但我不知道如何获取城市名称。从对象中,可以调用该方法。它将返回具有方法的对象列表 Geocoder gcd=new Geocoder(context,Locale.getDefault()); 列表地址=gcd.getFromLocation(lat,lng,1); 如果(地址.size()>0){ System.out.println(addresses.get(0.getLocality());
Geocoder gcd=new Geocoder(context,Locale.getDefault());
列表地址=gcd.getFromLocation(lat,lng,1);
如果(地址.size()>0){
System.out.println(addresses.get(0.getLocality());
}
否则{
//做你的事
}
我正在使用此代码。您还可以使用此选项获取城市和其他有关纬度和经度的详细信息:
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;
}
}
您可以从这个问题中获得更多信息:请尝试下面的代码“希望为您使用完整版”:-
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);
}
}
公共类citysynctask扩展异步任务{
活动法;
双纬度;
双经度;
公共城市SYNCTASK(活动法,双纬度,双经度){
//TODO自动生成的构造函数存根
this.act=act;
这个。纬度=纬度;
这个经度=经度;
}
@凌驾
受保护的字符串doInBackground(字符串…参数){
字符串结果=”;
Geocoder Geocoder=新的地理编码器(act,Locale.getDefault());
试一试{
列表地址=地理编码器.getFromLocation(纬度,
经度,1);
Log.e(“地址”、“-->”+地址);
结果=addresses.get(0.toString();
}捕获(IOE异常){
e、 printStackTrace();
}
返回结果;
}
@凌驾
受保护的void onPostExecute(字符串结果){
//TODO自动生成的方法存根
super.onPostExecute(结果);
}
}
试试这个
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;
List List=geoCoder.getFromLocation(位置
.getLatitude(),location.getLatitude(),1);
if(list!=null&list.size()>0){
地址=list.get(0);
结果=address.getLocation();
返回结果;
私有类匹配NearByLocationTask扩展
异步任务
{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
//显示进度对话框
progressDialog=新建progressDialog(mContext);
progressDialog.setMessage(“加载…”);
progressDialog.setCancelable(真);
progressDialog.show();
}
@凌驾
受保护的Void doInBackground(Void…arg0){
jsonStr=getLocationInfo(纬度、经度).toString();
if(jsonStr!=null){
Log.i(“位置--”,jsonStr);
JSONObject jsonObj;
试一试{
jsonObj=新的JSONObject(jsonStr);
String Status=jsonObj.getString(“Status”);
if(状态相等信号情况(“正常”)){
JSONArray Results=jsonObj.getJSONArray(“结果”);
JSONObject零=结果。getJSONObject(0);
JSONArray地址\ U组件=零
.getJSONArray(“地址组件”);
对于(int i=0;i”,City+);
}
}
}
}
捕获(JSONException e){
e、 printStackTrace();
}
}
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
super.onPostExecute(结果);
//关闭进度对话框
if(progressDialog.isShowing()){
progressDialog.disclose();
}
}
@凌驾
受保护的void onCancelled(){
super.onCancelled();
progressDialog.disclose();
}
}
私有JSONObject getLocationInfo(双lat、双lng){
HttpGet HttpGet=新HttpGet(
"http://maps.googleapis.com/maps/api/geocode/json?latlng="
+lat+”、“+lng+”&传感器=假“;
HttpClient=new DefaultHttpClient();
HttpResponse响应;
StringBuilder StringBuilder=新的StringBuilder();
试一试{
response=client.execute(httpGet);
HttpEntity=response.getEntity();
InputStream=entity.getContent();
int b;
而((b=stream.read())!=-1){
stringBuilder.append((char)b);
}
}捕获(客户端协议例外e){
}捕获(IOE异常){
}
JSONObject JSONObject=新的JSONObject();
试一试{
jsonObject=新的jsonObject(stringBuilder.toString());
}捕获(JSONException e){
e、 printStackTrace();
}
返回jsonObject;
}
如果您有以下列表,可以使用此选项:
Address address = list.get(0);
String cityname = address.getLocality();
我找到了解决这个问题的新方法。在这里,我使用了google http服务来获取基于经度和纬度的位置的总信息。您只需要在url和api密钥中传递经度和纬度(例如:latlng=21.1497409,79.0874797000002&key=your api密钥)。这是我在
ExampleService
类中的get服务
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.alib
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));
}
}
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);
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);
}
}
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
}