如何从地址中找到纬度和经度?
Posted
技术标签:
【中文标题】如何从地址中找到纬度和经度?【英文标题】:How can I find the latitude and longitude from address? 【发布时间】:2011-04-04 05:31:32 【问题描述】:我想在 Google 地图中显示某个地址的位置。
如何使用 Google Maps API 获取地址的纬度和经度?
【问题讨论】:
我遇到了同样的问题在这里查看我的解决方案***.com/a/19170557/2621050 【参考方案1】: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
变量保存转换后的地址。
【讨论】:
抛出“java.io.IOException service not available” 您需要正确的权限才能访问该服务。 #GeoPoint
类。而是使用LatLng
。 ***.com/a/27834110/2968401【参考方案2】:
Ud_an 更新 API 的解决方案
注意:LatLng 类是 Google Play 服务的一部分。
强制:
<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;
【讨论】:
谢谢,它对我有用,上面的解决方案不起作用。 实例化地理编码器时,您应该传递上下文地理编码器 coder = new Geocoder(this);或 new Geocoder(getApplicationContext) not getActivity() 如答案所述。 @Quantumdroid 上面的代码是分片写的。否则你是绝对正确的。这是上下文。 美丽干净的解决方案。没有一个答案提到 Geocoder 使用同步访问,因此强烈建议将其放在后台服务中以避免阻塞 UI。 很好的解决方案。输入无效地址/邮政编码时将调用 IOException。您可以使用简单的if(address.size() <1)//show a Toastelse//put rest of code here
来避免该错误【参考方案3】:
如果您想将您的地址放在谷歌地图中,那么使用以下简单方法
Intent searchAddress = new Intent(Intent.ACTION_VIEW,Uri.parse("geo:0,0?q="+address));
startActivity(searchAddress);
或
如果您需要从您的地址获取 lat long,请使用 Google Place Api 关注
创建一个返回 JSONObject 以及 HTTP 调用 响应的方法,如下所示
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;
我希望这对您和其他人有所帮助..!! 谢谢..!!
【讨论】:
很遗憾,此解决方案不适用于某些移动运营商的移动连接:请求总是返回 OVER_QUERY_LIMIT。那些移动运营商使用 NAT 过载,将相同的 IP 分配给许多设备...... @UmbySlipKnot 你能解释更多关于 OVER_QUERY_LIMIT 的信息吗?那是什么?谢谢。【参考方案4】:以下代码适用于 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 的字符串(123 Testing Rd City State zip)。
【讨论】:
【参考方案5】:这是您如何在地图上找到我们点击的位置的纬度和经度。
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;
效果很好。
要获取位置的地址,我们可以使用 geocoder 类。
【讨论】:
【参考方案6】:上面的Kandha问题的答案:
它抛出“java.io.IOException 服务不可用” 我已经授予了这些权限并包含了库...我可以获取地图视图...它在地理编码器上抛出 IOException...
我只是在尝试后添加了一个 catch IOException,它解决了问题
catch(IOException ioEx)
return null;
【讨论】:
【参考方案7】: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();
【讨论】:
【参考方案8】: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();
【讨论】:
那个空检查没有做任何事情。【参考方案9】: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 类。
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
不需要权限。
【讨论】:
【参考方案10】:我知道我在 2021 年的 10 年问题的贡献为时已晚。以下代码是完整的工作代码。
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_
android:layout_
tools:context=".MainActivity">
<TextView
android:layout_
android:layout_
android:text="Enter Address"
android:id="@+id/addressTV"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_alignParentStart="true" />
<EditText
android:layout_
android:layout_
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_
android:layout_
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_
android:layout_
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);
GeocodingLocation.java
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();
【讨论】:
以上是关于如何从地址中找到纬度和经度?的主要内容,如果未能解决你的问题,请参考以下文章