我想在谷歌地图中显示一个地址的位置。
如何使用谷歌地图 API 获取地址的经纬度?
public GeoPoint getLocationFromAddress(String strAddress) { Geocoder coder = new Geocoder(this); List<Address> address; GeoPoint p1 = null; try { address = coder.getFromLocationName(strAddress, 5); if (address == null) { return null; } Address location = address.get(0); location.getLatitude(); location.getLongitude(); p1 = new GeoPoint((double) (location.getLatitude() * 1E6), (double) (location.getLongitude() * 1E6)); return p1; } catch (IOException e) { e.printStackTrace(); } return null; }
strAddress是包含地址的字符串。 address变量保存转换后的地址。
strAddress
address
这样你就可以在地图上找到我们点击的经纬度。
public boolean onTouchEvent(MotionEvent event, MapView mapView) { //---when user lifts his finger--- if (event.getAction() == 1) { GeoPoint p = mapView.getProjection().fromPixels( (int) event.getX(), (int) event.getY()); Toast.makeText(getBaseContext(), p.getLatitudeE6() / 1E6 + "," + p.getLongitudeE6() /1E6 , Toast.LENGTH_SHORT).show(); } return false; }
效果很好。
为了得到位置的地址,我们可以使用地理编码器类。
If you want to place your address in google map then easy way to use following
Intent searchAddress = new Intent(Intent.ACTION_VIEW,Uri.parse("geo:0,0?q="+address)); startActivity(searchAddress);
或者
如果你需要从你的地址得到拉特长,然后使用 Google Place Api以下
创建一个返回具有 HTTP 呼叫响应的 JSONObject的方法,如下所示
public static JSONObject getLocationInfo(String address) { StringBuilder stringBuilder = new StringBuilder(); try { address = address.replaceAll(" ","%20"); HttpPost httppost = new HttpPost("http://maps.google.com/maps/api/geocode/json?address=" + address + "&sensor=false"); HttpClient client = new DefaultHttpClient(); HttpResponse response; stringBuilder = new StringBuilder(); response = client.execute(httppost); 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) { // TODO Auto-generated catch block e.printStackTrace(); } return jsonObject; }
现在将 JSONObject传递给 getLatLong ()方法,如下所示
public static boolean getLatLong(JSONObject jsonObject) { try { longitute = ((JSONArray)jsonObject.get("results")).getJSONObject(0) .getJSONObject("geometry").getJSONObject("location") .getDouble("lng"); latitude = ((JSONArray)jsonObject.get("results")).getJSONObject(0) .getJSONObject("geometry").getJSONObject("location") .getDouble("lat"); } catch (JSONException e) { return false; } return true; }
I hope this helps to you nd others..!! 谢谢!
The following code will work for google apiv2:
public void convertAddress() { if (address != null && !address.isEmpty()) { try { List<Address> addressList = geoCoder.getFromLocationName(address, 1); if (addressList != null && addressList.size() > 0) { double lat = addressList.get(0).getLatitude(); double lng = addressList.get(0).getLongitude(); } } catch (Exception e) { e.printStackTrace(); } // end catch } // end if } // end convertAddress
其中地址是要转换为 LatLng 的 String (123 TestingRd City State zip)。
Kandha 问题的答案如下:
它抛出“ java.io.IOException 服务不可用” 我已经给了那些许可,包括图书馆... 我可以得到地图视图... 它抛出的 IOException 在地理编码器..。
我只是在尝试之后添加了 catch IOException,它就解决了问题
catch(IOException ioEx){ return null; }
更新 API 的 Ud _ an 解决方案
注意 : 拉丁类是 Google Play Services 的一部分。
强制性:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.INTERNET"/>
更新: 如果您有目标 SDK 23及以上,请确保您已经考虑了位置的运行时权限。
public LatLng getLocationFromAddress(Context context,String strAddress) { Geocoder coder = new Geocoder(context); List<Address> address; LatLng p1 = null; try { // May throw an IOException address = coder.getFromLocationName(strAddress, 5); if (address == null) { return null; } Address location = address.get(0); p1 = new LatLng(location.getLatitude(), location.getLongitude() ); } catch (IOException ex) { ex.printStackTrace(); } return p1; }
Geocoder coder = new Geocoder(this); List<Address> addresses; try { addresses = coder.getFromLocationName(address, 5); if (addresses == null) { } Address location = addresses.get(0); double lat = location.getLatitude(); double lng = location.getLongitude(); Log.i("Lat",""+lat); Log.i("Lng",""+lng); LatLng latLng = new LatLng(lat,lng); MarkerOptions markerOptions = new MarkerOptions(); markerOptions.position(latLng); googleMap.addMarker(markerOptions); googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng,12)); } catch (IOException e) { e.printStackTrace(); }
public void goToLocationFromAddress(String strAddress) { //Create coder with Activity context - this Geocoder coder = new Geocoder(this); List<Address> address; try { //Get latLng from String address = coder.getFromLocationName(strAddress, 5); //check for null if (address != null) { //Lets take first possibility from the all possibilities. try { Address location = address.get(0); LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); //Animate and Zoon on that map location mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); mMap.animateCamera(CameraUpdateFactory.zoomTo(15)); } catch (IndexOutOfBoundsException er) { Toast.makeText(this, "Location isn't available", Toast.LENGTH_SHORT).show(); } } } catch (IOException e) { e.printStackTrace(); } }
public LatLang getLatLangFromAddress(String strAddress){ Geocoder coder = new Geocoder(this, Locale.getDefault()); List<Address> address; try { address = coder.getFromLocationName(strAddress,5); if (address == null) { return new LatLang(-10000, -10000); } Address location = address.get(0); return new LatLang(location.getLatitude(), location.getLongitude()); } catch (IOException e) { return new LatLang(-10000, -10000); } }
在本例中,LatLang是一个 pojo 类。
LatLang
不需要 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />许可。
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
我知道我已经来不及回答这个10年前的问题了,在2021年。下面的代码是完整的工作代码。
Activity _ main. xml 的代码:-
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Enter Address" android:id="@+id/addressTV" android:textAppearance="?android:attr/textAppearanceMedium" android:layout_alignParentStart="true" /> <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/addressET" android:layout_alignParentTop="true" android:layout_toEndOf="@+id/addressTV" android:singleLine="true" android:hint="1600 Pennsylvania Ave NW Washington DC 20502" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Show Lat/Long" android:id="@+id/addressButton" android:layout_below="@+id/addressTV" android:layout_toEndOf="@+id/addressTV" android:layout_marginTop="50dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="" android:id="@+id/latLongTV" android:layout_centerVertical="true" android:layout_toEndOf="@+id/addressTV" />
AndroidManifest.xml 给予以下许可:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
MainActivity.java
public class MainActivity extends Activity { Button addressButton; TextView addressTV; TextView latLongTV; EditText addressET; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); addressET = findViewById(R.id.addressET); addressTV = (TextView) findViewById(R.id.addressTV); latLongTV = (TextView) findViewById(R.id.latLongTV); addressButton = (Button) findViewById(R.id.addressButton); addressButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { String address = addressET.getText().toString(); GeocodingLocation locationAddress = new GeocodingLocation(); locationAddress.getAddressFromLocation(address, getApplicationContext(), new GeocoderHandler()); } }); } private class GeocoderHandler extends Handler { @Override public void handleMessage(Message message) { String address; switch (message.what) { case 1: Bundle bundle = message.getData(); address = bundle.getString("address"); break; default: address = null; } latLongTV.setText(address); } }
}
地理编码定位
public class GeocodingLocation { public static void getAddressFromLocation(String locationAddress, Context context, Handler handler) { Thread thread = new Thread() { @Override public void run() { Geocoder geocoder = new Geocoder(context, Locale.getDefault()); String result = null; try { List addressList = geocoder.getFromLocationName(locationAddress,1); if (addressList != null && addressList.size() > 0){ Address address = (Address) addressList.get(0); StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append(address.getLatitude()).append("\n"); stringBuilder.append(address.getLongitude()).append("\n"); result = stringBuilder.toString(); } } catch (IOException e) { e.printStackTrace(); } finally { Message message = Message.obtain(); message.setTarget(handler); if (result != null){ message.what = 1; Bundle bundle = new Bundle(); result = "Address : "+locationAddress+ "\n\n\nLatitude and longitude\n"+result; bundle.putString("address",result); message.setData(bundle); } message.sendToTarget(); } } }; thread.start(); }
yourButton.setOnClickListener { AppUtil.hideSoftKeyboard(this) if (yourEdittext.text.isNotEmpty()) { var location: LatLng? = null if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { val coder = Geocoder(this@WeatherMapActivity) coder.getFromLocationName(yourEdittext.text.toString(), 5,object :Geocoder.GeocodeListener{ override fun onGeocode(addresses: MutableList<Address>) { addresses.forEach { //do your work android 13 Log.d("locationFRR", "onGeocode: ${it.latitude}") Log.d("locationFRR", "onGeocode: ${it.longitude}") location = LatLng(it.latitude, it.longitude) } location?.let { Log.d("locationFRR", "onCreate: ${it.latitude}") Log.d("locationFRR", "onCreate: ${it.longitude}") getWeather(it.latitude.toString(), it.longitude.toString()) } } override fun onError(errorMessage: String?) { super.onError(errorMessage) Log.d("locationFRR", "onError: $errorMessage") Toast.makeText( this@WeatherMapActivity, "City not found", Toast.LENGTH_SHORT ).show() } }) } else { //less than Android 13 //using Coroutine to avoid ANRs GlobalScope.launch(Dispatchers.IO) { location = getLocationFromAddress(yourEdittext.text.toString()) withContext(Dispatchers.Main) { location?.let { Log.d("locationFRR", "onCreate: ${it.latitude}") Log.d("locationFRR", "onCreate: ${it.longitude}") getWeather(it.latitude.toString(), it.longitude.toString()) } ?: run { Toast.makeText( this@WeatherMapActivity, "City not found", Toast.LENGTH_SHORT ).show() } } } } } } private fun getLocationFromAddress(strAddress: String): LatLng? { val coder = Geocoder(this) var p1: LatLng? = null try { val address: MutableList<Address>? = coder.getFromLocationName(strAddress, 5) address?.let { if (it.size > 0) { address[0].let { add -> p1 = LatLng( (add.latitude), (add.longitude) ) } } Log.d("locationFRR", "getLocationFromAddress: $p1") } } catch (e: IOException) { e.printStackTrace() Log.d("locationFRR", "getLocationFromAddress: ${e.message}") } return p1 }