如何从地址中找到纬度和经度?

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” 您需要正确的权限才能访问该服务。 # 您正在构建哪个 android api 版本的应用程序您需要有可用的 google api 我已经使用 google api 8 构建。检查您的项目中是否存在 google api 文件夹。并在您的清单文件中添加使用库 com.google.android.maps 我已经授予了这些权限并包含库...我可以获取地图视图...它在地理编码器中抛出 IOException... 查看下面@NayAneshGupte 的答案,我认为新库中没有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() &lt;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 类。

&lt;uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /&gt; 不需要权限。

【讨论】:

【参考方案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();

【讨论】:

以上是关于如何从地址中找到纬度和经度?的主要内容,如果未能解决你的问题,请参考以下文章

如何从当前位置找到最近的经纬度?

如何从输入地址获取纬度和经度

如何从android中的纬度和经度获取完整的地址? [复制]

如何从给定的纬度和经度中查找位置名称?

如何从纬度和经度值中找到一个地方的名称

如何使用 ionic 中的 java 脚本从谷歌地图中的地址获取经度和纬度